在 Ubuntu 裡面啓用 cgroups v2
因為最近跳了 Podman[1] 的坑,所以就想說順便玩玩 rootless container 好了,結果發現如果要用 rootless container 的話,Podman 在 cgroups v2 裡面才可以做各種資源限制,但 Ubuntu 預設只使用了 cgroups v1,所以下面就來看看要怎麼把它切到 v2 囉。
TL;DR
#!/bin/bash
echo 'GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} systemd.unified_cgroup_hierarchy=1"' | sudo tee /etc/default/grub.d/70-cgroup-unified.cfg
sudo update-grub
Kernel parameters
想要在 Systemd enabled Linux 裡面啓用 cgroups v2 的話可以直接在 kernel parameters 裡面加上 systemd.unified_cgroup_hierarchy=1
[2] 即可在開機後使用 cgroups v2。
Grub
雖然在開機的時候可以手動修改 parameters,但總不可能每次開機的時候都手動調整,所以我們要靠修改 grub 開機選單來幫我們解決這個問題。
我們可以在 /etc/default/grub
裡面直接添加 GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=1"
或是在 /etc/default/grub.d/
下面新增一個檔案來載入設定,我自己會選擇後者[3],避免被其他設定檔覆蓋(例如: 50-curtin-settings.cfg
會覆寫 GRUB_CMDLINE_LINUX_DEFAULT
):
# /etc/default/grub.d/70-cgroup-unified.cfg
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} systemd.unified_cgroup_hierarchy=1"
修改完畢後執行 sudo update-grub
即可套用我們剛剛新增的設定,亦可從 /boot/grub/grub.cfg
檢查設定是否有誤,都沒問題後就可以直接重開機了!
檢查結果
我們可以在重開機之後看看系統是不是真的有把 cgroups v2 啓用,可以從 mount list 檢查:
$ mount | grep cgroup2
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
也可以手動 mount 看看 cgroups2:
$ sudo mkdir -p /test-cgroups2
$ sudo mount -t cgroup2 none /test-cgroups2
$ ls /test-cgroups2
cgroup.controllers cgroup.max.descendants cgroup.stat cgroup.threads
cgroup.max.depth cgroup.procs cgroup.subtree_control ...
$ sudo umount /test-cgroups2
$ sudo rmdir /test-cgroups2
如果可以成功存取 cgroups2 的資源,基本上就是成功了!
關於
/etc/default/grub.d
是如何被載入的,可以參考/usr/sbin/grub-mkconfig
裡面的實作 ↩︎