无需 root 使用 cgroups v2

无需 root 使用 cgroups v2

在使用 cgroups v2 的操作系统(例如 Ubuntu 22.04)上,我无法在没有 root 权限的情况下“cgexec”任何进程。如果我使用 root 一次来设置特定用户的权限,这种类型的代码过去可以正常工作。我在最近的 Redhat 版本上尝试过,也遇到了类似的问题。

例如:

$ sudo cgcreate -t caj:caj -a caj:caj -g memory:qqq
[sudo] password for caj:
$ cgexec -g memory:qqq ls
cgroup change of group failed
$ sudo cgexec -g memory:qqq ls
<files ...>

答案1

尝试在您的用户切片下创建组(确保使用正确的用户 ID)。

代替:

sudo cgcreate -t caj:caj -a caj:caj -g memory:qqq
cgexec -g memory:qqq ls

尝试:

sudo cgcreate -t caj:caj -a caj:caj -g memory:user.slice/user-1000.slice/[email protected]/qqq
cgexec -g memory:user.slice/user-1000.slice/[email protected]/qqq ls

请注意,从执行程序手册页有一个CGROUP_LOGLEVEL可以设置为环境变量调试,信息,警告或者错误这可能有助于查看特定问题,例如“没有此类文件或目录”或“权限被拒绝”以及关联的文件。

将命令的 CGROUP_LOGLEVEL 设置为 INFO 显示:

CGROUP_LOGLEVEL=INFO cgexec -g memory:qqq ls

Warning: cannot write tid 2482 to /sys/fs/cgroup/qqq/cgroup.procs:Permission denied

您可以通过运行以下命令查看当前 shell 的组:

cat /proc/self/cgroup

0::/user.slice/user-1000.slice/[email protected]/app.slice/app-org.gnome.Terminal.slice/vte-spawn-*.scope

cgroup v2 的内核文档有一个代表团遏制部分解释了为了在组之间移动进程:

写入者必须对源 cgroup 和目标 cgroup 的共同祖先的“cgroup.procs”文件具有写入权限。

并给出以下示例:

例如,假设 cgroup C0 和 C1 已委托给用户 U0,用户 U0 在 C0 下创建了 C00、C01,在 C1 下创建了 C10,如下所示,并且 C0 和 C1 下的所有进程都属于 U0:

在此输入图像描述

假设U0 想要将当前位于C10 中的进程的PID 写入“C00/cgroup.procs”。 U0 对文件有写权限;然而,源 cgroup C10 和目标 cgroup C00 的共同祖先位于委派点之上,并且 U0 对其“cgroup.procs”文件没有写访问权限,因此写入将被 -EACCES 拒绝。

当您运行 cgexec 时,它会尝试将 ls 进程从 user.slice 下的当前组移动到 qqq 组(如上所示)。 IIUC 的共同祖先将是根 cgroup,因此您的权限被拒绝。

使用 CGROUP_LOGLEVEL=DEBUG 可以看到 cgexec 指示

将 pid 3042 移至 cgroup 'qqq'

cgroup 更改组失败

$ CGROUP_LOGLEVEL=DEBUG cgexec -g memory:qqq ls
Found cgroup option cpuset, count 0
Found cgroup option cpu, count 1
Found cgroup option io, count 2
Found cgroup option memory, count 3
Found cgroup option hugetlb, count 4
Found cgroup option pids, count 5
Found cgroup option rdma, count 6
Found cgroup option misc, count 7
My euid and egid is: 1000,1000
Will move pid 3042 to cgroup 'qqq'
Adding controller memory
Warning: cannot write tid 3042 to /sys/fs/cgroup/qqq/cgroup.procs:Permission denied
Warning: cgroup_attach_task_pid failed: 50007
cgroup change of group failed

相关内容