在 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 的資源,基本上就是成功了!


  1. Podman, a Pod Manager tool. ↩︎

  2. cgroups - ArchWiki ↩︎

  3. 關於 /etc/default/grub.d 是如何被載入的,可以參考 /usr/sbin/grub-mkconfig 裡面的實作 ↩︎

因主題更新,留言功能暫時停用中。