Linux Cgroup은 제어 파일을 작성하고 CPU에서는 작동하지만 장치 하위 시스템에서는 작동하지 않습니까?

Linux Cgroup은 제어 파일을 작성하고 CPU에서는 작동하지만 장치 하위 시스템에서는 작동하지 않습니까?

루트가 아닌 사용자를 위해 Cgroup을 설정하려고 합니다.유리 물고기.

환경 설정:

  • CentOS 7.2.1511
  • 커널 3.10.0-327.el7.x86_64
  • Cgroup은 /sys/fs/cgroup에 마운트됩니다.

다음 명령을 실행하여 루트가 아닌 사용자를 위한 Cgroup을 생성하는 것이 가능해야 합니다:

  1. CPU 하위 시스템의 경우:

    $ sudo mkdir /sys/fs/cgroup/cpu/${USER}
    $ sudo chown -R ${USER} /sys/fs/cgroup/cpu/${USER}
    
  2. 장치 하위 시스템의 경우:

    $ sudo mkdir /sys/fs/cgroup/devices/${USER}
    $ sudo chown -R ${USER} /sys/fs/cgroup/devices/${USER}
    

이는 CPU 하위 시스템에 적용됩니다. 제어 파일을 다음과 같이 작성할 수 있기 때문입니다.유리 물고기, 예를 들어 cpu.cfs_period_us는 다음과 같습니다.

    echo 43434 > cpu.cfs_period_us

그러나 장치 하위 시스템에 쓰기(예:

    echo 'a *:* rwm' > devices.deny

결과적으로 다음과 같은 오류가 발생합니다

    bash: echo: write error: Operation not permitted

CPU 하위 시스템 권한

장치 하위 시스템 권한

어떤 도움이라도 대단히 감사하겠습니다. 저는 오랫동안 이 문제에 갇혀 있었기 때문에 이해가 되지 않습니다.

답변1

나는 같은 문제에 직면했습니다.

재현 단계: 모든 하위 시스템(cpu, cpuset, 메모리, 동결, 장치 등)의 소유자와 그룹을 변경했습니다. 그런 다음 장치 cgroup의 cgroup.procs에 쓰기를 시도했는데 "작업이 허용되지 않음" 메시지를 받았습니다. 동일한 명령이 다른 모든 하위 시스템에서도 잘 작동합니다.

for i in cpuset nls_cls,net_prio perf_event devices pids cpu,cpuacct memory hugetlb blkio freezer systemd; do 
  mkdir -p /sys/fs/cgroup/$i/mygroup;
  mkdir -p /sys/fs/cgroup/$i/mygroup/subgroup;
  chown -R myuser:myuser /sys/fs/cgroup/$i/mygroup;
done

[~]$ echo 1943 > /sys/fs/cgroup/devices/mygroup/subgroup/cgroup.procs
-bash: echo: write error: Operation not permitted

파일(/sys/fs/cgroup/devices/mygroup/subgroup/cgroup.procs)에는 권한 644가 있고 selinux는 비활성화되어 있으며 lsattr에는 "플래그를 읽는 동안 장치에 부적절한 ioctl"이라고 표시됩니다(이는 정상입니다). 파일의 권한을 666으로 변경하려고 시도했지만 동일한 오류가 발생했습니다. 어쨌든 오류는 "권한 거부"가 아니라 "작업이 허용되지 않음"입니다.

이 명령은 sudo로 실행하면 제대로 작동하지만 요점은 mygroup을 sudo가 아닌 사용자에게 위임하는 것입니다.

[해결방법] 장치 시스템의 cgroup.procs에 쓰는 프로세스에는 SYS_CAP_ADMIN이 있어야 합니다. 문서는 매우 혼란스럽습니다. 그러나 여기 두 번째 단락에서 볼 수 있습니다.https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/devices.html#security

"화이트리스트를 수정하거나 다른 작업을 새 cgroup으로 이동하려면 CAP_SYS_ADMIN이 필요합니다. (다시 변경하고 싶을 수도 있습니다)"

이 줄은 다른 하위 시스템 문서에는 나타나지 않으므로 분명히 장치 하위 트리로 제한됩니다. 올바른 사용법을 얻기 위해 실제 코드(위에서 설명한 bash 스크립트가 아님)를 수정했고 sudo setcap cap_sys_admin=+ep <my_bin>제대로 작동하기 시작했습니다.

관련 정보