Ubuntu Weekly Recipe

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

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

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

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

もちろん「〜〜こと以外は」の違いは重要で、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のほうが利便性が高くなるかもしれません。

同じ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]⁠。

LXD上で仮想マシンインスタンスを作る

multipass上のLXDから仮想マシンインスタンスを作成しましょう。まず、コマンドを簡略化するため、あらかじめmultipassインスタンスにログインしておきます。

$ multipass shell nested

multipassインスタンス内部のコマンドプロンプトは、ここではnested$としておきます。

もちろんここまで説明したようなホスト上からmultipass exec経由で操作することも可能です。ただしmultipass execコマンド経由だと、snap関連コマンドのPATHが通っていないため、もし利用するなら次のように実行してください。

$ multipass exec nested -- sudo -i -u ubuntu lxc (LXDコマンドのオプション)

仮想マシン用プロファイルの作成

さて、仮想マシンを作る前に、仮想マシンインスタンス用のプロファイルを作成します。

nested$ lxc profile create vm
Profile vm created

nested$ openssl passwd -6 ubuntupassword
$6$iFWJK0DR0buaZcAC$h16dzYSH2/iEBwK0PG6eZ1.eCft.Dk3997aVkYA5/a33c29JDyrIbr76xQd.OMUfGjgmFvF0PZJ2jwZ0cRqVB.

nested$ cat <<'EOF' | lxc profile edit vm
config:
  user.user-data: |
    #cloud-config
    ssh_pwauth: yes
    apt_mirror: http://jp.archive.ubuntu.com/ubuntu/
    users:
      - name: ubuntu
        passwd: "$6$iFWJK0DR0buaZcAC$h16dzYSH2/iEBwK0PG6eZ1.eCft.Dk3997aVkYA5/a33c29JDyrIbr76xQd.OMUfGjgmFvF0PZJ2jwZ0cRqVB."
        ssh_import_id:
          - gh:m-shibata
        lock_passwd: false
        groups: lxd
        shell: /bin/bash
        sudo: ALL=(ALL) NOPASSWD:ALL
description: VM specific configuration
devices:
  config:
    source: cloud-init:config
    type: disk
EOF

プロファイルに最低限設定すべきものは次のふたつです。

  • ログイン用のアカウント
  • 設定用ストレージデバイス

LXDの仮想マシンインスタンスは、現時点ではUbuntu Cloud Imageのイメージをそのまま使うため、アカウントが設定されていません。一般的にはcloud-initを使うのですが、今回はLXD側のuser-data領域にcloud-initのデータを保存し、そこからアカウントを作成することにします[4]⁠。

パスワードを設定しているのは、コンソールログインをできるようにするためです。パスワードの設定方法はいろいろありますが、ここではopensslコマンドを使ってパスワード文字列「ubuntupassword」をハッシュ化し、それをcloud-initのデータに書き込んでいます。もちろん実際に試す場合は、もっと強力なパスワード文字列を使ってください。

もうひとつ必要なのが「設定用ストレージデバイス」です。これそのものは、cloud-initデータなどuser-data領域が含まれているISOファイルです。QEMUはuser-data領域としてホストにあるISOイメージファイルを指定できます。LXDの場合、さらにホストとコンテナ間の通信を担う、LXDエージェントの起動スクリプトなども、インスタンス作成時に自動生成されてこのISOイメージに格納されます。そこでISOイメージをインスタンスの中からアクセス可能なように、デバイスとして追加しているのです。

仮想マシンインスタンスの起動と初期設定

プロファイルができたので、それを利用してインスタンスを構築・起動します。

nested$ lxc launch ubuntu:18.04 vmachine --vm --profile default --profile vm
Creating vmachine
Starting vmachine

