![如何在 Ubuntu 的 cgroup-v2 中以非 root 权限在 cgroup.procs 中添加 PID](https://linux22.com/image/223758/%E5%A6%82%E4%BD%95%E5%9C%A8%20Ubuntu%20%E7%9A%84%20cgroup-v2%20%E4%B8%AD%E4%BB%A5%E9%9D%9E%20root%20%E6%9D%83%E9%99%90%E5%9C%A8%20cgroup.procs%20%E4%B8%AD%E6%B7%BB%E5%8A%A0%20PID.png)
我在 中创建了 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]
。