我正在尝试为非 root 用户设置 Cgroup玻璃鱼。
系统设置:
- CentOS 7.2.1511
- 内核3.10.0-327.el7.x86_64
- Cgroup挂载在/sys/fs/cgroup
应该可以通过发出以下命令为非 root 用户创建 Cgroup:
对于CPU子系统:
$ sudo mkdir /sys/fs/cgroup/cpu/${USER} $ sudo chown -R ${USER} /sys/fs/cgroup/cpu/${USER}
对于设备子系统:
$ sudo mkdir /sys/fs/cgroup/devices/${USER} $ sudo chown -R ${USER} /sys/fs/cgroup/devices/${USER}
这适用于 CPU 子系统。因为我能够将控制文件写入为玻璃鱼,例如 cpu.cfs_period_us 如下所示
echo 43434 > cpu.cfs_period_us
但是写入设备子系统,例如
echo 'a *:* rwm' > devices.deny
结果出现以下错误
bash: echo: write error: Operation not permitted
任何帮助将不胜感激,我已经坚持这个问题这么久了,这对我来说没有意义。
答案1
我遇到过同样的问题。
重现步骤:我更改所有子系统(cpu、cpuset、内存、冻结、设备等)的所有者和组。然后我尝试写入设备 cgroup 的 cgroup.procs 并收到“不允许操作”的消息。相同的命令在所有其他子系统上都可以正常工作。
for i in cpuset nls_cls,net_prio perf_event devices pids cpu,cpuacct memory hugetlb blkio freezer systemd; do
mkdir -p /sys/fs/cgroup/$i/mygroup;
mkdir -p /sys/fs/cgroup/$i/mygroup/subgroup;
chown -R myuser:myuser /sys/fs/cgroup/$i/mygroup;
done
[~]$ echo 1943 > /sys/fs/cgroup/devices/mygroup/subgroup/cgroup.procs
-bash: echo: write error: Operation not permitted
文件 (/sys/fs/cgroup/devices/mygroup/subgroup/cgroup.procs) 的权限为 644,selinux 被禁用,并且 lsattr 显示“读取标志时设备的 ioctl 不适当”(这是正常的)。我尝试将文件的权限更改为 666 但遇到相同的错误。无论如何,该错误不是“权限被拒绝”,而是“不允许操作”。
当以 sudo 身份运行时,该命令工作正常,但重点是将 mygroup 委托给非 sudo 用户。
[解决方案] 写入设备系统中的cgroup.procs的进程必须具有SYS_CAP_ADMIN。该文档非常令人困惑,但您可以在此处的第二段中看到它:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/devices.html#security
“需要 CAP_SYS_ADMIN 来修改白名单或将另一个任务移动到新的 cgroup。(我们可能再次想要更改它)。”
该行不会出现在任何其他子系统文档中,因此它显然仅限于设备子树。我修改了我的实际代码(不是上面描述的 bash 脚本)以获得正确的使用权限sudo setcap cap_sys_admin=+ep <my_bin>
,然后它开始正常工作。