如何以非 root 用户身份创建和使用 Linux cgroups?

如何以非 root 用户身份创建和使用 Linux cgroups?

如何创建和使用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会中断,直到snapsnap足够的补丁。 Ubuntu 21.10 是第一个具有足够智能的 Ubuntu 版本,因此任何较旧的 Ubuntu 版本都是故意为临时 cgroups 而设置的,以允许其运行。snapcgroup2snap

我猜那些甚至没有尝试支持这个错误功能的发行版在snap支持方面会遇到更少的问题cgroup2,而且这也应该适用于旧的发行版本。

如果mount | grep cgroup2输出任何内容,则表明您的系统足够新。

答案3

如果你使用的是 Ubuntu,你(root 用户)可以安装cgroup-精简版并将所需内容添加到 /etc/cgconfig.conf,包括哪些用户可以更改 cgroup 的配置。它在启动时运行。

如果失败,您(根用户)可以添加自己的脚本以在启动期间运行。

答案4

有一系列关于左心室收缩末期关于 cgroups,请参阅第1部分,或者在那里进行搜索。系统化包括一组帮助程序来管理 cgroups(所限制的进程)。

相关内容