ポイントは--vmオプションを付けているところですね。これにより仮想マシンインスタンスを作成します。ちなみにLXDでサポートしているイメージがすべて仮想マシンに対応しているわけではありません。たとえばlxc image list ubuntu:bionic/amd64コマンドなどを利用して表示される情報のうち、TYPEフィールドにVIRTUAL-MACHINEと表示されるイメージのみ、仮想マシンとして使うことが可能です。

仮想マシン用のベースイメージのダウンロードから開始するので、起動まではかなり時間がかかります。lxc listなどでIPアドレスが割り振られるまでしばらく待ちましょう。

無事に起動したら、仮想マシンインスタンスにログインして、初期設定を行います。この時点ではlxc execは使えません。もし実行しようとしたら「Error: Failed to connect to lxd-agent」と表示されることでしょう。これは仮想マシンのインスタンスの内と外でLXD自身が通信する手段が用意されていないためです。これはインスタンス内部でLXDエージェントを起動することで対応できます。そこでlxc consolesshコマンドを用いてログインした上で、LXDエージェントの設定を行いましょう。

nested$ lxc console vmachine
To detach from the console, press: <ctrl>+a q

Ubuntu 18.04.4 LTS vmachine ttyS0

vmachine login: ubuntu
Password:(cloud-initで指定したパスワード)
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-88-generic x86_64)

(中略)

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

ubuntu@vmachine:~$

lxc consoleはインスタンスのコンソールに接続するコマンドです。もしコンソールから抜けたい場合は「Ctrl-a q」と入力してください。通常のコンソールであるため、ユーザー名とパスワードを入力してログインします。

LXDエージェントの起動スクリプトは設定用ストレージデバイスにデバイスに格納されています。前述の仮想マシン用プロファイルで指定したあれです。このデバイスはQEMUの9pプロトコルを経由して、ホストとゲストの間でファイル共有できるようになっています。そこでファイルシステムタイプを「9p」としてマウントしましょう。

ubuntu@vmachine:~$ sudo mount -t 9p config /mnt/
ubuntu@vmachine:~$ cd /mnt/
ubuntu@vmachine:/mnt$ sudo ./install.sh
Created symlink /etc/systemd/system/multi-user.target.wants/lxd-agent.service → /lib/systemd/system/lxd-agent.service.
Created symlink /etc/systemd/system/multi-user.target.wants/lxd-agent-9p.service → /lib/systemd/system/lxd-agent-9p.service.

LXD agent has been installed, reboot to confirm setup.
To start it now, unmount this filesystem and run: systemctl start lxd-agent-9p lxd-agent
ubuntu@vmachine:~$ cd
ubuntu@vmachine:~$ sudo umount /mnt/
ubuntu@vmachine:~$ sudo reboot

インストールスクリプト自体は、デバイスにある「lxd-agent.service」「lxd-agent-9p.service」を/lib/systemd/system/以下にインストールし、有効化しているだけです。これによりインスタンスを起動するたびに、ホストとゲストの間を9pプロトコルで通信するLXDエージェントが起動します。この際に、9pnet_virtioモジュールなどもロードします。

最後に仮想マシンを再起動して設定を反映しておきましょう。

仮想マシンの設定の変更方法

LXDの仮想マシンインスタンスは、最初からセキュアブートが有効化されています。

nested$ lxc exec vmachine -- dmesg | egrep "EFI v|secureboot"
[    0.000000] efi: EFI v2.70 by EDK II
[    0.000000] secureboot: Secure boot enabled

このため、サードパーティのモジュールをインストールする際は、MOK(Machine Owner Key)の登録とパスワードの設定が必要です。これはDKMSが半自動的に行ってくれるのですが、コンソール画面が必要になるため若干面倒です。もしサードパーティのモジュールを導入するのであれば、セキュアブートを切ってしまうというのも選択肢に入るでしょう。

LXDの設定として「secureity.secureboot」がありますのでこれを設定します。設定項目によっては一度インスタンスを止める必要があるようです。

