Linux Cgroup 写入控制文件,适用于 CPU 但不适用于设备子系统?

Linux Cgroup 写入控制文件,适用于 CPU 但不适用于设备子系统?

我正在尝试为非 root 用户设置 Cgroup玻璃鱼

系统设置:

  • CentOS 7.2.1511
  • 内核3.10.0-327.el7.x86_64
  • Cgroup挂载在/sys/fs/cgroup

应该可以通过发出以下命令为非 root 用户创建 Cgroup:

  1. 对于CPU子系统:

    $ sudo mkdir /sys/fs/cgroup/cpu/${USER}
    $ sudo chown -R ${USER} /sys/fs/cgroup/cpu/${USER}
    
  2. 对于设备子系统:

    $ 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

CPU子系统权限

设备子系统权限

任何帮助将不胜感激,我已经坚持这个问题这么久了,这对我来说没有意义。

答案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>,然后它开始正常工作。

相关内容