对于 cgroupv2,默认情况下 Docker 使用 cgroup 的私有命名空间。这是由--cgroupns
for 标志docker run
和default-cgroupns-mode
daemon 选项控制的。我需要在容器内创建子 cgroup,但是问题是容器内的根 cgroup 有一个空cgroup.subtree_control
!我无法在容器中填充它,因为当容器运行时,这个根 cgroup 中已经有进程了。尝试这样做会导致“设备或资源繁忙”错误。
--cgroupns host
这将是一个解决方法,但也只是一个解决方法;它不使用私有命名空间,如果可能的话我想保留它。进一步的问题是,目前决不从撰写文件中设置它。
我调查了一下--cgroup-parent
,能通过撰写文件设置。不过,我实在是不太明白这个设定。我在主机上创建了一个 cgroup,写入subtree_control
,然后尝试使用该 cgroup 作为父容器来启动一个容器。我收到这个错误,我不明白:
来自守护进程的错误响应:systemd cgroup 的 cgroup-parent 应该是名为“xxx.slice”的有效切片
我认为此设置的作用是在cgroup_namespaces
联机帮助页中引用以下内容的上下文中更改“当前 cgroups 目录”:
当进程使用带有 CLONE_NEWCGROUP 标志的 clone(2) 或 unshare(2) 创建新的 cgroup 命名空间时,其当前的 cgroups 目录将成为新命名空间的 cgroup 根目录。
无论如何,在启动容器之前要求在主机上手动配置 cgroup 是很麻烦的。我必须采取哪些替代方案来确保cgroup.subtree_control
容器中启用了我需要的控制器?
答案1
在容器中创建一个子 cgroup,将每个 PID 移动/sys/fs/cgroup/cgroup.procs
到子 cgroup 中,然后/sys/fs/cgroup/cgroup.subtree_control
可以写入,而不会出现任何“设备或资源繁忙”错误。