github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/moby/pkg/sysinfo/cgroup2_linux.go (about) 1 package sysinfo // import "github.com/docker/docker/pkg/sysinfo" 2 3 import ( 4 "io/ioutil" 5 "path" 6 "strings" 7 8 cgroupsV2 "github.com/containerd/cgroups/v2" 9 "github.com/containerd/containerd/sys" 10 "github.com/sirupsen/logrus" 11 ) 12 13 type infoCollectorV2 func(info *SysInfo, controllers map[string]struct{}, dirPath string) (warnings []string) 14 15 func newV2(quiet bool, opts *opts) *SysInfo { 16 var warnings []string 17 sysInfo := &SysInfo{ 18 CgroupUnified: true, 19 } 20 g := opts.cg2GroupPath 21 if g == "" { 22 g = "/" 23 } 24 m, err := cgroupsV2.LoadManager("/sys/fs/cgroup", g) 25 if err != nil { 26 logrus.Warn(err) 27 } else { 28 controllersM := make(map[string]struct{}) 29 controllers, err := m.Controllers() 30 if err != nil { 31 logrus.Warn(err) 32 } 33 for _, c := range controllers { 34 controllersM[c] = struct{}{} 35 } 36 opsV2 := []infoCollectorV2{ 37 applyMemoryCgroupInfoV2, 38 applyCPUCgroupInfoV2, 39 applyIOCgroupInfoV2, 40 applyCPUSetCgroupInfoV2, 41 applyPIDSCgroupInfoV2, 42 applyDevicesCgroupInfoV2, 43 } 44 dirPath := path.Join("/sys/fs/cgroup", path.Clean(g)) 45 for _, o := range opsV2 { 46 w := o(sysInfo, controllersM, dirPath) 47 warnings = append(warnings, w...) 48 } 49 } 50 51 ops := []infoCollector{ 52 applyNetworkingInfo, 53 applyAppArmorInfo, 54 applySeccompInfo, 55 applyCgroupNsInfo, 56 } 57 for _, o := range ops { 58 w := o(sysInfo, nil) 59 warnings = append(warnings, w...) 60 } 61 if !quiet { 62 for _, w := range warnings { 63 logrus.Warn(w) 64 } 65 } 66 return sysInfo 67 } 68 69 func applyMemoryCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string { 70 var warnings []string 71 if _, ok := controllers["memory"]; !ok { 72 warnings = append(warnings, "Unable to find memory controller") 73 return warnings 74 } 75 76 info.MemoryLimit = true 77 info.SwapLimit = true 78 info.MemoryReservation = true 79 info.OomKillDisable = false 80 info.MemorySwappiness = false 81 info.KernelMemory = false 82 info.KernelMemoryTCP = false 83 return warnings 84 } 85 86 func applyCPUCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string { 87 var warnings []string 88 if _, ok := controllers["cpu"]; !ok { 89 warnings = append(warnings, "Unable to find cpu controller") 90 return warnings 91 } 92 info.CPUShares = true 93 info.CPUCfs = true 94 info.CPURealtime = false 95 return warnings 96 } 97 98 func applyIOCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string { 99 var warnings []string 100 if _, ok := controllers["io"]; !ok { 101 warnings = append(warnings, "Unable to find io controller") 102 return warnings 103 } 104 105 info.BlkioWeight = true 106 info.BlkioWeightDevice = true 107 info.BlkioReadBpsDevice = true 108 info.BlkioWriteBpsDevice = true 109 info.BlkioReadIOpsDevice = true 110 info.BlkioWriteIOpsDevice = true 111 return warnings 112 } 113 114 func applyCPUSetCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, dirPath string) []string { 115 var warnings []string 116 if _, ok := controllers["cpuset"]; !ok { 117 warnings = append(warnings, "Unable to find cpuset controller") 118 return warnings 119 } 120 info.Cpuset = true 121 122 cpus, err := ioutil.ReadFile(path.Join(dirPath, "cpuset.cpus.effective")) 123 if err != nil { 124 return warnings 125 } 126 info.Cpus = strings.TrimSpace(string(cpus)) 127 128 mems, err := ioutil.ReadFile(path.Join(dirPath, "cpuset.mems.effective")) 129 if err != nil { 130 return warnings 131 } 132 info.Mems = strings.TrimSpace(string(mems)) 133 return warnings 134 } 135 136 func applyPIDSCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string { 137 var warnings []string 138 if _, ok := controllers["pids"]; !ok { 139 warnings = append(warnings, "Unable to find pids controller") 140 return warnings 141 } 142 info.PidsLimit = true 143 return warnings 144 } 145 146 func applyDevicesCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string { 147 info.CgroupDevicesEnabled = !sys.RunningInUserNS() 148 return nil 149 }