저는 두 가지 다른 운영 체제(Ubuntu 및 CentOS)에서 제어 그룹을 사용하여 작업하려고 합니다. 물어보고 싶은 질문이 거의 없습니다.
이 명령을 사용하여 제어 그룹을 생성하려고 하는데 cgcreate
머신에 대한 루트 액세스가 필요한 것 같습니다. 지금까지 본 예제 중 제어 그룹을 생성하거나 수정하려면 루트 권한이 필요하다는 내용은 없습니다.
정말로 루트가 되어야 합니까? 궁극적인 목표는 libcgroup API를 사용하여 리소스를 제어하기 위한 제어 그룹을 생성하고 관리하는 C++ 애플리케이션을 작성하는 것입니다. 그러나 C++ 응용 프로그램은 루트 사용자에 의해 실행되지 않습니다. 일반 사용자라면 누구나 가능합니다.
답변1
일반적으로 cgcreate
, cgset
, 등을 다음으로 설정합니다 cgdelete
.cgget
뿌리. 결국 많은 리소스의 사용을 제한하도록 설계된 프로그램/스크립트는 일반 사용자로 실행됩니다. 따라서 루트로 설정하고 사용자로 사용하고 실행하십시오.
이는 -a
명령의 및 매개변수를 통해 수행됩니다(루트로 실행됨). 그룹을 시작할 때 이미 이런 경우가 있습니다. 나는:-t
cgcreate
cgcreate -t 모네로:모네로 -a 모네로:모네로 -g 메모리,cpu:모네로그룹
여기서 monero는 cgroup 제한에 따라 프로그램을 실행하고 실행할 미래 사용자의 사용자 이름입니다. -a
하위 매개변수와 하위 매개변수 간의 미묘한 차이점은 매뉴얼 -t
페이지를 참조하십시오 cgcreate
.
peoplecgcreate
대부분의 경우 이는 동일한 사용자입니다.
그런 다음 제한 사항을 설정합니다(계속 루트로).
cgset -r memory.limit_in_bytes=$((4*1024*1024*1024)) 모네로그룹
cgset -r cpu.shares=128 모네로그룹
다음을 수행하려면 항목을 확인하십시오.
cgget -g 메모리:/monerogroup | grep 바이트
그런 다음 마지막으로 사용자(제 경우에는 monero 사용자)를 전환하고 올바른 폴더에서 전환합니다.
cgexec -g 메모리, CPU: monerogroup ./monerod
사용자에 대해 특별히 권한을 설정하면 사용자에게 권한 문제가 발생하지 않습니다.
답변2
이것이 보안에 미치는 영향을 제쳐두고 이 setuid
비트를 설정할 수 있습니다.
chmod +s /bin/cgcreate
chmod +s /bin/cgdelete
프로그램을 실행하는 루트가 아닌 사용자에게 루트 권한을 제공합니다.
일반 사용자의 접근권한을 제거하는 것이 좋습니다
chmod 550 /bin/cgcreate
chmod 550 /bin/cgdelete
cgcreate IE를 사용하도록 허용하려는 특수 그룹을 생성합니다 cgusers
.
groupadd cgusers
그리고 다음 파일의 그룹 멤버십을 해당 그룹으로 변경합니다.
chgrp cgusers /bin/cgcreate
chgrp cgusers /bin/cgdelete
이 모든 작업은 루트로 실행되며 cgusers
그룹의 모든 사용자는 자신 cgcreate
대신 루트로 실행됩니다 cgdelete
. 이 권한을 갖고 싶은 구성원이 올바른 그룹에 속해 있으면 됩니다.
답변3
Cgroup은 궁극적으로 cgroup 파일 시스템을 통해 처리됩니다. cgroup을 생성하는 기능은 해당 cgroup 아래에 디렉터리를 생성하고 파일을 쓰는 기능만 있어야 합니다. 더 세부적인 권한으로 cgroup FS를 마운트하거나 해당 권한을 동적으로 변경하는 경우 일부 사용자는 특정 작업을 수행할 수 있어야 합니다. 분명히 다른 사용자 프로세스의 프로세스 ID를 작업 파일에 추가할 수는 없습니다. 사용자만 추가할 수 있습니다.
그러나 위의 내용이 글로벌인지 확실하지 않습니다. 즉, 일부 cgroup은 이를 지원하지 않을 수 있습니다.
전반적으로 가장 좋은 접근 방식은 cgroup 관리자를 사용하는 것입니다. 그런 다음 작업을 cgroup에 연결하도록 지시할 수 있습니다. 나는 cgmanager가 비슷한 일을 한다고 생각합니다.
답변4
짧은 대답은 '아니요'입니다.
cgroup 생성 및 소유권 할당에는 루트 권한을 사용합니다. 이를 해결할 수 있는 확실한 방법이 없습니다.
그러나 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}