루트가 아닌 사용자를 위해 Cgroup을 설정하려고 합니다.유리 물고기.
환경 설정:
- CentOS 7.2.1511
- 커널 3.10.0-327.el7.x86_64
- Cgroup은 /sys/fs/cgroup에 마운트됩니다.
다음 명령을 실행하여 루트가 아닌 사용자를 위한 Cgroup을 생성하는 것이 가능해야 합니다:
CPU 하위 시스템의 경우:
$ sudo mkdir /sys/fs/cgroup/cpu/${USER} $ sudo chown -R ${USER} /sys/fs/cgroup/cpu/${USER}
장치 하위 시스템의 경우:
$ 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
어떤 도움이라도 대단히 감사하겠습니다. 저는 오랫동안 이 문제에 갇혀 있었기 때문에 이해가 되지 않습니다.
답변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>
제대로 작동하기 시작했습니다.