第679回ではLXD/VMの上にWindows 10をインストールしました。Windowsが動くなら他のOSも動きそうです。仮想マシンでとりあえず動かしてみるOSと言えばなんでしょう。もちろん、Ubuntuですね。 今回は別バージョンのUbuntuデスクトップを仮想マシンとして使いたいけれども、どうせならLXDのCLIで仮想マシンを管理したいという少しねじまがった性癖をお持ちのあなたに向けて、 LXDインスタンスの上でUbuntuデスクトップを動かしてみます。
Ubuntuデスクトップ上でUbuntuデスクトップを動かしたい
LXDにはコンテナインスタンスとVMインスタンスの2種類が存在します。コンテナインスタンスはLinuxのコンテナ機能を利用しています。それに対してVMインスタンスはQEMUを利用した仮想マシンです。
コンテナインスタンスでもデスクトップ環境一式をインストールすれば、デスクトップ環境にリモートログインできます。この場合はVNC/RDPなどを使うことになるでしょう。ただしそれなりに下準備が必要なのと、コンテナ固有の事情を考慮しなくてはいけないことから、普通のデスクトップとは少し趣が異なります。
それに対してVMインスタンスについては、よりシンプルです。QEMUがバックエンドであるため、VirtualBoxやVirtManagerと同じような感じで利用できます。仮想マシンの場合は、ウィンドウがVGAコンソールとなり、普通のUbuntuのインストーラーをそのまま使えるのが一般的です。ただしLXDの場合は、VirtualBoxのように専用の描画ウィンドウが存在しないため、仮想マシンであっても何らかの外部クライアントをインスタンスに接続させ、リモートのデスクトップを表示する仕組みが必要です。
VMインスタンスでGUI環境を実現する方法は2種類存在します。
- 仮想マシンインスタンスを起動して、Ubuntuデスクトップ関連のパッケージをインストールする
- 空の仮想マシンインスタンスを構築し、起動デバイスとしてUbuntuインストーラーのISOイメージを指定する
今回は後者の方法を解説します。前者のほうが簡単そうに見えますが、実は前者はクラウドイメージをベースにしています。Ubuntuデスクトップとは初回にインストールされるパッケージが異なるだけでなく、カーネルも小さなサイズになるよう仮想マシンに必要ないドライバー類を極力削っているのです。結果、状況によってはカーネルの入れ直し等いくつかの対応が必要になります。それに対して後者は、普通にUbuntuをインストールするところからはじめます。手間は増えるものの、普段使っているデスクトップのインストーラーをそのまま利用するため、そこまで面倒ではないでしょう。
第679回の「LXD上にWindowsをインストールする」ではWindowsのインストーラーにあらかじめVirtIOのドライバーをインストールした上で、SPICEプロトコルでアクセスできるようにしました。Ubuntuの場合は、最初からSPICEプロトコルが使えるため、インストーラー側に特別なカスタマイズは不要です。
ちなみに、そもそもVirtualBoxやVirtManager/GNOME Boxesを愛用しているなら、わざわざLXDを使う必要はありません。特に「古いUbuntuデスクトップ」をインストールするなら、VirtualBoxのほうが良い場合も多くあります。「サーバーと同じようにCLIでインスタンスを管理したい」「Ubuntuが公式にサポートしているツールで管理したい」「何が何でもLXDで完結したい」、今回紹介する方法はそういう目的がある場合にのみ意味が出てきます。
インストールはとっても簡単
手順自体はWindowsをインストールした第679回と大差ありません。
まずLXD 4.4以降が必要です。これはインストール時に必要なVGAコンソールを取得できるようになったのが、このバージョン以降だからです。Ubuntu 20.04 LTS等のプレインストールなLXDの場合、LXD 4.0.xになっているので適宜アップグレードしてください。また、ホストシステムはデスクトップ版のほうが確実です。サーバー版でもSSH経由のX転送等でVGAコンソールを起動できるようではあるものの、いくつかの報告を見ていると余計なトラブルにハマりやすい傾向があるようです。
今回は最新の4.18で確認した手順を紹介します。
コンソール画面にアクセスするためにSPICEクライアントが必要になります。LXDの場合、remote-viewerコマンドもしくはspicyコマンドがインストールされていたら、それを起動します。よってremote-viewerコマンドを提供するvirt-viewerパッケージをインストールしておきましょう。
さらにLXDがvirt-viewerがインストールされていることを把握できるように、上記インストール後は一度LXDデーモンを再起動しておきます。
次に空のインスタンスを作成し、ストレージのサイズを拡張しておきます。今回はVMインスタンス(--vm
)を、2コアのCPU(-c limits.cpu=2
)と8GiBのメインメモリー(-c limits.memory=8GiB
)で作ることにしましょう。
Ubuntuのインストーラーのメディアを起動デバイスとして追加しておきます。
準備ができたらコンソールを有効化して仮想マシンを起動しましょう。
あとは普通にUbuntuをインストールするだけです。インストーラーが完了したら再起動してください。ただしLXDの場合、インストーラーの終了後の「メディアの取り外し」のためにEnterを押しても取り外されません。またlxcコマンドからのメディアの取り外しも、インスタンス停止時にしか行えません。結果的に、起動優先度次第では、次回起動時はそのままインストーラーが再度起動してしまうかもしれません。具体的には再起動後に次のコマンドでコンソール接続してみてください。
もしもう一度インストーラーが起動してしまっていたら、まずはコンソール画面を表示したままホスト側で「lxc stop desktop
」を実行しましょう。メディアの取り外し画面が表示されるので、再度Enterを押すとインスタンスが終了します。その後、次の手順で明示的にメディアを削除し、インスタンスを起動してください。
あとは再びlxc consoleでデスクトップに接続するだけです。とても簡単にデスクトップ環境を準備できました。
VMコンテナの中で何ができるのか
実はQEMUを用いた仮想マシンの活用方法は、本連載でも過去に紹介しています。特に今回の話と関わりが深そうなのが次の記事です。
これらの記事はいずれも、QEMUのさまざまなオプションを活用して仮想マシンにいろいろな機能を実現してきました。実はLXDの仮想マシンインスタンスはこれらがすべて設定済みなので、ほぼ何もしなくても上記の機能を享受できるのです。
順番に見ていきましょう。まず、LXDのVMインスタンスを起動するとおおよそ次のようなオプションでQEMUのコマンドが実行されます。
この時点でもSPICEの設定がされていることがわかりますね。ポイントはインスタンスごとに用意される設定ファイルである「/var/snap/lxd/common/lxd/logs/desktop/qemu.conf
」です。この中にさまざまな設定が含まれています。
UEFIファームウェアとセキュアブート
QEMUでセキュアブートを利用するためにはUEFIファームウェアのFLOSSの実装であるOVMFを利用し、OVMFの変数領域にPlatform Key(PK)とKey Exchange Key(KEK)を保存する必要がありました。
OVMFの指定はqemu.confの中で次のように記述されています。
このうち「qemu.nvram
」はインスタンスの初回起動時に生成されます。セキュアブートが無効化されていなければ(-c security.secureboot=false
が指定されていなければ)、/snap/lxd/current/share/qemu/OVMF_VARS.ms.fd
が使われます。これは設定済みのPK/KEKとさらにMicrosoftのUEFI CAが取り込まれたファイルです。
これらによりLXDのVMインスタンスはあらかじめセキュアブートが有効化されています。
SPICEプロトコルの対応
SPICEは単なる画面の転送にとどまらず、デバイスのパススルーやクリップボードの共有を実現するためのプロトコルです。
QEMU単体で使う場合は、さまざまなコマンドラインオプションを駆使する必要がありましたが、これもLXDではある程度設定済みの状態で起動します。
- SPICEプロトコルを利用した高品質・高速なディスプレイの描画
- ゲスト・ホスト間のクリップボードの共有
- ホストからゲストへのファイルのドラッグアンドドロップ
- ゲスト・ホスト間のファイル共有
- USBリダイレクト機能
このあたりはすべてqemu.confに記述済みですので、何もせずとも動いています。インストールの時点でSPICEクライアントは使っているはずですし、たとえばクライアントのウィンドウのサイズを変更するとそれにあわせてゲスト側の画面解像度も追随するはずです。
クリップボードもテキストなら普通にコピー&ペーストができますし、ホストからゲストのウィンドウにファイルをドラッグアンドドロップするとゲストの「ダウンロード」ディレクトリに保存されます。
ただし「ゲスト・ホスト間のファイル共有」はうまく動きませんでした。設定はあるはずなので動いてもおかしくなさそうですが、原因は不明です。
また、オーディオや3Dアクセラレーションは有効化されていません。これは別途対応が必要です。とはいえ3Dアクセラレーションは、そこそこ良いCPUならLLVMpipeのおかげもあって、デスクトップの描画ぐらいならストレスなく動きます。いずれにせよ、最低限の機能は動いていると考えて良いでしょう。
折しも今年はLinuxデスクトップ元年です[1]。ぜひLXDに好みのLinuxデスクトップ環境をインストールしてみてはいかがでしょうか。