管理cgroup是否需要root用户访问权限?


12

我正在尝试与两个不同操作系统(Ubuntu和CentOS)上的控制组一起工作。我想问的问题很少。

我正在尝试使用cgcreate命令创建一个控制组,并且它似乎需要在计算机上进行root访问。到目前为止,我所看到的所有示例都没有提到需要成为创建或修改控制组的root用户。

真的有必要成为root用户吗?最终目标是编写一个C ++应用程序,该应用程序使用libcgroup API创建和管理控制组以控制资源。但是C ++应用程序不会由任何root用户运行。它可以是任何普通用户。


1
wiki.archlinux.org/index.php/Cgroups提供了一些信息,您显然需要通过root进行一些设置(我自己还没有对cgroups进行详细介绍)。
马太福音

该网站无法提供详细信息。这只是一个高层次的概述。
Rambo 2015年

1
好吧,它确实告诉您root可以设置可由非root用户管理的组。
马太福音

不久前,我广泛地研究了cgroup。该信息可能对您有用。但是我是作为root来做的,所以我没有这个特定问题的答案。
通配符

您可以创建一个“ editcgroup”组,然后允许该组中的每个人都执行“ sudo cgcreate”和“ sudo cgdelete”
John

Answers:


4

正常的情况是,你设置cgcreatecgsetcgdeletecgget,等了为。最终,打算被限制吸收大量资源的程序/脚本将作为普通用户执行。因此,以root用户身份设置,以用户身份使用和执行。

这是通过命令的-a-t参数cgcreate(以root用户身份执行)完成的。所以当您建立一个小组时。就我而言:

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群,将运行cgcreatecgdelete为根,而不是为自己。您只需要在适当的组中拥有想要拥有此权限的成员即可。


1

Cgroup最终通过cgroup文件系统进行处理。创建cgroup的能力仅应是在该目录下创建目录或写入文件的能力。如果使用更详尽的权限挂载cgroup FS,或者即时更改其权限,则某些用户应该可以执行操作。显然,您将无法将其他用户的进程的进程ID添加到任务文件中。您将只能添加用户的。

话虽如此,我不确定以上内容是否具有全球性。也就是说,某些cgroup可能不支持此功能。

总的来说,最好的方法是使用cgroup管理器,然后可以指示该任务将任务与cgroup相关联。我相信cgmanager会做这样的事情。


1

简短的答案是没有。

对于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}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.