루트에 쓰기 권한이 있는 경우 cgroup 가상 파일 시스템은 루트에 대해 읽기 전용입니까?

루트에 쓰기 권한이 있는 경우 cgroup 가상 파일 시스템은 루트에 대해 읽기 전용입니까?

내 질문의 제목에서 알 수 있듯이 cgroup 가상 파일 시스템의 속성을 편집하려고 합니다(새 디렉토리 생성, 특정 파일의 리소스 제한 편집 등). 그러나 수행하는 모든 쓰기 작업은 다음과 같습니다.

cannot do action in 'fs/cgroup/': Read-only file system

루트로 실행 해도 chmod 755결과는 같습니다. 루트에 쓰기 액세스 권한이 있는지 확인한 후 출력을 확인 ls -al하고 다음을 확인했습니다.

drwx-xr-x 15 root root 380 Mar 31 09:28 cgroup

파일 편집/생성이 초기 단계인 온라인 예제를 읽을 때 /cgroup/이 작업을 수행한다는 언급이 없습니다. 해결책을 찾는 동안 cgroup이 마운트되었기 때문에 문제가 발생한 것일 수도 있다고 생각했습니다. 즉, 모든 시스템 프로세스가 여기에 나열되어 있으므로 내용을 편집할 수 없습니다.

이 직감을 바탕으로 cgroup을 제거하려고 했습니다.

umount cgroup

일반적인 결과를 반환합니다.

target is busy.

내가 이해한 바에 따르면 루트 사용자는 루트 쓰기 권한을 사용하여 루트 소유 디렉터리에 쓰기를 시도할 수 있어야 합니다. 무엇이 보이지 않습니까?

나는 다양한 매뉴얼 페이지, 온라인 커널 사이트 및 다음과 같은 유용한 스택 교환 게시물을 읽었습니다.cgroup을 사용하여 화이트리스트를 제외한 모든 프로세스를 단일 CPU로 제한하는 방법은 무엇입니까?. 내가 겪고 있는 문제에 대한 참조를 어디서도 찾을 수 없습니다.

내 방향을 알려줄 수 있는 경험이 있는 사람이 있나요?

고쳐 쓰다

Mounted에 나열된 cgroup은 다음을 실행하여 표시됩니다 grep cgroup /proc/mounts.

tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/rdma cgroup rw,nosuid,nodev,noexec,relatime,rdma 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0

특정 명령 출력

내가 작성하려는 특정 명령과 그 출력은 다음과 같습니다.

  1. /sys/fs/cgroup/unified에 ls파일이 cgroup.subtree_control있습니다:
echo "+cpu +memory" > cgroup.subtree_control
bash: echo: write error: No such file or directory
  1. 원하는 컨트롤러를 직접 작성하려고 하면 다음이 cgroup.controllers제공됩니다.
echo "cpu" > cgroup.controllers
bash: echo: write error: Invalid argument
  1. cgroup.subtree_control를 통해 파일에 쓰려고 하면 nano클라이언트 nano가 파일을 열지만 화면 하단에 표시됩니다.
[ Error writing lock file ./.cgroup.subtree_control.swp: Permission denied ]
  1. /sys/fs/cgroup/unified파일 생성을 거부합니다.
touch file
touch: cannot touch 'file': Permission denied
  1. /sys/fs/cgroup/unified디렉터리 생성을 허용합니다.
mkdir newDir

cgroup 파일을 채웠습니다.

ls newDir
cgroup.controllers  cgroup.max.descendants  cgroup.threads  io.pressure
cgroup.events       cgroup.procs            cgroup.type     memory.pressure
cgroup.freeze       cgroup.stat             cpu.pressure
cgroup.max.depth    cgroup.subtree_control  cpu.stat

하지만 이번에도 생성(전달)하거나 편집할 수 없습니다 touch.

echo cpu > cgroup.controllers
bash: echo: write error: Invalid argument
  1. 루트 cgroup.controller파일에 일부 컨트롤러가 포함될 것으로 예상했지만 그렇지 않습니다.
cat cgroup.controllers
# returns an empty string

어쩌면 이것이 문제에 대한 힌트일까요?

이 명령의 출력에 대한 나의 기대는 여기에 있는 커널 문서를 기반으로 합니다.https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

업데이트 2

cgroup 버전 1 파일 시스템을 마운트 해제한 후 다음 명령을 사용하십시오:

mount -t cgroup | cut -f 3 -d ' ' | xargs sudo umount

이제 명명된 루트 unified파일에 cgroup.controllers컨트롤러 이름이 포함됩니다.

cat cgroup.controllers
cpuset cpu io rdma

이 이름을 다음 사람에게 쓸 수 있습니다 cgroup.subtree_controller.

echo -n "+cpuset +cpu +io +rdma " >> cgroup.subtree_controller

그러나 새 컨트롤러(예: Controller )를 작성하려고 하면 memory작동하지 않습니다.

echo -n "+memory " > cgroup.subtree_controller
bash: echo: write error: No such file or directory

시스템 사양

-운영 체제: 우분투 20.04.6 LTS

- 커널: Linux 5.4.0-174-generic

답변1

이 문제는 cgroup 버전 1과 2를 모두 사용하는 커널로 인해 발생합니다.

내 질문의 경우 cgroup 버전 1과 2를 모두 활성화하는 것이 가능합니다. 이는 리소스 컨트롤러가 cgroup 버전 1 파일 시스템에 연결된 것처럼 cgroup 버전 2 파일 시스템에는 연결되지 않을 수 있기 때문에 문제가 됩니다.

한 가지 가능한 해결 방법은 cgroup 버전 1 파일 시스템을 마운트 해제하고 해당 컨트롤러를 분리한 다음 컨트롤러를 cgroup 버전 2 파일 시스템(기본적으로 /sys/fs/cgroup/unified/에 설치됨)에 다시 연결하는 것입니다. 이 작업은 부팅할 때마다 수행해야 합니다.

또는 시작 시 cgroup 버전 1이 로드되지 않도록 합니다. 다음 줄을 추가하여 이를 달성했습니다.

GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all"

/etc/default/grub파일에. 이러한 파일 변경 사항을 활성화하려면 다음을 실행합니다.

update-grub

결과: cgroup 버전 2 파일 시스템은 에 직접 마운트됩니다 /sys/fs/cgroup. 하위 디렉터리가 없습니다 unified. 절대 경로는 sys/fs/cgroup버전 2 마운트 지점입니다.

관련 정보