내 질문의 제목에서 알 수 있듯이 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
특정 명령 출력
내가 작성하려는 특정 명령과 그 출력은 다음과 같습니다.
- /sys/fs/cgroup/unified에
ls
파일이cgroup.subtree_control
있습니다:
echo "+cpu +memory" > cgroup.subtree_control
bash: echo: write error: No such file or directory
- 원하는 컨트롤러를 직접 작성하려고 하면 다음이
cgroup.controllers
제공됩니다.
echo "cpu" > cgroup.controllers
bash: echo: write error: Invalid argument
cgroup.subtree_control
를 통해 파일에 쓰려고 하면nano
클라이언트nano
가 파일을 열지만 화면 하단에 표시됩니다.
[ Error writing lock file ./.cgroup.subtree_control.swp: Permission denied ]
/sys/fs/cgroup/unified
파일 생성을 거부합니다.
touch file
touch: cannot touch 'file': Permission denied
/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
- 루트
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 마운트 지점입니다.