nested$ lxc stop vmachine
nested$ lxc config set vmachine security.secureboot false
nested$ lxc start vmachine
nested$ lxc exec vmachine -- dmesg | egrep "EFI v|secureboot"
[    0.000000] efi: EFI v2.70 by EDK II
[    0.000000] secureboot: Secure boot could not be determined (mode 0)

無事にセキュアブートがオフになりました。

LXDのサイトには、他にもインスタンスの設定項目が列挙されています。項目によっては仮想マシンのみだったりコンテナのみだったりしますが、おおよそ何が設定できるかを把握しておくと後々役に立つでしょう。

仮想マシンを使う上でもっとも便利な設定が「raw.qemu」です。その名の通りQEMUコマンドに渡すパラメーターを指定できる設定です。試しにインスタンスのメモリーサイズを標準の1GiBから4GiBに増やしてみましょう。

nested$ lxc stop vmachine
nested$ lxc config set vmachine raw.qemu -- '-m 4G'
nested$ lxc start vmachine
nested$ lxc exec vmachine -- free -h
              total        used        free      shared  buff/cache   available
Mem:           3.9G         84M        3.6G        656K        163M        3.6G
Swap:            0B          0B          0B

反映されているようですね。メモリーサイズだけならLXDの標準的な設定でも可能ですが、LXDがケアしない細かい設定を渡したインスタンスを作りたいときに便利な項目です。

仮想マシンインスタンス上でVirtualBoxを起動する

最後に仮想マシンインスタンスの上で、VirtualBoxを起動してみましょう。

本記事の手順通りに実施していたら、すでにLXDの仮想マシンインスタンスはmultipassの仮想マシンインスタンスの中で動いているはずです。つまりVirtualBoxはNested KVMのさらにNested KVMとして動くことになります[5]⁠。

まず、あらかじめLXDの仮想マシンインスタンス内部でKVMを使えるよう、multipassインスタンス上のNested KVMを有効化しておきます。multipassを使っていないならホスト上だけNested KVMを有効化すれば問題ありません。ちなみにmultipassもLXDも-cpu hostオプションを付けているため、ホストのCPUモデルをエミュレーションしてくれています。

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

これでLXDの仮想マシンインスタンスでも「/dev/kvm」が作成されているはずです。

次にLXDの仮想マシンインスタンスにVirtualBoxをインストールします。VirtualBoxの基本的なことに関しては先日ざっクリわかるVirtualBox 6.1対応版が発売開始されましたので、そちらを参照してください。VirtualBoxの基本操作が網羅されているため、⁠この人にVirtualBoxの使い方を把握しておいてほしい」となったときに「とりあえずこれ読んどけ」ができて助かります。

VirtualBoxのインストール

今回は公式が配布している最新版を使うことにします。まずはLinux版のダウンロードページからLinux版のDebianパッケージをダウンロードしておきます。

このダウンロードしたファイルをホストからmultipassのインスタンスへ、multipassのインスタンスからLXDのインスタンスへコピーしなくてはなりません。方法はいくつかありますが、ここではmultipass/LXDの機能を活用した方法を紹介しまそう。

まずはホストの「ダウンロード」ディレクトリからmultipassインスタンスへコピーします。

$ multipass transfer \
  ~/ダウンロード/virtualbox-6.1_6.1.4-136177~Ubuntu~bionic_amd64.deb \
  nested:/home/ubuntu/vbox.deb

multipass transferコマンドは移動先のファイル名も指定しなくてはならないため、ここでは適当に短い名前に変更しています。次にmultipassインスタンスからLXDの仮想マシンインスタンスへのコピーです。話を簡単にするために、これもホスト上からmultipass exec経由で実行してしまいましょう。

$ multipass exec nested -- \
  sudo -i -u ubuntu lxc file push vbox.deb \
  vmachine/home/ubuntu/

lxc fileの場合、パス名の指定が「インスタンス名/フルパス」にしないといけない点は注意が必要です。その代わり末尾のファイル名は省略できます。

