正如我的问题标题所示,我正在尝试编辑 cgroup 虚拟文件系统的属性 - 创建新目录、编辑某些文件中的资源限制等 - 但我采取的任何写入操作都会返回:
cannot do action in 'fs/cgroup/': Read-only file system
即使chmod 755
以 root 身份运行,结果也是一样的。确认 root 具有写入权限,我检查输出ls -al
并看到:
drwx-xr-x 15 root root 380 Mar 31 09:28 cgroup
当我阅读在线示例时,其中编辑/创建文件/cgroup/
是涵盖的初始步骤,没有提及执行此任务的问题。在寻求解决方案时,我认为问题可能是因为 cgroup 已挂载。那,因为所有系统进程都列在其中,所以我不允许编辑其内容。
根据这种预感,我尝试卸载 cgroup:
umount cgroup
返回通常的结果:
target is busy.
据我所知,应该允许 root 用户尝试写入具有 root 写入权限的 root 拥有的目录 - 我没有看到什么?
我一直在阅读各种手册页、在线内核站点以及一些有用的堆栈交换帖子,例如如何使用cgroups将除白名单之外的所有进程限制为单个CPU?。我无法在任何地方找到我遇到的问题的参考资料。
有没有经验丰富的人可以照亮我的方向?
更新
通过运行显示的在 Mounted 处列出的 cgroupgrep 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
但是尝试编写一个新的控制器,例如控制器memory
,将不起作用:
echo -n "+memory " > cgroup.subtree_controller
bash: echo: write error: No such file or directory
系统规格
-操作系统:Ubuntu 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 的安装点。