Skip to content

Commit 48b1dd0

Browse files
committed
Add backing filesystem info to docker info command where applicable
Fixes #9960 This adds the output of a "Backing Filesystem:" entry to `docker info` to overlay, aufs, and devicemapper graphdrivers. The default list includes a fairly complete list of common filesystem names from linux/include/uapi/linux/magic.h, but if the backing filesystem is not recognized, the code will simply show "<unknown>" Docker-DCO-1.1-Signed-off-by: Phil Estes <[email protected]>
1 parent 3837c08 commit 48b1dd0

File tree

8 files changed

+103
-33
lines changed

8 files changed

+103
-33
lines changed

Diff for: daemon/graphdriver/aufs/aufs.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ var (
4545
graphdriver.FsMagicBtrfs,
4646
graphdriver.FsMagicAufs,
4747
}
48+
backingFs = "<unknown>"
4849
)
4950

5051
func init() {
@@ -60,20 +61,22 @@ type Driver struct {
6061
// New returns a new AUFS driver.
6162
// An error is returned if AUFS is not supported.
6263
func Init(root string, options []string) (graphdriver.Driver, error) {
64+
6365
// Try to load the aufs kernel module
6466
if err := supportsAufs(); err != nil {
6567
return nil, graphdriver.ErrNotSupported
6668
}
6769

68-
rootdir := path.Dir(root)
69-
70-
var buf syscall.Statfs_t
71-
if err := syscall.Statfs(rootdir, &buf); err != nil {
72-
return nil, fmt.Errorf("Couldn't stat the root directory: %s", err)
70+
fsMagic, err := graphdriver.GetFSMagic(root)
71+
if err != nil {
72+
return nil, err
73+
}
74+
if fsName, ok := graphdriver.FsNames[fsMagic]; ok {
75+
backingFs = fsName
7376
}
7477

7578
for _, magic := range incompatibleFsMagic {
76-
if graphdriver.FsMagic(buf.Type) == magic {
79+
if fsMagic == magic {
7780
return nil, graphdriver.ErrIncompatibleFS
7881
}
7982
}
@@ -146,6 +149,7 @@ func (a *Driver) Status() [][2]string {
146149
ids, _ := loadIds(path.Join(a.rootPath(), "layers"))
147150
return [][2]string{
148151
{"Root Dir", a.rootPath()},
152+
{"Backing Filesystem", backingFs},
149153
{"Dirs", fmt.Sprintf("%d", len(ids))},
150154
}
151155
}

Diff for: daemon/graphdriver/aufs/aufs_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ func TestStatus(t *testing.T) {
568568
t.Fatal("Status should not be nil or empty")
569569
}
570570
rootDir := status[0]
571-
dirs := status[1]
571+
dirs := status[2]
572572
if rootDir[0] != "Root Dir" {
573573
t.Fatalf("Expected Root Dir got %s", rootDir[0])
574574
}

Diff for: daemon/graphdriver/devmapper/driver.go

+11
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,17 @@ type Driver struct {
2929
home string
3030
}
3131

32+
var backingFs = "<unknown>"
33+
3234
func Init(home string, options []string) (graphdriver.Driver, error) {
35+
fsMagic, err := graphdriver.GetFSMagic(home)
36+
if err != nil {
37+
return nil, err
38+
}
39+
if fsName, ok := graphdriver.FsNames[fsMagic]; ok {
40+
backingFs = fsName
41+
}
42+
3343
deviceSet, err := NewDeviceSet(home, true, options)
3444
if err != nil {
3545
return nil, err
@@ -57,6 +67,7 @@ func (d *Driver) Status() [][2]string {
5767
status := [][2]string{
5868
{"Pool Name", s.PoolName},
5969
{"Pool Blocksize", fmt.Sprintf("%s", units.HumanSize(float64(s.SectorSize)))},
70+
{"Backing Filesystem", backingFs},
6071
{"Data file", s.DataFile},
6172
{"Metadata file", s.MetadataFile},
6273
{"Data Space Used", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Used)))},

Diff for: daemon/graphdriver/driver.go

+46-21
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,52 @@ import (
1414
type FsMagic uint32
1515

1616
const (
17-
FsMagicBtrfs = FsMagic(0x9123683E)
18-
FsMagicAufs = FsMagic(0x61756673)
17+
FsMagicBtrfs = FsMagic(0x9123683E)
18+
FsMagicAufs = FsMagic(0x61756673)
19+
FsMagicExtfs = FsMagic(0x0000EF53)
20+
FsMagicCramfs = FsMagic(0x28cd3d45)
21+
FsMagicRamFs = FsMagic(0x858458f6)
22+
FsMagicTmpFs = FsMagic(0x01021994)
23+
FsMagicSquashFs = FsMagic(0x73717368)
24+
FsMagicNfsFs = FsMagic(0x00006969)
25+
FsMagicReiserFs = FsMagic(0x52654973)
26+
FsMagicSmbFs = FsMagic(0x0000517B)
27+
FsMagicJffs2Fs = FsMagic(0x000072b6)
28+
FsMagicUnsupported = FsMagic(0x00000000)
29+
)
30+
31+
var (
32+
DefaultDriver string
33+
// All registred drivers
34+
drivers map[string]InitFunc
35+
// Slice of drivers that should be used in an order
36+
priority = []string{
37+
"aufs",
38+
"btrfs",
39+
"devicemapper",
40+
"vfs",
41+
// experimental, has to be enabled manually for now
42+
"overlay",
43+
}
44+
45+
ErrNotSupported = errors.New("driver not supported")
46+
ErrPrerequisites = errors.New("prerequisites for driver not satisfied (wrong filesystem?)")
47+
ErrIncompatibleFS = fmt.Errorf("backing file system is unsupported for this graph driver")
48+
49+
FsNames = map[FsMagic]string{
50+
FsMagicAufs: "aufs",
51+
FsMagicBtrfs: "btrfs",
52+
FsMagicExtfs: "extfs",
53+
FsMagicCramfs: "cramfs",
54+
FsMagicRamFs: "ramfs",
55+
FsMagicTmpFs: "tmpfs",
56+
FsMagicSquashFs: "squashfs",
57+
FsMagicNfsFs: "nfs",
58+
FsMagicReiserFs: "reiserfs",
59+
FsMagicSmbFs: "smb",
60+
FsMagicJffs2Fs: "jffs2",
61+
FsMagicUnsupported: "unsupported",
62+
}
1963
)
2064

2165
type InitFunc func(root string, options []string) (Driver, error)
@@ -72,25 +116,6 @@ type Driver interface {
72116
DiffSize(id, parent string) (size int64, err error)
73117
}
74118

75-
var (
76-
DefaultDriver string
77-
// All registred drivers
78-
drivers map[string]InitFunc
79-
// Slice of drivers that should be used in an order
80-
priority = []string{
81-
"aufs",
82-
"btrfs",
83-
"devicemapper",
84-
"vfs",
85-
// experimental, has to be enabled manually for now
86-
"overlay",
87-
}
88-
89-
ErrNotSupported = errors.New("driver not supported")
90-
ErrPrerequisites = errors.New("prerequisites for driver not satisfied (wrong filesystem?)")
91-
ErrIncompatibleFS = fmt.Errorf("backing file system is unsupported for this graph driver")
92-
)
93-
94119
func init() {
95120
drivers = make(map[string]InitFunc)
96121
}

Diff for: daemon/graphdriver/driver_linux.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package graphdriver
2+
3+
import (
4+
"path"
5+
"syscall"
6+
)
7+
8+
func GetFSMagic(rootpath string) (FsMagic, error) {
9+
var buf syscall.Statfs_t
10+
if err := syscall.Statfs(path.Dir(rootpath), &buf); err != nil {
11+
return 0, err
12+
}
13+
return FsMagic(buf.Type), nil
14+
}

Diff for: daemon/graphdriver/driver_unsupported.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// +build !linux
2+
3+
package graphdriver
4+
5+
func GetFSMagic(rootpath string) (FsMagic, error) {
6+
return FsMagicUnsupported, nil
7+
}

Diff for: daemon/graphdriver/overlay/overlay.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -90,22 +90,28 @@ type Driver struct {
9090
active map[string]*ActiveMount
9191
}
9292

93+
var backingFs = "<unknown>"
94+
9395
func init() {
9496
graphdriver.Register("overlay", Init)
9597
}
9698

9799
func Init(home string, options []string) (graphdriver.Driver, error) {
100+
98101
if err := supportsOverlay(); err != nil {
99102
return nil, graphdriver.ErrNotSupported
100103
}
101104

102-
// check if they are running over btrfs
103-
var buf syscall.Statfs_t
104-
if err := syscall.Statfs(path.Dir(home), &buf); err != nil {
105+
fsMagic, err := graphdriver.GetFSMagic(home)
106+
if err != nil {
105107
return nil, err
106108
}
109+
if fsName, ok := graphdriver.FsNames[fsMagic]; ok {
110+
backingFs = fsName
111+
}
107112

108-
switch graphdriver.FsMagic(buf.Type) {
113+
// check if they are running over btrfs or aufs
114+
switch fsMagic {
109115
case graphdriver.FsMagicBtrfs:
110116
log.Error("'overlay' is not supported over btrfs.")
111117
return nil, graphdriver.ErrIncompatibleFS
@@ -153,7 +159,9 @@ func (d *Driver) String() string {
153159
}
154160

155161
func (d *Driver) Status() [][2]string {
156-
return nil
162+
return [][2]string{
163+
{"Backing Filesystem", backingFs},
164+
}
157165
}
158166

159167
func (d *Driver) Cleanup() error {

Diff for: docs/sources/reference/commandline/cli.md

+1
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,7 @@ For example:
11621162
Images: 52
11631163
Storage Driver: aufs
11641164
Root Dir: /var/lib/docker/aufs
1165+
Backing Filesystem: extfs
11651166
Dirs: 545
11661167
Execution Driver: native-0.2
11671168
Kernel Version: 3.13.0-24-generic

0 commit comments

Comments
 (0)