11 "github.com/docker/docker/pkg/parsers/kernel"
12 "github.com/docker/docker/pkg/sysinfo"
16 // SysInfo stores information about which features a kernel supports.
17 SysInfo *sysinfo.SysInfo
20 func cpuCfsPeriod() bool {
21 return SysInfo.CPUCfsPeriod
24 func cpuCfsQuota() bool {
25 return SysInfo.CPUCfsQuota
28 func cpuShare() bool {
29 return SysInfo.CPUShares
32 func oomControl() bool {
33 return SysInfo.OomKillDisable
36 func pidsLimit() bool {
37 return SysInfo.PidsLimit
40 func kernelMemorySupport() bool {
41 return SysInfo.KernelMemory
44 func memoryLimitSupport() bool {
45 return SysInfo.MemoryLimit
48 func memoryReservationSupport() bool {
49 return SysInfo.MemoryReservation
52 func swapMemorySupport() bool {
53 return SysInfo.SwapLimit
56 func memorySwappinessSupport() bool {
57 return SysInfo.MemorySwappiness
60 func blkioWeight() bool {
61 return SysInfo.BlkioWeight
64 func cgroupCpuset() bool {
68 func seccompEnabled() bool {
69 return supportsSeccomp && SysInfo.Seccomp
72 func bridgeNfIptables() bool {
73 return !SysInfo.BridgeNFCallIPTablesDisabled
76 func bridgeNfIP6tables() bool {
77 return !SysInfo.BridgeNFCallIP6TablesDisabled
80 func unprivilegedUsernsClone() bool {
81 content, err := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")
82 return err != nil || !strings.Contains(string(content), "0")
85 func ambientCapabilities() bool {
86 content, err := ioutil.ReadFile("/proc/self/status")
87 return err != nil || strings.Contains(string(content), "CapAmb:")
90 func overlayFSSupported() bool {
91 cmd := exec.Command(dockerBinary, "run", "--rm", "busybox", "/bin/sh", "-c", "cat /proc/filesystems")
92 out, err := cmd.CombinedOutput()
96 return bytes.Contains(out, []byte("overlay\n"))
99 func overlay2Supported() bool {
100 if !overlayFSSupported() {
104 daemonV, err := kernel.ParseRelease(testEnv.DaemonKernelVersion())
108 requiredV := kernel.VersionInfo{Kernel: 4}
109 return kernel.CompareKernelVersion(*daemonV, requiredV) > -1
114 SysInfo = sysinfo.New(true)