33package overlay2 // import "github.com/docker/docker/daemon/graphdriver/overlay2"
44
55import (
6- "bufio"
76 "context"
87 "errors"
98 "fmt"
109 "io"
1110 "io/ioutil"
1211 "os"
13- "os/exec"
1412 "path"
1513 "path/filepath"
1614 "strconv"
@@ -29,7 +27,6 @@ import (
2927 "github.com/docker/docker/pkg/locker"
3028 "github.com/docker/docker/pkg/mount"
3129 "github.com/docker/docker/pkg/parsers"
32- "github.com/docker/docker/pkg/parsers/kernel"
3330 "github.com/docker/docker/pkg/system"
3431 "github.com/docker/go-units"
3532 rsystem "github.com/opencontainers/runc/libcontainer/system"
@@ -134,16 +131,6 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
134131 return nil , err
135132 }
136133
137- if err := supportsOverlay (); err != nil {
138- return nil , graphdriver .ErrNotSupported
139- }
140-
141- // require kernel 4.0.0 to ensure multiple lower dirs are supported
142- v , err := kernel .GetKernelVersion ()
143- if err != nil {
144- return nil , err
145- }
146-
147134 // Perform feature detection on /var/lib/docker/overlay2 if it's an existing directory.
148135 // This covers situations where /var/lib/docker/overlay2 is a mount, and on a different
149136 // filesystem than /var/lib/docker.
@@ -153,40 +140,11 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
153140 testdir = filepath .Dir (testdir )
154141 }
155142
156- fsMagic , err := graphdriver .GetFSMagic (testdir )
157- if err != nil {
158- return nil , err
159- }
160- if fsName , ok := graphdriver .FsNames [fsMagic ]; ok {
161- backingFs = fsName
162- }
163-
164- switch fsMagic {
165- case graphdriver .FsMagicAufs , graphdriver .FsMagicEcryptfs , graphdriver .FsMagicNfsFs , graphdriver .FsMagicOverlay , graphdriver .FsMagicZfs :
166- logger .Errorf ("'overlay2' is not supported over %s" , backingFs )
167- return nil , graphdriver .ErrIncompatibleFS
168- case graphdriver .FsMagicBtrfs :
169- // Support for OverlayFS on BTRFS was added in kernel 4.7
170- // See https://btrfs.wiki.kernel.org/index.php/Changelog
171- if kernel .CompareKernelVersion (* v , kernel.VersionInfo {Kernel : 4 , Major : 7 , Minor : 0 }) < 0 {
172- if ! opts .overrideKernelCheck {
173- logger .Errorf ("'overlay2' requires kernel 4.7 to use on %s" , backingFs )
174- return nil , graphdriver .ErrIncompatibleFS
175- }
176- logger .Warn ("Using pre-4.7.0 kernel for overlay2 on btrfs, may require kernel update" )
177- }
143+ if err := overlayutils .SupportsOverlay (testdir , true ); err != nil {
144+ logger .Error (err )
145+ return nil , graphdriver .ErrNotSupported
178146 }
179147
180- if kernel .CompareKernelVersion (* v , kernel.VersionInfo {Kernel : 4 , Major : 0 , Minor : 0 }) < 0 {
181- if opts .overrideKernelCheck {
182- logger .Warn ("Using pre-4.0.0 kernel for overlay2, mount failures may require kernel update" )
183- } else {
184- if err := supportsMultipleLowerDir (testdir ); err != nil {
185- logger .Debugf ("Multiple lower dirs not supported: %v" , err )
186- return nil , graphdriver .ErrNotSupported
187- }
188- }
189- }
190148 supportsDType , err := fsutils .SupportsDType (testdir )
191149 if err != nil {
192150 return nil , err
@@ -275,27 +233,6 @@ func parseOptions(options []string) (*overlayOptions, error) {
275233 return o , nil
276234}
277235
278- func supportsOverlay () error {
279- // We can try to modprobe overlay first before looking at
280- // proc/filesystems for when overlay is supported
281- exec .Command ("modprobe" , "overlay" ).Run ()
282-
283- f , err := os .Open ("/proc/filesystems" )
284- if err != nil {
285- return err
286- }
287- defer f .Close ()
288-
289- s := bufio .NewScanner (f )
290- for s .Scan () {
291- if s .Text () == "nodev\t overlay" {
292- return nil
293- }
294- }
295- logger .Error ("'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded." )
296- return graphdriver .ErrNotSupported
297- }
298-
299236func useNaiveDiff (home string ) bool {
300237 useNaiveDiffLock .Do (func () {
301238 if err := doesSupportNativeDiff (home ); err != nil {
0 commit comments