对于 cgroupv2,默认情况下 Docker 使用 cgroup 的私有命名空间。这由--cgroupns
标志 fordocker 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
在容器中启用了我需要的控制器有哪些替代方法?
在容器中创建一个子 cgroup,将每个 PID 移入子 cgroup,
/sys/fs/cgroup/cgroup.procs
然后/sys/fs/cgroup/cgroup.subtree_control
可以写入而不会出现任何“设备或资源繁忙”错误。