Ubuntu Weekly Recipe

第683回LXDコンテナ上にUbuntuのフルデスクトップ環境を構築する

第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で確認した手順を紹介します。

$ lxc --version
4.18

コンソール画面にアクセスするためにSPICEクライアントが必要になります。LXDの場合、remote-viewerコマンドもしくはspicyコマンドがインストールされていたら、それを起動します。よってremote-viewerコマンドを提供するvirt-viewerパッケージをインストールしておきましょう。

$ sudo apt install virt-viewer

さらにLXDがvirt-viewerがインストールされていることを把握できるように、上記インストール後は一度LXDデーモンを再起動しておきます。

$ sudo systemctl reload snap.lxd.daemon.service

次に空のインスタンスを作成し、ストレージのサイズを拡張しておきます。今回はVMインスタンス--vmを、2コアのCPU-c limits.cpu=2と8GiBのメインメモリー-c limits.memory=8GiBで作ることにしましょう。

$ lxc init desktop --empty --vm -c limits.cpu=2 -c limits.memory=8GiB
Creating desktop

$ lxc config device override desktop root size=50GiB
Device root overridden for desktop

Ubuntuのインストーラーのメディアを起動デバイスとして追加しておきます。

$ lxc config device add desktop iso disk \
  source=$PWD/ubuntu-20.04.3-desktop-amd64.iso boot.priority=10
Device iso added to desktop

準備ができたらコンソールを有効化して仮想マシンを起動しましょう。

$ lxc start desktop --console=vga
図1 起動後にインストーラーメディアのチェックが行われる
図1
図2 見慣れたインストーラーが起動した
図1

あとは普通にUbuntuをインストールするだけです。インストーラーが完了したら再起動してください。ただしLXDの場合、インストーラーの終了後の「メディアの取り外し」のためにEnterを押しても取り外されません。またlxcコマンドからのメディアの取り外しも、インスタンス停止時にしか行えません。結果的に、起動優先度次第では、次回起動時はそのままインストーラーが再度起動してしまうかもしれません。具体的には再起動後に次のコマンドでコンソール接続してみてください。

$ lxc console desktop --type=vga

もしもう一度インストーラーが起動してしまっていたら、まずはコンソール画面を表示したままホスト側でlxc stop desktopを実行しましょう。メディアの取り外し画面が表示されるので、再度Enterを押すとインスタンスが終了します。その後、次の手順で明示的にメディアを削除し、インスタンスを起動してください。

$ lxc config device remove desktop iso
$ lxc start desktop

あとは再びlxc consoleでデスクトップに接続するだけです。とても簡単にデスクトップ環境を準備できました。

VMコンテナの中で何ができるのか

実はQEMUを用いた仮想マシンの活用方法は、本連載でも過去に紹介しています。特に今回の話と関わりが深そうなのが次の記事です。

これらの記事はいずれも、QEMUのさまざまなオプションを活用して仮想マシンにいろいろな機能を実現してきました。実はLXDの仮想マシンインスタンスはこれらがすべて設定済みなので、ほぼ何もしなくても上記の機能を享受できるのです。

順番に見ていきましょう。まず、LXDのVMインスタンスを起動するとおおよそ次のようなオプションでQEMUのコマンドが実行されます。

/snap/lxd/21468/bin/qemu-system-x86_64
  -S
  -name desktop
  -uuid a3c7656a-5740-4f6d-8185-16a8a409ddac
  -daemonize
  -cpu host
  -nographic
  -serial chardev:console
  -nodefaults
  -no-user-config
  -sandbox on,obsolete=deny,elevateprivileges=allow,spawn=deny,resourcecontrol=deny
  -readconfig /var/snap/lxd/common/lxd/logs/desktop/qemu.conf
  -spice unix=on,disable-ticketing=on,addr=/var/snap/lxd/common/lxd/logs/desktop/qemu.spice
  -pidfile /var/snap/lxd/common/lxd/logs/desktop/qemu.pid
  -D /var/snap/lxd/common/lxd/logs/desktop/qemu.log
  -smbios type=2,manufacturer=Canonical Ltd.,product=LXD
  -runas lxd

この時点でも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の中で次のように記述されています。

# Firmware (read only)
[drive]
file = "/snap/lxd/current/share/qemu/OVMF_CODE.fd"
if = "pflash"
format = "raw"
unit = "0"
readonly = "on"

# Firmware settings (writable)
[drive]
file = "/var/snap/lxd/common/lxd/virtual-machines/desktop/qemu.nvram"
if = "pflash"
format = "raw"
unit = "1"

このうちqemu.nvramはインスタンスの初回起動時に生成されます。セキュアブートが無効化されていなければ-c security.secureboot=falseが指定されていなければ⁠⁠、/snap/lxd/current/share/qemu/OVMF_VARS.ms.fdが使われます。これは設定済みのPK/KEKとさらにMicrosoftのUEFI CAが取り込まれたファイルです。

$ strings /snap/lxd/current/share/qemu/OVMF_VARS.ms.fd | grep -E "CA|KEK"
%Microsoft Windows Production PCA 20110
"Microsoft Corporation UEFI CA 20110
$Ubuntu OVMF Secure Boot (PK/KEK key)1,0*
$Ubuntu OVMF Secure Boot (PK/KEK key)1,0*
!Microsoft Corporation KEK CA 20110
$Ubuntu OVMF Secure Boot (PK/KEK key)1,0*
$Ubuntu OVMF Secure Boot (PK/KEK key)1,0*

これらによりLXDのVMインスタンスはあらかじめセキュアブートが有効化されています。

$ dmesg | grep -i secure
[    0.000000] secureboot: Secure boot enabled
[    0.000000] Kernel is locked down from EFI Secure Boot mode; see man kernel_lockdown.7
[    0.011229] secureboot: Secure boot enabled
[    1.075390] Loaded X.509 cert 'Canonical Ltd. Secure Boot Signing: 61482aa2830d0ab2ad5af10b7250da9033ddcef0'

SPICEプロトコルの対応

SPICEは単なる画面の転送にとどまらず、デバイスのパススルーやクリップボードの共有を実現するためのプロトコルです。

QEMU単体で使う場合は、さまざまなコマンドラインオプションを駆使する必要がありましたが、これもLXDではある程度設定済みの状態で起動します。

  • SPICEプロトコルを利用した高品質・高速なディスプレイの描画
  • ゲスト・ホスト間のクリップボードの共有
  • ホストからゲストへのファイルのドラッグアンドドロップ
  • ゲスト・ホスト間のファイル共有
  • USBリダイレクト機能

このあたりはすべてqemu.confに記述済みですので、何もせずとも動いています。インストールの時点でSPICEクライアントは使っているはずですし、たとえばクライアントのウィンドウのサイズを変更するとそれにあわせてゲスト側の画面解像度も追随するはずです。

クリップボードもテキストなら普通にコピー&ペーストができますし、ホストからゲストのウィンドウにファイルをドラッグアンドドロップするとゲストの「ダウンロード」ディレクトリに保存されます。

ただし「ゲスト・ホスト間のファイル共有」はうまく動きませんでした。設定はあるはずなので動いてもおかしくなさそうですが、原因は不明です。

また、オーディオや3Dアクセラレーションは有効化されていません。これは別途対応が必要です。とはいえ3Dアクセラレーションは、そこそこ良いCPUならLLVMpipeのおかげもあって、デスクトップの描画ぐらいならストレスなく動きます。いずれにせよ、最低限の機能は動いていると考えて良いでしょう。

折しも今年はLinuxデスクトップ元年です[1]⁠。ぜひLXDに好みのLinuxデスクトップ環境をインストールしてみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