コピーしたVirtualBoxのパッケージをインストールします。ちなみにセキュアブートがオンのままだと、MOKパスワードの設定が必要になります。MOKによる署名を行う場合は、再起動後にlxc consoleでコンソール画面に接続して必要な設定を行ってください。前述した方法でセキュアブートを切っておく方法もあります。

$ multipass exec nested -- \
  sudo -i -u ubuntu lxc exec vmachine -- \
  sh -c "apt install -y dkms /home/ubuntu/vbox.deb"
(中略)
0 upgraded, 249 newly installed, 0 to remove and 0 not upgraded.
Need to get 94.4 MB/188 MB of archives.
After this operation, 835 MB of additional disk space will be used.
(後略)

アカウントをvboxusersグループに追加して、LXDの仮想マシンインスタンスを再起動すればインストール完了です。

$ multipass exec nested -- \
  sudo -i -u ubuntu lxc exec vmachine -- \
  usermod -a -G vboxusers ubuntu
$ multipass exec nested -- \
  sudo -i -u ubuntu lxc restart vmachine

VirtualBox Extension Packのインストール

VirtualBoxはGUIで操作することが一般的です。しかしながらLXDで作成した仮想マシンインスタンスではデスクトップ環境は動いていません。そこで今回はVBoxManageコマンドを利用してCLIからVirtualBoxを操作することにします。

さらにVirtualBox上で動く仮想マシンのディスプレイに接続する方法が必要です。VirtualBoxのExtension PackにはVirtualBox用のリモートデスクトッププロトコルであるVRDP機能があります。本記事ではこのExtension PackもLXDの仮想マシンにインストールして使うことにしましょう。

VirtualBoxのダウンロードページから「VirtualBox Extension Pack」の項目を探し、パッケージイメージをダウンロードします。先ほどと同じ手順でLXD仮想マシンインスタンスにコピーしましょう。

$ multipass transfer \
  ~/ダウンロード/Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack \
  nested:/home/ubuntu/Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack
$ multipass exec nested -- \
  sudo -i -u ubuntu lxc file push Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack \
  vmachine/home/ubuntu/

ちなみにExtension Packはバージョンの整合性の判断にファイル名も使用しているらしく、オリジナルのファイル名を維持しておかないとインストールできないようです。

Extension PackはVBoxManageコマンドでインストールできます。

$ multipass exec nested -- \
  sudo -i -u ubuntu lxc exec vmachine -- \
  sudo VBoxManage extpack install /home/ubuntu/Oracle_VM_VirtualBox_Extension_Pack-6.1.4.vbox-extpack
VirtualBox Extension Pack Personal Use and Evaluation License (PUEL)

License version 10, 20 July 2017
(中略)
Do you agree to these license terms and conditions (y/n)? y

License accepted. For batch installation add
--accept-license=56be48f923303c8cababb0bb4c478284b688ed23f16d775d729b89a2e8e5f9eb
to the VBoxManage command line.

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully installed "Oracle VM VirtualBox Extension Pack".

ライセンスの同意を求められるので、内容を読んで同意するかどうか判断してください。

インストール状態はVBoxManage list extpacksで確認できます。

$ multipass exec nested -- \
  sudo -i -u ubuntu lxc exec vmachine -- \
  VBoxManage list extpacks
Extension Packs: 1
Pack no. 0:   Oracle VM VirtualBox Extension Pack
Version:      6.1.4
Revision:     136177
Edition:
Description:  Oracle Cloud Infrastructure integration, USB 2.0 and USB 3.0 Host Controller, Host Webcam, VirtualBox RDP, PXE ROM, Disk Encryption, NVMe.
VRDE Module:  VBoxVRDP
Usable:       true
Why unusable:

VirtualBoxのインスタンスの作成と起動

