|
@@ -3,7 +3,6 @@
|
|
|
package overlay2 // import "github.com/docker/docker/daemon/graphdriver/overlay2"
|
|
|
|
|
|
import (
|
|
|
- "bufio"
|
|
|
"context"
|
|
|
"errors"
|
|
|
"fmt"
|
|
@@ -28,7 +27,6 @@ import (
|
|
|
"github.com/docker/docker/pkg/locker"
|
|
|
"github.com/docker/docker/pkg/mount"
|
|
|
"github.com/docker/docker/pkg/parsers"
|
|
|
- "github.com/docker/docker/pkg/parsers/kernel"
|
|
|
"github.com/docker/docker/pkg/system"
|
|
|
units "github.com/docker/go-units"
|
|
|
rsystem "github.com/opencontainers/runc/libcontainer/system"
|
|
@@ -133,16 +131,6 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- if err := supportsOverlay(); err != nil {
|
|
|
- return nil, graphdriver.ErrNotSupported
|
|
|
- }
|
|
|
-
|
|
|
- // require kernel 4.0.0 to ensure multiple lower dirs are supported
|
|
|
- v, err := kernel.GetKernelVersion()
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
// Perform feature detection on /var/lib/docker/overlay2 if it's an existing directory.
|
|
|
// This covers situations where /var/lib/docker/overlay2 is a mount, and on a different
|
|
|
// filesystem than /var/lib/docker.
|
|
@@ -152,40 +140,11 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
|
|
|
testdir = filepath.Dir(testdir)
|
|
|
}
|
|
|
|
|
|
- fsMagic, err := graphdriver.GetFSMagic(testdir)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- if fsName, ok := graphdriver.FsNames[fsMagic]; ok {
|
|
|
- backingFs = fsName
|
|
|
- }
|
|
|
-
|
|
|
- switch fsMagic {
|
|
|
- case graphdriver.FsMagicAufs, graphdriver.FsMagicEcryptfs, graphdriver.FsMagicNfsFs, graphdriver.FsMagicOverlay, graphdriver.FsMagicZfs:
|
|
|
- logger.Errorf("'overlay2' is not supported over %s", backingFs)
|
|
|
- return nil, graphdriver.ErrIncompatibleFS
|
|
|
- case graphdriver.FsMagicBtrfs:
|
|
|
- // Support for OverlayFS on BTRFS was added in kernel 4.7
|
|
|
- // See https://btrfs.wiki.kernel.org/index.php/Changelog
|
|
|
- if kernel.CompareKernelVersion(*v, kernel.VersionInfo{Kernel: 4, Major: 7, Minor: 0}) < 0 {
|
|
|
- if !opts.overrideKernelCheck {
|
|
|
- logger.Errorf("'overlay2' requires kernel 4.7 to use on %s", backingFs)
|
|
|
- return nil, graphdriver.ErrIncompatibleFS
|
|
|
- }
|
|
|
- logger.Warn("Using pre-4.7.0 kernel for overlay2 on btrfs, may require kernel update")
|
|
|
- }
|
|
|
+ if err := overlayutils.SupportsOverlay(testdir, true); err != nil {
|
|
|
+ logger.Error(err)
|
|
|
+ return nil, graphdriver.ErrNotSupported
|
|
|
}
|
|
|
|
|
|
- if kernel.CompareKernelVersion(*v, kernel.VersionInfo{Kernel: 4, Major: 0, Minor: 0}) < 0 {
|
|
|
- if opts.overrideKernelCheck {
|
|
|
- logger.Warn("Using pre-4.0.0 kernel for overlay2, mount failures may require kernel update")
|
|
|
- } else {
|
|
|
- if err := supportsMultipleLowerDir(testdir); err != nil {
|
|
|
- logger.Debugf("Multiple lower dirs not supported: %v", err)
|
|
|
- return nil, graphdriver.ErrNotSupported
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
supportsDType, err := fsutils.SupportsDType(testdir)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
@@ -274,33 +233,6 @@ func parseOptions(options []string) (*overlayOptions, error) {
|
|
|
return o, nil
|
|
|
}
|
|
|
|
|
|
-func supportsOverlay() error {
|
|
|
- // Access overlay filesystem so that Linux loads it (if possible).
|
|
|
- mountTarget, err := ioutil.TempDir("", "supportsOverlay2")
|
|
|
- if err != nil {
|
|
|
- logrus.WithError(err).WithField("storage-driver", "overlay2").Error("could not create temporary directory, so assuming that 'overlay' is not supported")
|
|
|
- return graphdriver.ErrNotSupported
|
|
|
- }
|
|
|
- /* The mounting will fail--after the module has been loaded.*/
|
|
|
- defer os.RemoveAll(mountTarget)
|
|
|
- unix.Mount("overlay", mountTarget, "overlay", 0, "")
|
|
|
-
|
|
|
- f, err := os.Open("/proc/filesystems")
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- defer f.Close()
|
|
|
-
|
|
|
- s := bufio.NewScanner(f)
|
|
|
- for s.Scan() {
|
|
|
- if s.Text() == "nodev\toverlay" {
|
|
|
- return nil
|
|
|
- }
|
|
|
- }
|
|
|
- logger.Error("'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded.")
|
|
|
- return graphdriver.ErrNotSupported
|
|
|
-}
|
|
|
-
|
|
|
func useNaiveDiff(home string) bool {
|
|
|
useNaiveDiffLock.Do(func() {
|
|
|
if err := doesSupportNativeDiff(home); err != nil {
|