我正在尝试在两个不同的操作系统(Ubuntu 和 CentOS)上与控制组一起工作。我想问的问题很少。
我正在尝试使用该命令创建一个控制组cgcreate
,看起来它需要机器上的 root 访问权限。到目前为止我看到的所有示例都没有说明需要成为 root 用户才能创建或修改控制组。
真的有必要成为root用户吗?最终目标是编写一个 C++ 应用程序,用于创建和管理控制组,以使用 libcgroup API 控制资源。但 C++ 应用程序不会由任何 root 用户运行。它可以是任何普通用户。
答案1
正常情况是您将cgcreate
、cgset
、cgdelete
、cgget
等设置为根。最终,旨在限制占用许多资源的程序/脚本将以普通用户身份执行。因此,设置为root,以用户身份使用和执行。
这是通过命令的-a
和参数来完成的(以 root 身份执行)。当你建立一个小组时就已经这样了。就我而言:-t
cgcreate
cgcreate -t monero:monero -a monero:monero -g 内存,cpu:monerogroup
其中 monero 是未来用户的用户名,该用户将在 cgroup 限制下执行和运行程序。有关-a
和子参数之间的细微差别,-t
请参阅 的手册页cgcreate
。
人cgcreate
在大多数情况下,这都是同一用户。
然后,设置限制(仍以 root 身份):
cgset -r memory.limit_in_bytes=$((4*1024*1024*1024)) monerogroup
cgset -r cpu.shares=128 monerogroup
如果您想执行以下操作,请检查您的条目:
cgget -g 内存:/monerogroup | grep 字节
然后最终切换用户,在我的例子中是用户 monero,并从正确的文件夹中切换:
cgexec -g 内存,CPU:monerogroup ./monerod
当您专门为用户设置权限时,用户不会遇到任何权限问题。
答案2
撇开这一点的安全影响不谈,您可以设置该setuid
位
chmod +s /bin/cgcreate
chmod +s /bin/cgdelete
为运行该程序的非 root 用户提供 root 权限。
建议删除普通用户访问权限
chmod 550 /bin/cgcreate
chmod 550 /bin/cgdelete
并创建一个您希望允许使用 cgcreate IE 的特殊组cgusers
,
groupadd cgusers
并将这些文件的组成员身份更改为该组:
chgrp cgusers /bin/cgcreate
chgrp cgusers /bin/cgdelete
所有这些都将由 root 运行,之后cgusers
组中的所有用户都将以 root 身份运行cgcreate
,cgdelete
而不是以他们自己的身份运行。您只需要让您希望在正确的组下拥有此权力的成员即可。
答案3
Cgroup 最终通过 cgroup 文件系统进行处理。创建 cgroup 的能力应该仅仅是在该 cgroup 下创建目录并写入文件的能力。如果您以更精细的权限挂载 cgroup FS,或者如果您动态更改其权限,则某些用户应该能够执行某些操作。显然,您无法将其他用户进程的进程 ID 添加到任务文件中。您只能添加您的用户。
话虽如此,我不确定上述内容是否是全球性的。即某些 cgroup 可能不支持这一点。
总的来说,最好的方法是使用 cgroup 管理器,然后可以指示该管理器将任务关联到 cgroup。我相信 cgmanager 会做类似的事情。
答案4
简短的回答是否定的。
对于 cgroup 的创建和所有权分配,您依赖于 root 权限。没有可靠的方法来解决它。
但是,您可以创建 cgroup 并将所有权分配给特定用户或组。
用户
$ u=$(whoami)
$ sudo mkdir /sys/fs/cgroup/cpuset/${u}
$ sudo chown -R ${u}: /sys/fs/cgroup/cpuset/${u}
团体
$ g=MYGROUP && grep ^${g}: /etc/group || echo "Your group doesn't exist. Run \"mkgroup $g\" and repeat this command before you continue."
$ sudo mkdir /sys/fs/cgroup/cpuset/${g}
$ sudo chgrp -R ${g} /sys/fs/cgroup/cpuset/${g}