LXC のホストを Ubuntu22.0 にアップグレードしたら CentOS7 のコンテナが起動できなくなったので原因を調べた。
前提条件
- HOST OS: Ubuntu 22.04
- HOST Kernel: 5.15.0-79-generic
- Container OS: CentOS 7
- lxc-start —version: 5.0.0~git2209-g5a7b9ce67
エラー内容
Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization lxc.
Detected architecture x86-64.
Welcome to CentOS Linux 7 (Core)!
Set hostname to <vmc7>.
Cannot determine cgroup we are running in: No such file or directory
Failed to allocate manager object: No such file or directory
[!!!!!!] Failed to allocate manager object, freezing.
ホストの dmesg に下記が出力される。
cgroup2: Unknown parameter 'mode'
lxc-attach
はできるが systemd が動かない状態。
原因
Ubuntu22.04 は cgroup v2 のみが動いていることが原因でコンテナである CentOS7 は cgroup v1 の path で要求しようとしていることの様だった。
cgroup v2 のみが動いている環境が原因なので Ubuntu21 も同様の問題が生じると思われる。
lxc-checkconfig
で cgroup の動作状況を確認できる。
cgroup v1 のマウントポイントが空であることが確認できる。
--- Control groups ---
Cgroups: enabled
Cgroup namespace: enabled
Cgroup v1 mount points:
Cgroup v2 mount points:
/sys/fs/cgroup
Cgroup v1 systemd controller: missing
Cgroup v1 freezer controller: missing
Cgroup ns_cgroup: required
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
解決方法
動いている cgroup のバージョンを cgroup v2 から cgroup v1 に切り替える。
切り替えには grub のブートオプションの設定とホストサーバーの再起動が必要となる。
sudo vim /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
#GRUB_CMDLINE_LINUX_DEFAULT="" ##コメントアウト
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=false" ##追記
GRUB_CMDLINE_LINUX=""
sudo update-grub
このあとホストサーバーを再起動する。
起動後のlxc-checkconfig
が下記。
cgroup v1 が動作していることが分かる。
--- Control groups ---
Cgroups: enabled
Cgroup namespace: enabled
Cgroup v1 mount points:
/sys/fs/cgroup/systemd
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/hugetlb
/sys/fs/cgroup/misc
/sys/fs/cgroup/memory
/sys/fs/cgroup/freezer
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/pids
/sys/fs/cgroup/blkio
/sys/fs/cgroup/devices
/sys/fs/cgroup/rdma
Cgroup v2 mount points:
/sys/fs/cgroup/unified
Cgroup v1 clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
これで LXC コンテナが正常に起動できる。
まとめ
Ubuntu22.04 で CentOS7 の LXC コンテナが起動しない問題を回避した。
なお、systemd を用いない CentOS6 のコンテナは cgroup v2 で正常に動作しており特定に時間がかかった。
cgroup の問題なので docker などもおそらく影響を受ける問題だと思う。
検索したところ Kubernetes などコンテナ全般で起きているようだった。
参考
おしまい