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  }