シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

Rocky Linuxでincusを動かしてみた

こんにちは、技術部ネットワーク課の上曽山です。
公式のものではないものの、Rocky Linuxにシステムコンテナのマネージャーであるincusのパッケージが提供されたので動かしてみました。
紙幅の都合ですべての機能を網羅することは出来ませんが、インストールからカスタムOSイメージの作成まで、ざっと試していきたいと思います。

incusとは

incusはLXDから派生したシステムコンテナ/仮想マシンのマネージャーです。
詳しくはincusの公式ドキュメントでご確認ください。

linuxcontainers.org

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の機能をフルに味わいたいなら他のディストリビューションを使う方が良いかもしれません。