CentOS Stream9でLXCを動かす①

仮想化といえばESXiやProxmoxを使っていたのです。

ESXiはvCenterを使えばvMotionでライブマイグレーションができますが、有料です。
Proxmoxは仮想マシンとLXCコンテナを扱えて、仮想マシンはライブマイグレーションもできますが、コンテナはライブマイグレーションが今のところできなさそうです。

とはいえ、LXCは起動やインストールも早く便利なのでProxmoxではLXCを最近よく使っています。せっかくなのでLXCをCentOS でホストしたくなったので、その記録です。

環境はCentOS Stream9を最小構成でインストールし、SELinuxを無効にした状態になります。

LXCは標準リポジトリにはなく、EPELなので、EPELのインストールと、LXC関連のツールを入れていきます。

# dnf install epel-release -y
# dnf install lxc lxc-templates container-selinux wget tar -y

LXCの起動と自動起動を有効にします。

# systemctl enable --now lxc.service

コンテナを作ってみます。–template downloadでテンプレートをダウンロード、–dist以降でCentOS Stream9のx64版を指定しています。

# lxc-create --template download -n test_container -- --dist centos --release 9-Stream --arch amd64
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a Centos 9-Stream x86_64 (20230927_07:08) container.

ダウンロードするコンテナは以下のページを参考にすると他のディストリビューションを確認できます。

https://images.linuxcontainers.org/

作成したコンテナを起動してみます。

# lxc-start --name test_container
lxc-start: test_container: lxccontainer.c: wait_on_daemonized_start: 877 Received container state "ABORTING" instead of "RUNNING"
lxc-start: test_container: tools/lxc_start.c: main: 306 The container failed to start
lxc-start: test_container: tools/lxc_start.c: main: 309 To get more details, run the container in foreground mode
lxc-start: test_container: tools/lxc_start.c: main: 311 Additional information can be obtained by setting the --logfile and --logpriority option

ログファイルオプション使えということなので、つけてみます。

# lxc-start -n test_container -o /tmp/lxc-test_container.log
lxc-start: test_container: lxccontainer.c: wait_on_daemonized_start: 877 Received container state "ABORTING" instead of "RUNNING"
lxc-start: test_container: tools/lxc_start.c: main: 306 The container failed to start
lxc-start: test_container: tools/lxc_start.c: main: 309 To get more details, run the container in foreground mode
lxc-start: test_container: tools/lxc_start.c: main: 311 Additional information can be obtained by setting the --logfile and --logpriority options

# cat /tmp/lxc-test_container.log
lxc-start test_container 20230927131955.996 ERROR    network - network.c:netdev_configure_server_veth:710 - No such file or directory - Failed to attach "vethifBqSc" to bridge "lxcbr0", bridge interface doesn't exist
lxc-start test_container 20230927131956.913 ERROR    network - network.c:lxc_create_network_priv:3413 - No such file or directory - Failed to create network device
lxc-start test_container 20230927131956.987 ERROR    start - start.c:lxc_spawn:1843 - Failed to create the network
lxc-start test_container 20230927131956.108 ERROR    lxccontainer - lxccontainer.c:wait_on_daemonized_start:877 - Received container state "ABORTING" instead of "RUNNING"
lxc-start test_container 20230927131956.121 ERROR    lxc_start - tools/lxc_start.c:main:306 - The container failed to start
lxc-start test_container 20230927131956.125 ERROR    lxc_start - tools/lxc_start.c:main:309 - To get more details, run the container in foreground mode
lxc-start test_container 20230927131956.129 ERROR    lxc_start - tools/lxc_start.c:main:311 - Additional information can be obtained by setting the --logfile and --logpriority options
lxc-start test_container 20230927131956.288 ERROR    start - start.c:__lxc_start:2074 - Failed to spawn container "test_containe

lxcbr0がないよということですね。コンテナはデフォルトでブリッジネットワークが構成されているので、それを使おうとして、ブリッジを作ってないのでエラーになったわけですね。

ブリッジを有効にするのに、LXCの設定ファイルを変更します。

# /etc/sysconfig/lxc
USE_LXC_BRIDGE="false"
↓
USE_LXC_BRIDGE="true" 

LXCのネットワークサービスはdnsmasqを使っているのでインストールします。

# dnf install dnsmasq -y

LXCのネットワークサービスを起動します。

# systemctl enable --now lxc-net.service

デフォルトはlxcbr0という名前でブリッジが起動します。ブリッジが起動したことを確認します。

# ip a
11: lxcbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 10.0.3.1/24 brd 10.0.3.255 scope global lxcbr0
       valid_lft forever preferred_lft forever

ブリッジが起動した状態でコンテナをもう一度lxc-startをすると起動できます。起動後何も出力されなければ正常なので、lxc-attachでコンテナにアタッチします。

# lxc-start --name test_container
# lxc-attach --name test_container
[root@test_container /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:5c:51:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::b903:38eb:eef1:1021/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

無事アタッチ出来たらexitで抜けて、lxc-stopで停止します。

[root@test_container /]# exit
# lxc-stop --name test_container

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)