如何在 Ubuntu 的 cgroup-v2 中以非 root 权限在 cgroup.procs 中添加 PID

如何在 Ubuntu 的 cgroup-v2 中以非 root 权限在 cgroup.procs 中添加 PID

我在 中创建了 cgroup /sys/fs/cgroup。我调用了它testGrp,我需要它cgroup由非 root 用户控制,所以我更改了整个 cgroup 目录的所有权

/sys/fs/cgroup$ sudo chown -R normUser testGrp/

我确保里面的所有文件testGrp都归新用户所有normUser,实际上这个用户可以像正常更新一样更改控制器文件,io.max但允许在cgroup.procs.

/sys/fs/cgroup/testGrp$ ll cgroup.procs 
-rw-r--r-- 1 normUser root 0 Aug 21 14:13 cgroup.procs
/sys/fs/cgroup/testGrp$ whoami
normUser 
/sys/fs/cgroup/testGrp$ echo $$ > cgroup.procs 
bash: echo: write error: Permission denied

我以为更改cgroup的所有权可以解决root权限的问题,但实际上并没有帮助。

那么如何在不使用root用户的情况下控制cgroup呢?

答案1

内核使用的规则是,为了将进程从 cgroup A 迁移到 cgroup B,您必须首先拥有将其迁移到所在 cgroup 的权限。共同祖先A 和 B 两者。

如果您使用 systemd 并且您的初始 cgroup 位于 之下/user.slice/user-xxxx.slice/,那么它与您之间最接近的共同祖先/testGrp就是/,而您确实没有权限。

事实上,如果您的发行版使用systemd,那么我真的建议使用systemd的内置cgroup层次结构管理,即创建.slice单元来定义层次结构,然后通过.scope单元将进程移动到.scope单元中systemd-run [--user]

相关内容