github.com/michael-k/docker@v1.7.0-rc2/pkg/sysinfo/sysinfo_linux.go (about)

     1  package sysinfo
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path"
     7  	"strconv"
     8  	"strings"
     9  
    10  	"github.com/Sirupsen/logrus"
    11  	"github.com/docker/libcontainer/cgroups"
    12  )
    13  
    14  // New returns a new SysInfo, using the filesystem to detect which features the kernel supports.
    15  func New(quiet bool) *SysInfo {
    16  	sysInfo := &SysInfo{}
    17  	if cgroupMemoryMountpoint, err := cgroups.FindCgroupMountpoint("memory"); err != nil {
    18  		if !quiet {
    19  			logrus.Warnf("Your kernel does not support cgroup memory limit: %v", err)
    20  		}
    21  	} else {
    22  		// If memory cgroup is mounted, MemoryLimit is always enabled.
    23  		sysInfo.MemoryLimit = true
    24  
    25  		_, err1 := ioutil.ReadFile(path.Join(cgroupMemoryMountpoint, "memory.memsw.limit_in_bytes"))
    26  		sysInfo.SwapLimit = err1 == nil
    27  		if !sysInfo.SwapLimit && !quiet {
    28  			logrus.Warn("Your kernel does not support swap memory limit.")
    29  		}
    30  
    31  		_, err = ioutil.ReadFile(path.Join(cgroupMemoryMountpoint, "memory.oom_control"))
    32  		sysInfo.OomKillDisable = err == nil
    33  		if !sysInfo.OomKillDisable && !quiet {
    34  			logrus.Warnf("Your kernel does not support oom control.")
    35  		}
    36  	}
    37  
    38  	if cgroupCpuMountpoint, err := cgroups.FindCgroupMountpoint("cpu"); err != nil {
    39  		if !quiet {
    40  			logrus.Warnf("%v", err)
    41  		}
    42  	} else {
    43  		_, err := ioutil.ReadFile(path.Join(cgroupCpuMountpoint, "cpu.cfs_period_us"))
    44  		sysInfo.CpuCfsPeriod = err == nil
    45  		if !sysInfo.CpuCfsPeriod && !quiet {
    46  			logrus.Warn("Your kernel does not support cgroup cfs period")
    47  		}
    48  		_, err = ioutil.ReadFile(path.Join(cgroupCpuMountpoint, "cpu.cfs_quota_us"))
    49  		sysInfo.CpuCfsQuota = err == nil
    50  		if !sysInfo.CpuCfsQuota && !quiet {
    51  			logrus.Warn("Your kernel does not support cgroup cfs quotas")
    52  		}
    53  	}
    54  
    55  	// Checek if ipv4_forward is disabled.
    56  	if data, err := ioutil.ReadFile("/proc/sys/net/ipv4/ip_forward"); os.IsNotExist(err) {
    57  		sysInfo.IPv4ForwardingDisabled = true
    58  	} else {
    59  		if enabled, _ := strconv.Atoi(strings.TrimSpace(string(data))); enabled == 0 {
    60  			sysInfo.IPv4ForwardingDisabled = true
    61  		} else {
    62  			sysInfo.IPv4ForwardingDisabled = false
    63  		}
    64  	}
    65  
    66  	// Check if AppArmor is supported.
    67  	if _, err := os.Stat("/sys/kernel/security/apparmor"); os.IsNotExist(err) {
    68  		sysInfo.AppArmor = false
    69  	} else {
    70  		sysInfo.AppArmor = true
    71  	}
    72  
    73  	// Check if Devices cgroup is mounted, it is hard requirement for container security.
    74  	if _, err := cgroups.FindCgroupMountpoint("devices"); err != nil {
    75  		logrus.Fatalf("Error mounting devices cgroup: %v", err)
    76  	}
    77  
    78  	return sysInfo
    79  }