仮想化といえば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