写点什么

Cgroup devices 子系统

  • 2022 年 7 月 08 日
  • 本文字数:1896 字

    阅读完需:约 6 分钟

Cgroup devices子系统

本文是一系列对 cgroup 说明的文档,已期望说明 cgroup 子系统涉及的所有子系统,本文只对 CpusetGroup 进行说明,本文的目录如下


  1. 什么是 cgroup devices ?

  2. cgroup devices 在运行时中是如何实现的 ?

1 什么是 cgroup devices ?

cgroup devices 子系统又称为 Device Whitelist Controller,通过为每个 cgroup 维护一个设备访问权限管理,控制进程对设备文件读写访问权限以及设备文件创建。


一个 cgroup 通常关联一个设备白名单,这个白名单每一条数据由 4 个属性构成


type:代表设备类型,a 代表所有类型设备,c 代表字符设备, b 代表块设备


major: 代表设备主要版本号


minor:代表设备次要版本号


access:r 代表读取,w 代表写入,m 带表在/dev 下创建字符、块设备


以使用为例,使用 linux cpuset 提供的文件系统方式为例


$ cd /sys/fs/cgroup/device$ mkdir test$ cd test$ ls## 允许对1:3的字符设备进行创建和读取$ echo 'c 1:3 mr' > /sys/fs/cgroup/test/devices.allow## 移除test所有的设备权限,a代表'a *:* rwm'$ echo a > /sys/fs/cgroup/test/devices.deny## 添加test所有的设备权限,a代表'a *:* rwm'$ echo a > /sys/fs/cgroup/test/devices.allow
复制代码

2 cgroup devices 在运行时中是如何实现的 ?

目前的常见的容器技术 docker 底层其实是 runc 的调用实现,



runc 对设备的限制正是通过 cgroup 来实现的,以容器运行时中 runc 中的设置 devices 权限逻辑为列:


  1. 查看是否为需要跳过的设备,不跳过进入 2

  2. 写入 cgroup.procs 文件 pid(pid=3179850),写入 pid 文件内容。

  3. 获取 config 文件对设备对控制权限,生成每个设备一份最小配置文件


  // Compute the minimal set of transition rules needed to achieve the  // requested state.  transitionRules, err := current.Transition(target)
复制代码


  1. 在 devices.deny 或者 devices.allow 写入设备控制权限


相应的,查看对应的日志以及文件


[debug] write cgroup proc, dir=/sys/fs/cgroup/devices/user.slice/a, CgroupProcesses=cgroup.procs, pid=3179850
[node test]# cat /sys/fs/cgroup/devices/user.slice/a/cgroup.procs 3179853
path=/sys/fs/cgroup/devices/user.slice/a, transimiet rule =[0xc000380f00 0xc000380fc0 0xc000380ff0 0xc000381020 0xc000381050 0xc000381080 0xc0003810b0 0xc0003810e0 0xc000381110 0xc000381140 0xc000381170 0xc0003811a0]path=/sys/fs/cgroup/devices/user.slice/a, file=devices.deny, transitionRules=&{Type:97 Major:-1 Minor:-1 Permissions:rwm Allow:false}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:98 Major:-1 Minor:-1 Permissions:m Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:-1 Minor:-1 Permissions:m Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:1 Minor:3 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:1 Minor:5 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:1 Minor:7 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:1 Minor:8 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:1 Minor:9 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:5 Minor:0 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:5 Minor:2 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:10 Minor:200 Permissions:rwm Allow:true}path=/sys/fs/cgroup/devices/user.slice/a, file=devices.allow, transitionRules=&{Type:99 Major:136 Minor:-1 Permissions:rwm Allow:true}
复制代码


运行时中对应的文件目录为/sys/fs/cgroup/devices/user.slice


docker 运行时有时会带上-v /dev:/dev,意思是映射主机所有的设备。

参考文献

https://www.kernel.org/doc/Documentation/cgroup-v1/devices.txt

https://www.slideshare.net/Docker/container-performance-analysis-brendan-gregg-netflix

发布于: 刚刚阅读数: 7
用户头像

自顶向下 2020.11.01 加入

还未添加个人简介

评论

发布
暂无评论
Cgroup devices子系统_总想做点什么_InfoQ写作社区