driver_linux.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // +build linux
  2. package graphdriver
  3. import (
  4. "path/filepath"
  5. "syscall"
  6. "github.com/docker/docker/pkg/mount"
  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. )
  48. var (
  49. // Slice of drivers that should be used in an order
  50. priority = []string{
  51. "aufs",
  52. "btrfs",
  53. "zfs",
  54. "devicemapper",
  55. "overlay",
  56. "vfs",
  57. }
  58. // FsNames maps filesystem id to name of the filesystem.
  59. FsNames = map[FsMagic]string{
  60. FsMagicAufs: "aufs",
  61. FsMagicBtrfs: "btrfs",
  62. FsMagicCramfs: "cramfs",
  63. FsMagicExtfs: "extfs",
  64. FsMagicF2fs: "f2fs",
  65. FsMagicGPFS: "gpfs",
  66. FsMagicJffs2Fs: "jffs2",
  67. FsMagicJfs: "jfs",
  68. FsMagicNfsFs: "nfs",
  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. // GetFSMagic returns the filesystem id given the path.
  81. func GetFSMagic(rootpath string) (FsMagic, error) {
  82. var buf syscall.Statfs_t
  83. if err := syscall.Statfs(filepath.Dir(rootpath), &buf); err != nil {
  84. return 0, err
  85. }
  86. return FsMagic(buf.Type), nil
  87. }
  88. // NewFsChecker returns a checker configured for the provied FsMagic
  89. func NewFsChecker(t FsMagic) Checker {
  90. return &fsChecker{
  91. t: t,
  92. }
  93. }
  94. type fsChecker struct {
  95. t FsMagic
  96. }
  97. func (c *fsChecker) IsMounted(path string) bool {
  98. m, _ := Mounted(c.t, path)
  99. return m
  100. }
  101. // NewDefaultChecker returns a check that parses /proc/mountinfo to check
  102. // if the specified path is mounted.
  103. func NewDefaultChecker() Checker {
  104. return &defaultChecker{}
  105. }
  106. type defaultChecker struct {
  107. }
  108. func (c *defaultChecker) IsMounted(path string) bool {
  109. m, _ := mount.Mounted(path)
  110. return m
  111. }
  112. // Mounted checks if the given path is mounted as the fs type
  113. func Mounted(fsType FsMagic, mountPath string) (bool, error) {
  114. var buf syscall.Statfs_t
  115. if err := syscall.Statfs(mountPath, &buf); err != nil {
  116. return false, err
  117. }
  118. return FsMagic(buf.Type) == fsType, nil
  119. }