如何创建和使用cgroups作为非 root 用户?
例如,我可以完全以非 root 用户身份执行下列操作:
- 创建可以访问一个 CPU 的 cgroup
- 在该 cgroup 中创建新进程
?
我首先问这里但我没有收到完整的答复。我也在 stackoverflow 上提问,但该问题因偏离主题而被关闭。
答案1
普通用户无法执行此操作。但您可以以 root 身份设置 cgroup,并使其可由您的用户配置。
如果您尚未通过 systemd 安装默认的 cgroups 控制器:
$ sudo mount -t tmpfs cgroup_root /sys/fs/cgroup
$ sudo mkdir /sys/fs/cgroup/cpuset
$ sudo mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset
创建一个 cgroup:
$ sudo mkdir /sys/fs/cgroup/cpuset/${USER}
$ sudo chown -R ${USER} /sys/fs/cgroup/cpuset/${USER}
您现在可以以普通用户身份修改 cgroup 的配置:
$ echo 0-3 > /sys/fs/cgroup/cpuset/${USER}/cpuset.cpus
向该组添加一个进程:
$ ./my_task &
$ echo $! > /sys/fs/cgroup/cpuset/${USER}/tasks
或者创建一个子组:
$ mkdir /sys/fs/cgroup/cpuset/${USER}/subgroup
$ echo 0-1 > /sys/fs/cgroup/cpuset/${USER}/subgroup/cpuset.cpus
$ ./my_other_task &
$ echo $! > /sys/fs/cgroup/cpuset/${USER}/subgroup/tasks
答案2
如果你有足够新的 Linux 发行版,你应该能够在临时的 cgroup 中运行进程,例如
$ systemd-run --user --scope /bin/bash
然而,在许多 Linux 发行版systemd
中,所有 Ubuntu 版本 21.10 之前的版本都出现了问题,然后上述操作失败,出现类似
polkitd(authority=local)[1300]: Registered Authentication Agent for unix-process:10428:26722972 (system bus name :1.478 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_DK.utf8)
systemd[2601]: run-rbe547d13ad2c41d7857ea9e660e51ab9.scope: Failed to add PIDs to scope's control group: Permission denied
systemd[2601]: run-rbe547d13ad2c41d7857ea9e660e51ab9.scope: Failed with result 'resources'.
systemd[2601]: Failed to start /bin/bash.
polkitd(authority=local)[1300]: Unregistered Authentication Agent for unix-process:10428:26722972 (system bus name :1.478, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_DK.utf8) (disconnected from bus)
失败的原因是,在没有 root 权限的情况下运行临时 cgroup 需要对cgroupv2
/ 的支持cgroup2
,但 Canonical 确实想要推动snap
。 并且使用cgroup2
会中断,直到snap
有snap
足够的补丁。 Ubuntu 21.10 是第一个具有足够智能的 Ubuntu 版本,因此任何较旧的 Ubuntu 版本都是故意为临时 cgroups 而设置的,以允许其运行。snap
cgroup2
snap
我猜那些甚至没有尝试支持这个错误功能的发行版在snap
支持方面会遇到更少的问题cgroup2
,而且这也应该适用于旧的发行版本。
如果mount | grep cgroup2
输出任何内容,则表明您的系统足够新。
答案3
如果你使用的是 Ubuntu,你(root 用户)可以安装cgroup-精简版并将所需内容添加到 /etc/cgconfig.conf,包括哪些用户可以更改 cgroup 的配置。它在启动时运行。
如果失败,您(根用户)可以添加自己的脚本以在启动期间运行。