Ubuntu Weekly Recipe

第609回 LXDからコンテナではなく仮想マシンを起動する

この記事を読むのに必要な時間:およそ 10 分

第521回「入門システムコンテナマネージャーLXD 3.0」をはじめとして本連載で何度も登場しているLXDは,システムコンテナの管理ツールです。つまりホストマシン上で動いているLinuxカーネルのコンテナ関連機能を用いて構築された隔離システムを立ち上げることを想定しています。そんなLXDが最近のリリースで,コンテナだけでなく「仮想マシン」もサポートするようになりました。今回はLXDの最新版を使って仮想マシンを起動してみましょう。

QEMUを利用した仮想マシンサポート

繰り返しになりますが,LXDはシステムコンテナの管理ツールです。Dockerのようなプロセスコンテナ(アプリコンテナ)とは異なり,システムコンテナではinitプロセスも含むシステム一式をまるまるコンテナの中で立ち上げます。つまりホストとゲストでカーネルを共有し,コンテナ機能を用いてホストと隔離していること以外は,⁠軽量の仮想マシンのようなもの」として利用するのです※1⁠。

※1
便宜上,Dockerなども含めて「コンテナ型仮想化」なんて表現も使われますが,実際のところは何か物理的なデバイスやリソースを仮想的にシミュレートしているわけではありません。単純にカーネルの機能を用いて隔離しているだけです。⁠軽量の仮想マシンのようなもの」という説明も実際に重要なのは「軽量」の部分であり,⁠仮想マシン」の部分に関しては用途や文脈によって「仮想マシンとは似ても似つかない」ものであることに注意が必要です。

もちろん「〜〜こと以外は」の違いは重要で,LXDではLinux以外のシステムを起動できませんし,隔離・権限の兼ね合いでインスタンス上では動かない機能も存在するなど,⁠仮想マシンならできるのに」となることも多々あります。

LXDは今風のコマンド体系を導入することで,インスタンスの作成から設定・起動,ログインに至るまで,非常にシンプルかつわかりやすいインターフェースとなっています。このインターフェースを仮想マシンの管理にも適用しようとしたのかどうかは不明ですが,LXD 3.19において本当の意味での仮想マシン管理機能が実装されました。

LXDの仮想マシン対応の正体は,端的に言うと「内部でQEMUコマンドを実行する」です。よって,できること・できないことはQEMU/KVMと同じであり,UI/APIのみをLXDが担う形になります。

ところでQEMUのラッパーツールという意味では,第590回「Windows/macOS/Linuxで使える仮想マシン管理ツール『multipass⁠⁠」で紹介したmultipassもまた,⁠LXDのようなUIを使って仮想マシンを操作するツール」になります。単に仮想マシン関連の機能だけ比較すると,LXDとmultipassにそこまで大きな違いはありません。

むしろmultipassには「マルチプラットフォーム」という強みがあります。つまりWindows版はHyper-Vを,macOS版はHyperKitを活用することで,OSの違いをmultipass側が吸収しているのです。LXDは,コンテナ機能部分がLinuxに依存する都合上,どうしてもマルチプラットフォームを目指すには難があります※2⁠。さらにLXDは,今後コンテナでも実現できていた機能が仮想マシンでも使えるようになる見込みです。将来的にはLXDのほうが利便性が高くなるかもしれません。

※2
WSL2の上でならLXDを動かすことが,理論上は可能です。

同じQEMUを使うツールとは言え,当面の間はLXDとmultipassでそれぞれ別の用途として住み分けていくことになるでしょう。ちなみにLXDもmultipassも,今のところグラフィックディスプレイ付きの仮想マシンは想定していません。つまりデスクトップOSを仮想マシンにインストールしたいなら,従来通りのvirt-managerやVirtualBox,VMWareなどを活用してください。もちろんLXD/multipassに「ubuntu-desktop」パッケージをインストールした上で,RDPやX転送,SPICEなどを利用してリモートデスクトップとして使うことは可能です。

multipassのインスタンス上に最新のLXDをインストールする

さて,実際にLXDの仮想マシン機能を使ってみることにします。

仮想マシン機能が導入されたのはLXD 3.19です。LXDは3.0.xが安定版となるLTSリリース,3.xが新機能を追加するフィーチャーリリースとして,異なるリリース周期を持っています。フィーチャーリリースはほぼ毎月のペースで新バージョンがリリースされ,新機能が追加されるため,プロダクション用途であれば,LTS版のUbuntuとLTS版のLXDを組み合わせて使うことをおすすめします。仮想マシン機能がLTSリリースに登場するのは,おそらく今年の4月ぐらいにリリースされる見込の,LXD 4.0になることでしょう。

