この連載は、
LXDは、コンテナと仮想マシンの両方を管理できるマネージャソフトウェアです。LXCもLXDも、OS環境を起動させるシステムコンテナを扱うことを主眼に開発されています。
gihyo.
今回は、筆者が記事として書けるカーネルの機能を出し尽くしてしまったので、久々にこの連載でもコンテナマネージャそのものを取り上げてみようと思いました。2023年10月に、LXCを開発しているLinuxContainersプロジェクトから、新たにIncusというプロダクトが発表されたためです。
LXC
Incusについてお話する前に、少しLXCについてお話したいと思います。
2023年は、2022年までよりは、この連載記事を書いた回数が多く、たまたまこの連載を目にされた方のX
以前LXCを使われていた方のなつかしいという声があったり、LXCは過去のものとしてとらえているのか、2014年から続いている連載であることを知って納得されていたりするのを見て苦笑いしていました。
LXC自体がそれほど話題にのぼらないからか、いまやコンテナといえばアプリケーションコンテナであることがほとんどであるからか、今LXCというプロダクト名を聞くと、過去のプロダクトと思っている人が多いのかなと想像しています。
しかし、LXCは別に過去のプロダクトというわけではありませんし、開発が止まったプロダクトでもありません。
バージョン0.
そして、そのライブラリを使った、コンテナを管理するマネージャとして開発が始まったプロダクトがLXDでした。LXDや、今回紹介するIncusがコンテナを操作する場合は、LXCが提供するライブラリを使ってコンテナを操作しています。
LXD以降、LXCは、直接コンテナを操作するツールから、裏方的なライブラリとして利用されることが多くなったからか、表立って話題になりづらい存在になったため、あまり話題にのぼらなくなったのかなと思います。
LXCは、筆者が初めて本格的にOSS開発に参加したプロダクトで、特別思い入れが強いので、
Incus
Incusは、LinuxContainersプロジェクトで開発されている、コンテナと仮想マシンを同じ操作感で管理できるマネージャです。プロジェクトの新規プロダクトというわけではなく、それまで同じプロジェクトで開発されていたLXDからフォークされました。
2023年7月に、LXDはLinuxContainersプロジェクトのプロダクトから、Canonicalが直接管理するプロダクトになりました
LXDがCanonicalに移動した直後、Aleksa Sarai氏が、LXDを個人でIncusとしてフォークしました。8月に、プロジェクトからアナウンスがあり、このフォークがそのままプロジェクト傘下に入ることが発表されました。gihyo.
このようないきさつで生まれたIncusですので、現時点では機能も操作方法もLXDとほぼ同じです。Canonical主導での開発でなくなったため、UbuntuやCanonical特有の機能が削除されたり、名前が変わったことに伴う変更点はありますが、それ以外はほぼ同じです。またフォーク後にLXDに実装された機能についても、Incus側でフォローして同じ機能が追加されています。
したがって、Incusを使うにあたっては、世の中にあるLXDに関する記事も役に立つでしょう。
また、Incusを含めたプロジェクトのページのほとんどは、私が日本語へ翻訳しており、公式情報を取得するハードルは高くないかと思います。また、Incusのドキュメントも@hnakamur2さんにより翻訳されていますので、Incusを深く使っていく際に役立つでしょう。
オンラインでお試し
Incusにちょっと興味があるけど、自分のPCやホストにインストールすることはためらってしまうなあ、という方には、ウェブブラウザからアクセスして操作できるオンライン試用環境が、プロジェクトから提供されています。この環境では、30分間と使用時間は制限されていますが、最新のIncusを体験できます。
この環境では、Incusを試せるだけでなく、チュートリアルも付属していますので、順を追ってIncusを操作しながら、Incusが体験できます。このお試しサイトのチュートリアルも日本語訳されていますので、さらに気軽に試せるのではないでしょうか。
試用サイトを開くと、図1のようにサービス利用規約が表示されます。同意のためのチェックボックスがありますので、よく読んだあとチェックを入れ、"Start"ボタンを押してください。
最初のページは、環境が説明されているだけなので、"Next"ボタンを押して次へ進むと、図2のように実際にIncusを操作するための説明があります。チュートリアルのコマンド部分をマウスでクリックすると、下部にあるターミナルにそのコマンドが入力されますので、説明を読みながら操作をしていきましょう。
ひととおり試してみて、Incusにさらに興味を持ったら、ぜひご自身のホストにインストールして、さらに色々な機能を体験してみてください。
Incusのインストール
今、あなたはお試しサイトでIncusを体験してみて、Incusがインストールしたくなったところですね? (ˆoˆ)
それでは、Incusをインストールしてみましょう。
Incusは、現時点ではLXDと同じく、Ubuntuで動かすのが簡単で問題が起こりにくいでしょう。他にDebian、Gentoo、Fedora、Arch Linuxでパッケージが利用できます。筆者がメンテナをつとめているPlamo Linuxでも、筆者がパッケージを作成しましたので利用できます。
Ubuntu 20.
インストール方法を、簡単に紹介しておきましょう。同じ内容が、Zabblyのincusリポジトリにも記載されています。ここからの例はUbuntu 22.
最初に、Zabblyの公開鍵を確認し、登録します。
$ curl -fsSL https://pkgs.zabbly.com/key.asc | gpg --show-keys --fingerprint | grep -q '4EFC 5906 96CB 15B8 7C73 A3AD 82CC 8797 C838 DCFD' $ echo $? 0 $ sudo curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc
そして、パッケージリポジトリとしてZabblyのincus Stableリポジトリを追加します。
sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources Enabled: yes Types: deb URIs: https://pkgs.zabbly.com/incus/stable Suites: $(. /etc/os-release && echo ${VERSION_CODENAME}) Components: main Architectures: $(dpkg --print-architecture) Signed-By: /etc/apt/keyrings/zabbly.asc EOF'
あとは、インストールするだけです。
$ sudo apt update $ sudo apt install incus (incusのインストール) $ systemctl status incus (Incusの稼働状況の確認) ○ incus.service - Incus - Daemon Loaded: loaded (/lib/systemd/system/incus.service; indirect; vendor preset> Active: inactive (dead) TriggeredBy: ● incus.socket
もし、Ubuntuのサーバ版に導入した場合、念のためにLXDを止めておくと良いでしょう。
$ sudo snap stop lxd
Incusの初期設定
Incusを使ってコンテナやVMを起動する前に、Incus自身を設定しておく必要があります。
Incusを初期設定する前に、ご自身のユーザーをincus-admin
グループに登録しておくと、root権限で管理コマンドを実行する必要がなくなります。
$ sudo usermod -a -G incus-admin gihyo (gihyoユーザーをincus-adminグループに追加) $ id gihyo uid=1002(gihyo) gid=1002(gihyo) groups=1002(gihyo),120(incus-admin) (incus-adminグループに追加された)
Incusを操作するにはincus
コマンドを使用します。Incusを管理する場合、incus admin
コマンドを実行します。
なお、LXDから移行したい場合は、ここで行う初期化は不要です。あとで説明する移行作業を行ってください。
ここでは、最小セットアップでセットアップしてみます。本格的にセットアップしたい場合は、公式ドキュメント
$ incus admin init --minimal
設定ができましたので、コンテナを作成してみましょう。
$ incus launch images:alpine/edge c1 (コンテナの作成と起動) Creating c1 Starting c1 $ incus list (コンテナの確認) +------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | c1 | RUNNING | 10.31.111.15 (eth0) | fd42:3296:4f20:66f2:216:3eff:fe68:1232 (eth0) | CONTAINER | 0 | +------+---------+---------------------+-----------------------------------------------+-----------+-----------+ $ incus exec c1 -- cat /etc/os-release (コンテナ内の/os-releaseファイルを確認) NAME="Alpine Linux" ID=alpine VERSION_ID=3.18.5 PRETTY_NAME="Alpine Linux v3.18" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
このようにコンテナが起動しました。
この先は、試用サイトのチュートリアルや、日本語ドキュメントを参考に色々な機能を試していってください。
Incusのイメージサーバ
Incusは、Dockerなどと同じくイメージベースで、イメージサーバからイメージを取得してコンテナやVMを起動します。
インストール直後は、インストールしたホスト自身以外に、リモートのサーバがひとつだけ登録されています。この登録されているサーバが、images
という名前がつけられたプロジェクト公式のイメージサーバで、様々なディストリビューションのコンテナやVMのイメージが登録されています。
$ incus remote list (登録されているリモートサーバのリストを取得) +-----------------+------------------------------------+---------------+-------------+--------+--------+--------+ | NAME | URL | PROTOCOL | AUTH TYPE | PUBLIC | STATIC | GLOBAL | +-----------------+------------------------------------+---------------+-------------+--------+--------+--------+ | images | https://images.linuxcontainers.org | simplestreams | none | YES | NO | NO | +-----------------+------------------------------------+---------------+-------------+--------+--------+--------+ | local (current) | unix:// | incus | file access | NO | YES | NO | +-----------------+------------------------------------+---------------+-------------+--------+--------+--------+
公式のイメージサーバに登録されているイメージは、次のようにして取得できます。また、直接ブラウザでhttp://
$ incus image list images: +------------------------------------------+--------------+--------+--------------------------------------------+--------------+-----------------+------------+-------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE | +------------------------------------------+--------------+--------+--------------------------------------------+--------------+-----------------+------------+-------------------------------+ | almalinux/8 (3 more) | 604c85cafc02 | yes | Almalinux 8 amd64 (20240102_23:08) | x86_64 | CONTAINER | 128.55MiB | Jan 2, 2024 at 12:00am (UTC) | +------------------------------------------+--------------+--------+--------------------------------------------+--------------+-----------------+------------+-------------------------------+ | almalinux/8 (3 more) | c14b8e0d9491 | yes | Almalinux 8 amd64 (20240102_23:08) | x86_64 | VIRTUAL-MACHINE | 749.71MiB | Jan 2, 2024 at 12:00am (UTC) | +------------------------------------------+--------------+--------+--------------------------------------------+--------------+-----------------+------------+-------------------------------+ :(略)
ブラウザでご覧いただくとわかるように、このサーバにはLXC用、Incus用それぞれのコンテナ用、VM用のイメージが登録されています
イメージは、同じプロジェクトのdistrobuilderというイメージ作成ツールを使って毎日作成されています。また、作成状況は公開されています。
さて、ここまでは初めてIncusをインストールして使ってみようという方にむけた案内でした。ここからは、これまでLXDを使ってきており、これからIncusに移行したいという方のために、移行方法やLXDから変わった点を紹介します。
LXDからの移行
すでにLXDを使っており、Incusへ移行したい場合は、簡単に移行できるコマンドが付属しています。lxd-to-incus
コマンドです。initとしてsystemdとOpenRCを使っているシステムでの移行がサポートされていますので、ほとんどの環境で移行ができるはずです。
lxd-to-incus
コマンドは、Incus 0.
次のように、LXD上でコンテナが3台起動している環境があるとします。
$ lxc version Client version: 5.0.2 Server version: 5.0.2 $ lxc list +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | alpine | RUNNING | 10.51.9.90 (eth0) | fd42:3b68:50f9:9a19:216:3eff:fe12:b4ff (eth0) | CONTAINER | 0 | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | plamo | RUNNING | 10.51.9.160 (eth0) | fd42:3b68:50f9:9a19:216:3eff:fe6f:ebd1 (eth0) | CONTAINER | 0 | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | ubuntu | RUNNING | 10.51.9.108 (eth0) | fd42:3b68:50f9:9a19:216:3eff:fecc:e4cc (eth0) | CONTAINER | 0 | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+
この状態で、lxd-to-incus
コマンドを実行します。
$ sudo lxd-to-incus :(略) The migration is now ready to proceed. At this point, the source server and all its instances will be stopped. Instances will come back online once the migration is complete. Proceed with the migration? [default=no]: yes :(略) Uninstall the LXD package? [default=no]:
途中で、マイグレーションを進めるかどうかの確認と、LXDを削除するかどうかを確認される以外は、自動で処理が進みます。
コマンド実行が終了したあと、移行が済んでいるかを確認してみましょう。
$ incus list +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | alpine | RUNNING | 10.51.9.90 (eth0) | fd42:3b68:50f9:9a19:216:3eff:fe12:b4ff (eth0) | CONTAINER | 0 | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | plamo | RUNNING | 10.51.9.160 (eth0) | fd42:3b68:50f9:9a19:216:3eff:fe6f:ebd1 (eth0) | CONTAINER | 0 | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+ | ubuntu | RUNNING | 10.51.9.108 (eth0) | fd42:3b68:50f9:9a19:216:3eff:fecc:e4cc (eth0) | CONTAINER | 0 | +--------+---------+--------------------+-----------------------------------------------+-----------+-----------+
さきほどまでLXDで動いていたコンテナが、Incus上で動いていることがわかります。
lxd-to-incus
コマンドは、コンテナを移行するだけでなく、LXDサーバの設定も読み取り、きちんとIncus側に設定してくれます。またストレージプールは、LXDと同じファイルシステム、同じ設定でIncus側に設定されます。
lxd-to-incus
は、Incusがバージョンアップされるとともに機能が追加されています。0.
LXDからの変更点
IncusはLXDからのフォークですので、基本的には、フォーク以前にLXDが持っていた機能は使えます。しかし、新たなプロダクトとして開発がスタートしたわけですから、LXDでは後方互換性を確保するために維持されていたものの、不要と判断した機能を削除するには良いタイミングでした。そこで、LXDが持っている機能から削除された機能があります。
その他、変更された機能や、変更されたコマンドラインツールがありますので、主な変更点を紹介します。
APIの変更
Incusは、インスタンスを操作するためにREST APIが使えます。
LXDが仮想マシンをサポートするようになったときに、コンテナとVMの両方を操作する共通のエンドポイントとして/1.
を使うようになりました。しかし、それまでの古いクライアントのために、コンテナ操作用に/1.
エンドポイントが残されていました。
この、/1.
エンドポイントが廃止されました。また、/1.
との対比で、仮想マシン用に/1.
エンドポイントが準備されていました。このエンドポイントも同時に削除されました。
Incusへのフォークとともに、このような古いクライアントに対して互換性を維持するために残されていた機能が削除されました。
また、ゲストのコンテナや仮想マシンからLXDにアクセスするために/dev/
というソケットが公開されていました。この/dev/
は、Incusでは/dev/
に変更されました。互換性維持のために/dev/
も残されています。
incus snapshot
コマンド
LXDには、lxc snapshot
というコマンドがありました。このコマンドは、スナップショットの作成のみができました。
スナップショットをリネームしたり削除したりする場合は、lxc rename
コマンドやlxc delete
コマンドを使う必要がありました。
少し整合性が取れない感じでしたので、incus snapshot
コマンドにサブコマンドが追加され、incus snapshot
コマンドですべてのスナップショット操作を行うように変更されました。
$ incus snapshot --help 説明: Manage instance snapshots Usage: incus snapshot [flags] incus snapshot [command] Available Commands: create Create instance snapshot delete Delete instance snapshots list List instance snapshots rename Rename instance snapshots restore Restore instance snapshots :(略)
incus admin
LXDでは、LXDデーモン自身を設定するにはlxd init
コマンドを使用しました。しかし、Incusでは、すべてincus
コマンドを使用するようになり、Incusデーモン自身を設定するにはincus admin
コマンドを使います。
先に紹介した、初期設定するためのincus admin init
コマンド以外は、クラスターを管理するためのコマンドや、デーモンを停止したり起動待ちを行うコマンドがあります。
ちなみにIncusデーモンはincusd
というファイルです。
Cowsql
Incusで使用するデータベースが変更されました。
LXDではデータベースとして、クラスター環境で動作する、SQLiteをベースとした高可用データベースであるDqliteを使用していました。
Incusがフォークされたあと、Dqliteのオリジナル作者がDqliteをCowsqlとしてフォークし、IncusはCowsqlを使用するようになりました。DqliteとCowsqlは、ほぼ互換性があり、LXDのデータは簡単にCowsqlに移行できるようです。
Incusを使う上では、この変更を意識することはないはずです。
パスワード認証の廃止
LXD開発当初から、リモートのLXDサーバに接続する際にパスワード認証が使えました。
その後、よりセキュアな認証として、証明書を使った方式や、時間制限があるトークンを使用した方式が追加されました。
パスワード認証は十分にセキュアな方式とは言えませんので、Incusでは廃止されました。
認証についての詳細は公式ドキュメントの
shiftfsサポートの削除
shiftfsは、この連載の第47回で、非特権でコンテナイメージをマウントするための機能として紹介しています。
ユーザ名前空間を使って一般ユーザー権限で起動するコンテナでは、マウントする時点で、コンテナイメージ内のファイルやディレクトリの所有権を、コンテナを起動させようとしているユーザのUID/chown(2)
システムコールを使用して、所有権を変更していました。イメージ内のすべての所有権を変更する処理はコストが高い処理ですので、この問題を解決するために2017年ごろにshiftfsというファイルシステムが提案されました。
その後Ubuntuでは、shiftfsのパッチが適用された状態で、カーネルがリリースされるようになりました。LXDでは、shiftfsが使える場合は、コンテナ起動時にその機能を使ってコンテナを起動させていました。
しかし、shiftfsには色々と問題があり、結局Linuxカーネルに機能が導入されることはありませんでした。しかし、必要性は変わりませんので、その後も機能に対する議論や実装は続きました。
その後5.
LXDでも、ID mappedマウントをサポートしたカーネル環境では、ID mappedマウントを使うように実装されました。したがって、IncusでもID mappedマウントが使えます。このため、問題があり、使用できる環境が限られるshiftfsのサポートは削除されました。
その他Canonical/Ubuntu機能の削除
LXDは、Canonical社のエコシステムを確立するために、Ubuntu独自の機能や、Canonical社のソリューションをサポートした機能を持っていました。
Incusでは、UbuntuやCanonical社が提供する、Linuxで標準的ではないソリューションに依存する機能は削除されました。
そもそも、これらの機能は、カーネルにマージされておらず、独自パッチを使って実現している機能であったり、十分にメンテナンスされていないためにあまり使われていない機能であったり、実現できる機能に制約があったりしました。代わりとなる機能がすでに実装済みだったりしますので、問題となることは少ないでしょう。
- Ubuntu Fanブリッジ (Ubuntu Weekly Topics 2015年6月26日号の解説)
- Canonical Candid
- Canonical RBAC
- Canonical MAAS
これらの機能を使っている場合は、Incusへ移行せずに、引き続きLXDを使う必要があります。
LXDとの決別
この記事を、2023年末から少しずつ書き進めている間に、大きなニュースが飛び込んできました。
LXD 5.
これまで、LXDはApache 2.
Incusは、Apache 2.
筆者はライセンスについて詳しくはありませんので、この変更について詳細に説明できません。LinuxContainersプロジェクトでは次のような判断をしています。
- LXDの変更はIncusにインポートできない
- Incusの変更はLXDにインポートできない
Incus 0.
つまり今後は、LXDとIncusそれぞれが別々に開発していくことになるでしょう。
この件に関連して、LXDを使っているユーザは、今後徐々にLinuxContainersプロジェクトが運営しているイメージサーバimages
)
プロジェクトが運営しているイメージサーバからイメージを取得してコンテナを運用しているユーザは、Incusへの移行を急ぐ必要があるでしょう。
ちなみにLXDでは、プロジェクトが運営しているイメージサーバ以外に、UbuntuのイメージサーバからUbuntuイメージを取得して使えましたので、そちらのみを使用しているユーザには影響はありません。
この件についての詳細は、Incus 0.
まとめ
今回は、新たにLinuxContainersプロジェクトに加わったプロダクトである、Incusを紹介しました。
Incusを使う場合、新たにIncusをインストールする場合でもLXDから移行する場合でも、今回説明したとおり、Incusを使いはじめるにはそれほど大きな手間がかからず、簡単に使い始められるでしょう。
現在、コンテナといえば、アプリケーションコンテナが一般的です。しかし、OS環境を作成し、パッケージをインストールして、OS環境内で色々試したいと言ったことは多いでしょう。また、手元で複数のシステムを起動させて、小さなプライベートクラウドのように使いたい場合もあるでしょう。そのような場合に、色々なディストリビューションのイメージを取得して、簡単に起動できるIncusは非常に便利です。さらに、コンテナだけでは評価できないようなことを行いたい場合でも、同じ操作でVMを操作できます。
また、Incusは公式サイトも公式ドキュメントも日本語に翻訳されており、高度な使い方をしたくなった場合でも機能や設定について簡単に調べられます。また、これまでのUbuntu Weekly RecipeのLXDの記事も参考になるはずです。
ぜひ、この記事をきっかけにIncusの世界に飛び込み、Incusを使って、学習や自分がやりたいことを実現する方が増えることを期待しています。