// +build linux package server import ( "os" "path/filepath" "strings" "github.com/kubernetes-incubator/cri-o/lib/sandbox" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/devices" rspec "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/runtime-tools/generate" pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" ) func findCgroupMountpoint(name string) error { // Set up pids limit if pids cgroup is mounted _, err := cgroups.FindCgroupMountpoint(name) return err } func addDevicesPlatform(sb *sandbox.Sandbox, containerConfig *pb.ContainerConfig, specgen *generate.Generator) error { sp := specgen.Spec() if containerConfig.GetLinux().GetSecurityContext().GetPrivileged() { hostDevices, err := devices.HostDevices() if err != nil { return err } for _, hostDevice := range hostDevices { rd := rspec.LinuxDevice{ Path: hostDevice.Path, Type: string(hostDevice.Type), Major: hostDevice.Major, Minor: hostDevice.Minor, UID: &hostDevice.Uid, GID: &hostDevice.Gid, } if hostDevice.Major == 0 && hostDevice.Minor == 0 { // Invalid device, most likely a symbolic link, skip it. continue } specgen.AddDevice(rd) } sp.Linux.Resources.Devices = []rspec.LinuxDeviceCgroup{ { Allow: true, Access: "rwm", }, } return nil } for _, device := range containerConfig.GetDevices() { path, err := resolveSymbolicLink(device.HostPath) if err != nil { return err } dev, err := devices.DeviceFromPath(path, device.Permissions) // if there was no error, return the device if err == nil { rd := rspec.LinuxDevice{ Path: device.ContainerPath, Type: string(dev.Type), Major: dev.Major, Minor: dev.Minor, UID: &dev.Uid, GID: &dev.Gid, } specgen.AddDevice(rd) sp.Linux.Resources.Devices = append(sp.Linux.Resources.Devices, rspec.LinuxDeviceCgroup{ Allow: true, Type: string(dev.Type), Major: &dev.Major, Minor: &dev.Minor, Access: dev.Permissions, }) continue } // if the device is not a device node // try to see if it's a directory holding many devices if err == devices.ErrNotADevice { // check if it is a directory if src, e := os.Stat(path); e == nil && src.IsDir() { // mount the internal devices recursively filepath.Walk(path, func(dpath string, f os.FileInfo, e error) error { childDevice, e := devices.DeviceFromPath(dpath, device.Permissions) if e != nil { // ignore the device return nil } cPath := strings.Replace(dpath, path, device.ContainerPath, 1) rd := rspec.LinuxDevice{ Path: cPath, Type: string(childDevice.Type), Major: childDevice.Major, Minor: childDevice.Minor, UID: &childDevice.Uid, GID: &childDevice.Gid, } specgen.AddDevice(rd) sp.Linux.Resources.Devices = append(sp.Linux.Resources.Devices, rspec.LinuxDeviceCgroup{ Allow: true, Type: string(childDevice.Type), Major: &childDevice.Major, Minor: &childDevice.Minor, Access: childDevice.Permissions, }) return nil }) } } } return nil }