Docker

如何將 cgroup.subtree_control 填充到 Docker 的私有 cgroup 命名空間中?

  • December 21, 2021

對於 cgroupv2,預設情況下 Docker 使用 cgroup 的私有命名空間。這由--cgroupns標誌 fordocker rundefault-cgroupns-modedaemon 選項控制。我需要在容器內創建子 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可以寫入而不會出現任何“設備或資源繁忙”錯誤。

引用自:https://unix.stackexchange.com/questions/683012