おそらく本連載の読者のほとんどは,LTSリリースのLXDを使っているはずです。よって既存のLXDに影響を与えないように,仮想マシンの中にフィーチャーリリースのLXDをインストールすることにしましょう。第590回で紹介したように,multipassを使えばかんたんにUbuntuの仮想マシンを用意できますからね。しかしながら今回試したいのはLXDの仮想マシン機能です。つまり,仮想マシンの中で仮想マシンを使えなくてはなりません。いわゆる「Nested KVM」というものです。まずはその設定を行うことにしましょう。

Nested KVMが有効かされているかどうかは次のコマンドで確認できます。

$ cat /sys/module/kvm_intel/parameters/nested
N

Nなら無効になっていて,Yなら有効になっています。AMD CPUを使っている場合は,上記のkvm_intelkvm_amdに置き換えてください。

Ubuntuは19.04から標準でIntel CPUのNested KVM機能が有効化されました。AMD CPUについては18.04より前から有効化されていたようです。もしUbuntu 18.04 LTSをインストールしたマシンの上で,multipassを用いて作成した環境の中でLXDの仮想マシン機能を利用したいなら,次のように手動で有効化してください。

$ echo 'options kvm_intel nested=1' | sudo tee -a /etc/modprobe.d/kvm.conf
optionns kvm_amd nested=1
$ sudo modprobe -r kvm_intel
$ sudo modprobe kvm_intel
$ cat /sys/module/kvm_intel/parameters/nested
Y

ちなみにqemu-system-x86パッケージをインストールしている場合,同様の設定を行うファイルが「/etc/modprobe.d/qemu-system-x86.conf」として作られています。設定済みであれば,上記対処は不要です。またVirtualBoxなど他の仮想化ソフトウェアを使って,仮想マシンを構築する場合は,それぞれの設定手順に従ってください。ヘルプやUIを「Nested Virtualization」という単語で調べれば,おおよそ見つかるはずです。

Nested KVMの準備ができたら,multipassをインストールします。昨年12月に安定版がリリースされたので,--betaなどのオプションは不要になりました。

$ sudo snap install multipass --classic

無事にインストールできたら,仮想マシン(multipassのインスタンス)「nested」という名前で立ち上げましょう。今回はインスタンスの中でさらに仮想マシンを起動するため,CPUを2コアに,メモリーを8GiBに,ストレージを100GiBにしています。⁠lts」はベースイメージ名で,今回は最新のLTSを指定しています。インストールしたらmultipass execでパッケージもアップデートしておきます。

$ multipass launch -c 2 -m 8G -d 100G --name nested lts
$ multipass exec nested -- sudo sh -c "apt update && apt full-upgrade -y"
$ multipass exec nested -- cat /sys/module/kvm_intel/parameters/nested
N

ちなみに,インスタンスの中の仮想マシンはNested KVMがオフになっています。これについても,前述と同じ方法で再度ネスト可能です。

ここに最新のLXDをインストールします。

$ multipass exec nested -- sudo snap install lxd --stable
2020-02-25T20:13:23+09:00 INFO Waiting for restart...
lxd 3.21 from Canonical✓ installed

--stableを指定すると,最新のフィーチャーリリース(上記例では3.21)がインストールされます。LTSリリースをインストールしたい場合は--channel=3.0/stableのようにバージョン名を指定してください。

Ubuntu 18.04 LTSのインスタンスにはDebianパッケージ版のLXDがインストール済みなので,snapパッケージ版に移行しておきます。

$ multipass exec nested -- sudo lxd.migrate
=> Connecting to destination server
=> Running sanity checks
The source server is empty, no migration needed.

The migration is now complete and your containers should be back online.
Do you want to uninstall the old LXD (yes/no) [default=yes]? yes

All done. You may need to close your current shell and open a new one to have the "lxc" command work.
To migrate your existing client configuration, move ~/.config/lxc to ~/snap/lxd/current/.config/lxc

途中で「yes」と応えているのは,Debianパッケージ版をアンインストールするかどうか,です。基本的に移行後は不要になるはずなので,⁠yes」と答えておけば良いでしょう。

さらにlxd initコマンドでLXDの初期設定を行います。今回はストレージバックエンドをbtrfsに,さらにストレージサイズを80GiBにする以外は,標準設定のままで良いことにして,次のように設定します。

$ multipass exec nested -- sudo lxd init \
  --storage-backend btrfs \
  --storage-create-loop 80 \
  --auto

これで準備完了です。LXDそのものの使い方については,第521回から始まるLXD関連の記事を参照してください※3⁠。

※3
本連載のLXD記事をベースにいくつか修正・追記を行った「ふわっと知りたいLXD」も電子書籍版をBOOTHで,物理冊子版(電子書籍版ダウンロードコード付き)とらのあなで販売しているので,インターネットを活用できない環境でLXDを利用したい方はぜひご購入ください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。