こんにちは、技術部ネットワーク課の上曽山です。
公式のものではないものの、Rocky Linuxにシステムコンテナのマネージャーであるincusのパッケージが提供されたので動かしてみました。
紙幅の都合ですべての機能を網羅することは出来ませんが、インストールからカスタムOSイメージの作成まで、ざっと試していきたいと思います。
incusとは
incusはLXDから派生したシステムコンテナ/仮想マシンのマネージャーです。
詳しくはincusの公式ドキュメントでご確認ください。
incusのインストール
incusのドキュメントにもインストール方法は書いてありますが、Rocky Linuxの公式ページの方が詳しく載っています。
本記事ではいくつかの手順を省略しますが、こちらを参考に進めます。
- リポジトリ追加
incusのコミュニティプロジェクトとepel/crbのリポジトリを追加します。
dnf copr -y enable neil/incus dnf install -y epel-release dnf config-manager --enable crb
- パッケージインストール
ここでは、作成したコンテナにDHCPでIPアドレスを割り当てるためのdhcp-server
、コマンド補完に役立つbash-completion
もincusと同時にインストールしています。
dnf install -y incus incus-tools dhcp-server bash-completion
- サーバー再起動
パッケージをインストールしたら一旦サーバーを再起動しておきます。
systemctl reboot
初期設定
- rootユーザーUID/GID設定
最初にコンテナのrootユーザーに割り当てるUID/GIDの設定を追加します。
echo "root:1000000:1000000000" >> /etc/subuid echo "root:1000000:1000000000" >> /etc/subgid
- incus起動
systemctl start incus.service
- incus初期設定
サービスを起動したら初期設定を行います。
incus admin init
- 設定内容
実際の設定内容は以下の通り、IPv4アドレスに192.168.0.1/24
を設定し、IPv6は無効化しました。
ネットワーク設定以外はデフォルトなので設定値は入力せずEnterキーを押下します。
# incus admin init Would you like to use clustering? (yes/no) [default=no]: Do you want to configure a new storage pool? (yes/no) [default=yes]: Name of the new storage pool [default=default]: Where should this storage pool store its data? [default=/var/lib/incus/storage-pools/default]: Would you like to create a new local network bridge? (yes/no) [default=yes]: What should the new bridge be called? [default=incusbr0]: What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 192.168.0.1/24 Would you like to NAT IPv4 traffic on your bridge? [default=yes]: What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none Would you like the server to be available over the network? (yes/no) [default=no]: Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: Would you like a YAML "init" preseed to be printed? (yes/no) [default=no]:
- DHCPサーバー設定作成
続いてDHCPサーバーの設定を作成します。
設定内容は以下の通りです。
項目 | 設定値 |
---|---|
ネットワーク | 192.168.0.0/24 |
ルーターアドレス | 192.168.0.1 |
ブロードキャストアドレス | 192.168.0.255 |
クライアントアドレス | 192.168.0.100~192.168.0.200 |
DNSサーバー | 8.8.8.8、8.8.4.4 |
cat << 'EOF' >> /etc/dhcp/dhcpd.conf authoritative; subnet 192.168.0.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.0.100 192.168.0.200; option broadcast-address 192.168.0.255; option routers 192.168.0.1; option domain-name-servers 8.8.8.8,8.8.4.4; } EOF
- dhcpd起動
設定ファイルを作ったらdhcpdを起動します。
systemctl start dhcpd.service
- NAT設定
nftablesによるNATの設定は自動作成されます。
# nft list table inet incus table inet incus { chain pstrt.incusbr0 { type nat hook postrouting priority srcnat; policy accept; ip saddr 192.168.0.0/24 ip daddr != 192.168.0.0/24 masquerade } chain fwd.incusbr0 { type filter hook forward priority filter; policy accept; ip version 4 oifname "incusbr0" accept ip version 4 iifname "incusbr0" accept } chain in.incusbr0 { type filter hook input priority filter; policy accept; iifname "incusbr0" tcp dport 53 accept iifname "incusbr0" udp dport 53 accept iifname "incusbr0" icmp type { destination-unreachable, time-exceeded, parameter-problem } accept iifname "incusbr0" udp dport 67 accept } chain out.incusbr0 { type filter hook output priority filter; policy accept; oifname "incusbr0" tcp sport 53 accept oifname "incusbr0" udp sport 53 accept oifname "incusbr0" icmp type { destination-unreachable, time-exceeded, parameter-problem } accept oifname "incusbr0" udp sport 67 accept } }
NATの設定はincusのサービスに紐づいたものなので、nftablesを操作した時に消えてしまう可能性があります。
もし消えた時はincusを再起動すれば再度適用されます。
コンテナ作成
- コンテナ作成コマンド
incus launch <OSイメージ> <コンテナ名>
もしくは
incus create <OSイメージ> <コンテナ名>
launch
コマンドはコンテナの作成と起動、create
コマンドはコンテナの作成のみを行います。
- コンテナ作成
実際にコンテナを作成してみます。
# incus launch images:rockylinux/9 test001 Launching test001
作成したらincus list
コマンドで稼働状態を確認します。
# incus list +---------+---------+----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+----------------------+------+-----------+-----------+ | test001 | RUNNING | 192.168.0.100 (eth0) | | CONTAINER | 0 | +---------+---------+----------------------+------+-----------+-----------+
状態がRUNNINGになっていて、IPアドレスも割り当てられています。問題なさそうです。
カスタムOSイメージ作成
それでは独自のOSイメージ作成に取り掛かります。
本記事ではデフォルトのイメージにhttpdを追加したものを作成したいと思います。
- コンテナ内でコマンドを実行する
incus exec <コンテナ名> -- <実行コマンド>
上記の書式でコンテナ内でコマンドを実行出来ます。引数にハイフン付のオプションが含まれているとincusコマンドのオプションだと解釈されてしまうので、実行コマンドの前に--
を追加するようにしましょう。
- httpdのインストール
# incus exec test001 -- dnf install -y httpd Rocky Linux 9 - BaseOS 2.9 MB/s | 2.3 MB 00:00 Rocky Linux 9 - AppStream 5.4 MB/s | 8.4 MB 00:01 Rocky Linux 9 - Extras 25 kB/s | 16 kB 00:00 Dependencies resolved. ==================================================================================================================================== Package Architecture Version Repository Size ==================================================================================================================================== Installing: httpd x86_64 2.4.62-1.el9_5.2 appstream 45 k Installing dependencies: apr x86_64 1.7.0-12.el9_3 appstream 122 k apr-util x86_64 1.6.1-23.el9 appstream 94 k apr-util-bdb x86_64 1.6.1-23.el9 appstream 12 k httpd-core x86_64 2.4.62-1.el9_5.2 appstream 1.4 M httpd-filesystem noarch 2.4.62-1.el9_5.2 appstream 12 k httpd-tools x86_64 2.4.62-1.el9_5.2 appstream 79 k mailcap noarch 2.1.49-5.el9 baseos 32 k rocky-logos-httpd noarch 90.15-2.el9 appstream 24 k Installing weak dependencies: apr-util-openssl x86_64 1.6.1-23.el9 appstream 14 k mod_http2 x86_64 2.0.26-2.el9_4.1 appstream 163 k mod_lua x86_64 2.4.62-1.el9_5.2 appstream 59 k Transaction Summary ==================================================================================================================================== Install 12 Packages (途中省略) Installed: apr-1.7.0-12.el9_3.x86_64 apr-util-1.6.1-23.el9.x86_64 apr-util-bdb-1.6.1-23.el9.x86_64 apr-util-openssl-1.6.1-23.el9.x86_64 httpd-2.4.62-1.el9_5.2.x86_64 httpd-core-2.4.62-1.el9_5.2.x86_64 httpd-filesystem-2.4.62-1.el9_5.2.noarch httpd-tools-2.4.62-1.el9_5.2.x86_64 mailcap-2.1.49-5.el9.noarch mod_http2-2.0.26-2.el9_4.1.x86_64 mod_lua-2.4.62-1.el9_5.2.x86_64 rocky-logos-httpd-90.15-2.el9.noarch Complete!
- コンテナ停止
OSイメージを作成するため一旦コンテナを停止します。
incus stop test001
- OSイメージ作成
incus publish <コンテナ名> --alias <OSイメージ名>
上記コマンドで指定したコンテナ使ったOSイメージが作成出来ます。イメージを識別するためエイリアスを設定する事をお勧めします。
以下のfingerprintはダミーです。
# incus publish test001 --alias custom001 Instance published with fingerprint: XXXXXXXXXXXXXXXXXXXXXXXXXX
- カスタムOSイメージでコンテナを作成する
早速、作成したOSイメージを使ってコンテナを作成してみます。
# incus launch custom001 test002 Launching test002
httpdがインストールされているか確認してみましょう。
# incus exec test002 -- rpm -q httpd httpd-2.4.62-1.el9_5.2.x86_64
期待通りの結果になりました。
パッケージの状態だけでなく設定ファイルの内容も元のコンテナから引き継ぐので、ある程度作り込んでからOSイメージを作成すると同じ環境のサーバーを量産出来ます。
最後に
環境変数の調整とか、ストレージプールの設定とか、かなり端折った部分がありますが、incusの上澄みの部分を体験することが出来ました。
テストのために何台も同系統のサーバーを作ったり、少し確認したいだけなのに1からOSをインストールしたりと、これまで環境整備にかけていた無駄な時間を省略出来そうです。
しかし、公式なパッケージではないためか、現時点(2025/04/29)のRocky Linux用パッケージでは仮想マシンを動かすための環境が整っていません。
# incus launch images:rockylinux/9 test003 --vm Launching test003 Error: Failed instance creation: Failed creating instance record: Instance type "virtual-machine" is not supported on this server: QEMU command not available: exec: "qemu-system-x86_64": executable file not found in $PATH
incusの機能をフルに味わいたいなら他のディストリビューションを使う方が良いかもしれません。