3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Fedora 31以降でLXCを使う手順

Last updated at Posted at 2020-01-02

Fedora 31以降でCGroup V2がデフォルトになった こともあり LXC (Linux Container) をFedora 31以降(特にサーバー最小インストール)でdnf install lxc lxc-templatesとしてもそのままでは使えない。使えるようにする手順を説明する。

足りないパッケージの補充

dnf install tar wget openvswitch dnsmasq をrootで実行する(openvswitchの代わりにbridge-utilsでもよい)。必要なパッケージが自動でインストールされるように依存関係を設定してほしい。

LXCブリッジ

LXCブリッジ(lxcbr0)のための設定変更

--- etc/sysconfig/lxc-orig	2019-12-15 20:41:04.000000000 +0900
+++ etc/sysconfig/lxc	2020-01-01 14:00:29.856450559 +0900
@@ -23,6 +23,6 @@
 #	If you want to kill containers fast, use -k
 STOPOPTS="-a -A -s"
 
-USE_LXC_BRIDGE="false"  # overridden in lxc-net
+USE_LXC_BRIDGE="true"  # overridden in lxc-net
 
 [ ! -f /etc/sysconfig/lxc-net ] || . /etc/sysconfig/lxc-net
--- lib/systemd/system/lxc-net.service-orig	2019-12-15 20:41:03.000000000 +0900
+++ lib/systemd/system/lxc-net.service	2020-01-01 14:04:36.796450990 +0900
@@ -3,6 +3,7 @@
 After=network-online.target
 Wants=network-online.target
 Before=lxc.service
+Wants=openvswitch.service # この行はopenvswitch の代わりにbridge-utilsを用いるなら不要
 
 [Service]
 Type=oneshot

LXCブリッジ(lxcbr0)の起動

systemctl enable --now lxc-net.service をrootで実行する

openvswitch.service が起動されていないときのエラーメッセージ

# lxc-start -F -n fedora31
lxc-start: fedora31: network.c: lxc_ovs_attach_bridge: 2500 Failed to attach "lxcbr0" to openvswitch bridge "vethALZ6WE": ovs-vsctl: unix:/var/run/openvswitch/db.sock: database connection failed (No such file or directory)
lxc-start: fedora31: network.c: instantiate_veth: 395 Operation not permitted - Failed to attach "vethALZ6WE" to bridge "lxcbr0"

lxcbr0 をlxc-net.serviceが準備していないときのエラーメッセージ

# lxc-start -F -n fedora31
lxc-start: fedora31: network.c: lxc_ovs_attach_bridge: 2500 Failed to attach "lxcbr0" to openvswitch bridge "vethAXQEHN": ovs-vsctl: no bridge named lxcbr
lxc-start: fedora31: network.c: instantiate_veth: 395 Operation not permitted - Failed to attach "vethAXQEHN" to bridge "lxcbr0"

コンテナ設定ファイルの変更

V1デバイスコントローラーの禁止

大抵の場合CGroup V1デバイスコントローラーをLXCが使おうとして使えず

ERROR    cgfsng - cgroups/cgfsng.c:cg_legacy_set_data:2415 - Failed to setup limits for the "devices" controller. The controller seems to be unused by "cgfsng" cgroup driver or not enabled on the cgroup hierarchy
ERROR    start - start.c:lxc_spawn:1910 - Failed to setup legacy device cgroup controller limits

というエラーメッセージを表示してlxc-start がすぐに終了していしまう。これを防ぐためにはコンテナ設定ファイル(/var/lib/lxc/fedora31/configなど)に

/var/lib/lxc/コンテナ名/configの末尾
lxc.cgroup.devices.allow =
lxc.cgroup.devices.deny =

を追加する。

コンテナ内systemdをCGroup V2専用モードで起動する

systemdを使っている大抵のLinuxディストリビューション(Fedora 31以降ではないものほぼ全て)ではsystemdをCGroup V1&V2混合モードで使っていて、それをFedora 31以降の上のLXCコンテナ内で起動すると

Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted
[!!!!!!] Failed to mount API filesystems.
Exiting PID 1...

というエラーが出てlxc-startがすぐに終了していしまう。これを防ぐためにはコンテナ設定ファイル(/var/lib/lxc/fedora31/configなど)に

/var/lib/lxc/コンテナ名/configの末尾
lxc.init.cmd = /sbin/init systemd.unified_cgroup_hierarchy=1

を追加する。

libvirt lxc

libvirt 5.6 あたりだと virt-install --memory 2048 --connect lxc:/ --os-variant fedora31 --filesystem /var/lib/lxc/fedora31/rootfs,/ --network none --transient --import --name fedora31 とすると 内部エラー: 'devices' cgroup コントローラーのマウントを確認できません というエラーが出て異常終了するので、libvirt を(例えばFedora RawhideからRPMを持ってくるとかして) 5.10 以降に更新するとlibvirt lxcを使えるようになる。

関連する Fedora へのバグレポート

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?