cgroup虚拟文件系统对于root来说是只读的,当root有写权限时?

cgroup虚拟文件系统对于root来说是只读的,当root有写权限时?

正如我的问题标题所示,我正在尝试编辑 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

具体命令输出

我尝试编写的具体命令及其输出是:

  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如果我尝试通过写入文件nanonano客户端会打开该文件,但会显示在屏幕底部:
[ 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

但是尝试编写一个新的控制器,例如控制器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 的安装点。

相关内容