もろもろ準備できたのでLXDの仮想マシンインスタンス内部に移動し、そこから仮想マシンを作成・起動します。

$ multipass exec nested -- \
  sudo -i -u ubuntu lxc exec vmachine -- \
  sudo -i -u ubuntu bash

まずは仮想マシンの作成と設定です。

vmachine$ VBoxManage createvm --name bionic --ostype Ubuntu_64 --register
vmachine$ VBoxManage modifyvm bionic --memory 2048 --vram 128 \
  --accelerate3d on --boot1 dvd --boot2 disk --vrde on --vrdeport default

--vrde on --vrdeport defaultでVRDP機能が有効になります。ちなみにデフォルトのポート番号は3389です。

ストレージを作成し、Ubuntuのインストールイメージと一緒に登録しましょう。

vmachine$ VBoxManage createmedium disk --filename bionic --size 16384
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 7cb06bf4-c127-4ac4-8921-5e3a5c330edf

vmachine$ VBoxManage storagectl bionic --name sata0 --add sata \
  --controller IntelAHCI --bootable on
vmachine$ VBoxManage storageattach bionic --storagectl sata0 \
  --port 0 --device 0 --type hdd --medium bionic.vdi

vmachine$ VBoxManage storagectl bionic --name ide0 --add ide \
  --controller PIIX4
vmachine$ VBoxManage storageattach bionic --storagectl ide0 \
  --port 0 --device 0 --type dvddrive \
  --medium ubuntu-18.04.4-desktop-amd64.iso

これで仮想マシン側の準備は整ったので、仮想マシンを立ち上げます。

vmachine$ VBoxHeadless --startvm bionic

デスクトップ環境がない状態で起動するのでVBoxHeadlessを使っています。これで仮想マシンは起動しました。

VRDPの画面には、普通のRDPクライアントで接続できます。ただし今回のケースだとmultipassの先のLXDの先にあるVRDPサーバーへの接続になるため、ネットワーク転送の設定が必要です。SSHのポート転送などでも十分ですが、今回はmultipassインスタンス上でiptablesで設定してしまいましょう。ちなみにLXDの仮想マシンインスタンスに対するlxc config deviceを利用したproxyデバイスの追加は、今のところできないようです。

nested$ sudo iptables -t nat -A PREROUTING -p tcp -i ens4 \
  --dport 3389 -j DNAT --to-destination 10.53.195.92
nested$ sudo iptables -t nat -A POSTROUTING -o ens4 \
  -j SNAT --to-source 10.18.154.201
nested$ sudo iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT

「ens4」はmultipass上のネットワークインターフェース名です。また「10.53.195.92」はLXD仮想マシンインスタンスのIPアドレスになります。⁠10.18.154.201」はmultipassのens4に割り振られたIPアドレスになります。

あとはRDPクライアントでmultipassのインスタンスのIPアドレス(上記例だと10.18.154.201)に接続しましょう。UbuntuならRemminaが最初からインストールされているはずです。

図1 Remminaからアクセスした、multipass上のLXD上のVirtualBox上のUbuntu 18.04 LTS 画像

ちなみにmultipassはQCOW2イメージを、LXDはRAWイメージを使用しています。そのせいかどうかはわかりませんが、multipass上のLXD上のVirtualBoxは「とてつもなくストレージI/Oが遅い」です。起動時のBogoMIPS値やCPUの動きが遅い感じはしないので、純粋にストレージのI/Oが影響しているようです。

multipassの上でVirtualBoxを動かすのは(つまり一段のネストは)そこまで気にはなりませんでした。つまりmultipassの上のLXDの上でVirtualBoxを動かすのが(つまり二段のネストが)影響しているものと予想されます。このあたりはmultipass/LXDの設定を変更すればもしかすると解消するかもしれません。

ただし見も蓋もない言い方をすると、そもそもの話として二段のネストが必要になるケースはそこまでありませんよね。

おすすめ記事

記事・ニュース一覧