github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/daemon/graphdriver/driver_linux.go (about)

     1  package graphdriver // import "github.com/docker/docker/daemon/graphdriver"
     2  
     3  import (
     4  	"github.com/moby/sys/mountinfo"
     5  	"golang.org/x/sys/unix"
     6  )
     7  
     8  const (
     9  	// FsMagicAufs filesystem id for Aufs
    10  	FsMagicAufs = FsMagic(0x61756673)
    11  	// FsMagicBtrfs filesystem id for Btrfs
    12  	FsMagicBtrfs = FsMagic(0x9123683E)
    13  	// FsMagicCramfs filesystem id for Cramfs
    14  	FsMagicCramfs = FsMagic(0x28cd3d45)
    15  	// FsMagicEcryptfs filesystem id for eCryptfs
    16  	FsMagicEcryptfs = FsMagic(0xf15f)
    17  	// FsMagicExtfs filesystem id for Extfs
    18  	FsMagicExtfs = FsMagic(0x0000EF53)
    19  	// FsMagicF2fs filesystem id for F2fs
    20  	FsMagicF2fs = FsMagic(0xF2F52010)
    21  	// FsMagicGPFS filesystem id for GPFS
    22  	FsMagicGPFS = FsMagic(0x47504653)
    23  	// FsMagicJffs2Fs filesystem if for Jffs2Fs
    24  	FsMagicJffs2Fs = FsMagic(0x000072b6)
    25  	// FsMagicJfs filesystem id for Jfs
    26  	FsMagicJfs = FsMagic(0x3153464a)
    27  	// FsMagicNfsFs filesystem id for NfsFs
    28  	FsMagicNfsFs = FsMagic(0x00006969)
    29  	// FsMagicRAMFs filesystem id for RamFs
    30  	FsMagicRAMFs = FsMagic(0x858458f6)
    31  	// FsMagicReiserFs filesystem id for ReiserFs
    32  	FsMagicReiserFs = FsMagic(0x52654973)
    33  	// FsMagicSmbFs filesystem id for SmbFs
    34  	FsMagicSmbFs = FsMagic(0x0000517B)
    35  	// FsMagicSquashFs filesystem id for SquashFs
    36  	FsMagicSquashFs = FsMagic(0x73717368)
    37  	// FsMagicTmpFs filesystem id for TmpFs
    38  	FsMagicTmpFs = FsMagic(0x01021994)
    39  	// FsMagicVxFS filesystem id for VxFs
    40  	FsMagicVxFS = FsMagic(0xa501fcf5)
    41  	// FsMagicXfs filesystem id for Xfs
    42  	FsMagicXfs = FsMagic(0x58465342)
    43  	// FsMagicZfs filesystem id for Zfs
    44  	FsMagicZfs = FsMagic(0x2fc12fc1)
    45  	// FsMagicOverlay filesystem id for overlay
    46  	FsMagicOverlay = FsMagic(0x794C7630)
    47  	// FsMagicFUSE filesystem id for FUSE
    48  	FsMagicFUSE = FsMagic(0x65735546)
    49  )
    50  
    51  var (
    52  	// List of drivers that should be used in an order
    53  	priority = "btrfs,zfs,overlay2,fuse-overlayfs,aufs,overlay,devicemapper,vfs"
    54  
    55  	// FsNames maps filesystem id to name of the filesystem.
    56  	FsNames = map[FsMagic]string{
    57  		FsMagicAufs:        "aufs",
    58  		FsMagicBtrfs:       "btrfs",
    59  		FsMagicCramfs:      "cramfs",
    60  		FsMagicEcryptfs:    "ecryptfs",
    61  		FsMagicExtfs:       "extfs",
    62  		FsMagicF2fs:        "f2fs",
    63  		FsMagicFUSE:        "fuse",
    64  		FsMagicGPFS:        "gpfs",
    65  		FsMagicJffs2Fs:     "jffs2",
    66  		FsMagicJfs:         "jfs",
    67  		FsMagicNfsFs:       "nfs",
    68  		FsMagicOverlay:     "overlayfs",
    69  		FsMagicRAMFs:       "ramfs",
    70  		FsMagicReiserFs:    "reiserfs",
    71  		FsMagicSmbFs:       "smb",
    72  		FsMagicSquashFs:    "squashfs",
    73  		FsMagicTmpFs:       "tmpfs",
    74  		FsMagicUnsupported: "unsupported",
    75  		FsMagicVxFS:        "vxfs",
    76  		FsMagicXfs:         "xfs",
    77  		FsMagicZfs:         "zfs",
    78  	}
    79  )
    80  
    81  // GetFSMagic returns the filesystem id given the path.
    82  func GetFSMagic(rootpath string) (FsMagic, error) {
    83  	var buf unix.Statfs_t
    84  	if err := unix.Statfs(rootpath, &buf); err != nil {
    85  		return 0, err
    86  	}
    87  	return FsMagic(buf.Type), nil
    88  }
    89  
    90  // NewFsChecker returns a checker configured for the provided FsMagic
    91  func NewFsChecker(t FsMagic) Checker {
    92  	return &fsChecker{
    93  		t: t,
    94  	}
    95  }
    96  
    97  type fsChecker struct {
    98  	t FsMagic
    99  }
   100  
   101  func (c *fsChecker) IsMounted(path string) bool {
   102  	m, _ := Mounted(c.t, path)
   103  	return m
   104  }
   105  
   106  // NewDefaultChecker returns a check that parses /proc/mountinfo to check
   107  // if the specified path is mounted.
   108  func NewDefaultChecker() Checker {
   109  	return &defaultChecker{}
   110  }
   111  
   112  type defaultChecker struct {
   113  }
   114  
   115  func (c *defaultChecker) IsMounted(path string) bool {
   116  	m, _ := mountinfo.Mounted(path)
   117  	return m
   118  }
   119  
   120  // Mounted checks if the given path is mounted as the fs type
   121  func Mounted(fsType FsMagic, mountPath string) (bool, error) {
   122  	var buf unix.Statfs_t
   123  	if err := unix.Statfs(mountPath, &buf); err != nil {
   124  		if err == unix.ENOENT { // not exist, thus not mounted
   125  			err = nil
   126  		}
   127  		return false, err
   128  	}
   129  	return FsMagic(buf.Type) == fsType, nil
   130  }