루트 없이 cgroups v2 사용

루트 없이 cgroups v2 사용

cgroups v2(예: Ubuntu 22.04)를 사용하는 운영 체제에서는 루트 권한 없이는 어떤 프로세스도 "cgexec"할 수 없습니다. 특정 사용자에 대한 권한을 설정하기 위해 루트를 한 번 사용한 경우 이러한 유형의 코드는 제대로 작동했습니다. 최신 Redhat 버전에서 시도해 보았지만 비슷한 문제가 있었습니다.

예를 들어:

$ sudo cgcreate -t caj:caj -a caj:caj -g memory:qqq
[sudo] password for caj:
$ cgexec -g memory:qqq ls
cgroup change of group failed
$ sudo cgexec -g memory:qqq ls
<files ...>

답변1

사용자 조각 아래에 그룹을 만들어 보십시오(올바른 사용자 ID를 사용하고 있는지 확인하십시오).

바꾸다:

sudo cgcreate -t caj:caj -a caj:caj -g memory:qqq
cgexec -g memory:qqq ls

노력하다:

sudo cgcreate -t caj:caj -a caj:caj -g memory:user.slice/user-1000.slice/[email protected]/qqq
cgexec -g memory:user.slice/user-1000.slice/[email protected]/qqq ls

에서 참고하시기 바랍니다프로그램 실행매뉴얼 페이지에는CGROUP_LOGLEVEL환경 변수로 설정 가능디버그,정보,경고하다또는실수이는 "해당 파일 또는 디렉터리 없음" 또는 "권한 거부됨"과 같은 특정 문제 및 관련 파일을 확인하는 데 도움이 될 수 있습니다.

다음을 표시하려면 명령의 CGROUP_LOGLEVEL을 INFO로 설정하세요.

CGROUP_LOGLEVEL=INFO cgexec -g memory:qqq ls

Warning: cannot write tid 2482 to /sys/fs/cgroup/qqq/cgroup.procs:Permission denied

다음 명령을 실행하여 현재 셸의 그룹을 볼 수 있습니다.

cat /proc/self/cgroup

0::/user.slice/user-1000.slice/[email protected]/app.slice/app-org.gnome.Terminal.slice/vte-spawn-*.scope

cgroup v2에 대한 커널 문서에는대표단 봉쇄부분적으로 설명됨 그룹 간에 프로세스를 이동하려면 다음을 수행하십시오.

작성자는 소스 및 대상 cgroup의 공통 조상인 "cgroup.procs" 파일에 대한 쓰기 액세스 권한을 가지고 있어야 합니다.

그리고 다음 예를 들어보세요.

예를 들어, 아래와 같이 cgroup C0 및 C1이 사용자 U0에게 위임되었고 사용자 U0이 C00, C0 아래에 C01, C1 아래에 C10을 생성했으며 C0 및 C1 아래의 모든 프로세스가 U0에 속한다고 가정합니다.

여기에 이미지 설명을 입력하세요.

U0이 현재 C10에 있는 프로세스의 PID를 "C00/cgroup.procs"에 쓰고 싶어한다고 가정해 보겠습니다. U0에는 파일에 대한 쓰기 권한이 있습니다. 그러나 소스 cgroup C10과 대상 cgroup C00의 공통 조상은 위임 지점 위에 있고 U0에는 'cgroup.procs' 파일에 대한 쓰기 권한이 없으므로 쓰기가 거부됩니다. -EACCES.

cgexec를 실행하면 ls 프로세스를 user.slice 아래의 현재 그룹에서 qqq 그룹(위에 표시됨)으로 이동하려고 시도합니다. IIUC 공통 조상은 루트 cgroup이므로 권한이 거부됩니다.

cgexec 명령어를 보려면 CGROUP_LOGLEVEL=DEBUG를 사용하세요.

PID 3042를 cgroup 'qqq'로 이동

그리고

cgroup 그룹 변경에 실패했습니다.

$ CGROUP_LOGLEVEL=DEBUG cgexec -g memory:qqq ls
Found cgroup option cpuset, count 0
Found cgroup option cpu, count 1
Found cgroup option io, count 2
Found cgroup option memory, count 3
Found cgroup option hugetlb, count 4
Found cgroup option pids, count 5
Found cgroup option rdma, count 6
Found cgroup option misc, count 7
My euid and egid is: 1000,1000
Will move pid 3042 to cgroup 'qqq'
Adding controller memory
Warning: cannot write tid 3042 to /sys/fs/cgroup/qqq/cgroup.procs:Permission denied
Warning: cgroup_attach_task_pid failed: 50007
cgroup change of group failed

관련 정보