runc 自 v1.0.0-rc93 起完全支持 cgroup v2(统一模式)。 要使用 cgroup v2,可能需要更改主机 init 系统的配置。 以下发行版默认使用 cgroup v2:
- Fedora(自 31 日起)
- Arch Linux(自 2021 年 4 月起)
- openSUSE Tumbleweed(约自 2021 年起)
- Debian GNU/Linux(自 11 月起)
- Ubuntu(自 21.10 起)
- RHEL 和类 RHEL 发行版(自 9 版本起)
在其他基于 systemd 的发行版中,可通过在内核 cmdline 中添加
systemd.unified_cgroup_hierarchy=1来启用 cgroup v2。
我使用的是 cgroup v2 吗?
如果存在 /sys/fs/cgroup/cgroup.controllers,则是。
主机要求
内核
- 推荐版本:5.2 或更高版本
- 最低版本 4.15
由于缺乏freezer,不建议使用 5.2 以下的内核。
值得注意的是,切勿使用早于 4.15 的内核(除非使用用户命名空间运行容器),因为它不支持控制设备权限。
Systemd
在 cgroup v2 主机上,强烈建议使用 systemd cgroup 驱动程序运行 runc("runc --systemd-cgroup"),但并非必须。
建议使用 244 或更高版本的 systemd。旧版 systemd 不支持委托 cpuset 控制器。
请确保您还安装了 dbus-user-session (Debian/Ubuntu) 或 dbus-daemon (CentOS/Fedora) 软件包,且 dbus 正在运行。在 Debian 风格的发行版上,可以这样做
$ sudo apt install -y dbus-user-session
$ systemctl --user start dbus
rootless
在 cgroup v2 主机上,rootless运行程序可与 systemd 通信,获取 cgroup 权限授权。
$ runc spec --rootless
$ jq '.linux.cgroupsPath="user.slice:runc:foo"' config.json | sponge config.json
$ runc --systemd-cgroup run foo
容器进程在 cgroup 中执行,如 /user.slice/user-$(id-u).slice/user@$(id-u).service/user.slice/runc-foo.scope。
配置委托
通常情况下,默认情况下只有 memory 和 pids 控制器委托给非 root 用户。
$ cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers
memory pids
要允许委托其他控制器,需要更改 systemd 配置如下:
# mkdir -p /etc/systemd/system/user@.service.d
# cat > /etc/systemd/system/user@.service.d/delegate.conf << EOF
[Service]
Delegate=cpu cpuset io memory pids
EOF
# systemctl daemon-reload