driver_linux.go 3.6 KB

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