Fuchsia エミュレータを GCE のネストされた仮想化上で動かす
本記事は、「Fuchsia 開発環境を GCE 上に構築する」シリーズの一編です。
抱えている問題
実用的なエミュレータ動作に KVM が必要だが、自宅環境では KVM を使用できない。
自宅の開発環境は ChromeOS です。
ChromeOS 内の Linux コンテナで開発しています。
ChromeOS 上の Linux では KVM を使用できません。
これは Linux が KVM 上で動作しており、かつ nested KVM に対応していないためです。
Can I run a VM inside the VM?
Currently, no, nested KVM is not supported. You could run qemu-system to emulate the hardware and boot whatever OS you want inside of that. Unfortunately, it‘ll be quite slow as QEMU > won’t be able to utilize KVM for hardware acceleration.
— Running Custom Containers Under Chrome OS
Fuchsia エミュレータは KVM を使用しない場合、体感で 10 倍以上(一部実測で約 9 倍)速度が遅くなり、実用になりません。
また、タイムアウトが頻発し、勝手に再起動する事例もありました。
解決策
そこで、GCE のネストされた仮想化を利用してこの問題を解決したいと思います。
GCE インスタンスも、ChromeOS 上の Linux と同じく、KVM 上で動作しています。
しかし nested KVM(nested Virtualization)に対応しているため、GCE インスタンス上で KVM を使用できます。
Fuchsia エミュレータを GCE のネストされた仮想化上で動かす
NestedVirtualization の有効化
Fuchsia を GCE でビルドしてみた で作成した GCE インスタンスを、下記のように変更します。
-
マシンタイプの変更
n2-standard-4、Intel Cascade Lake 以降に変更。
費用:
-
n2-standard-4 は 0.0470 ドル/時、1 時間可動した場合、1 ドル 110 円で約 5.1 円
参考:近い性能で安価な e2-standard-4 は 0.04021 ドル/時、1 時間可動した場合、1 ドル 110 円で約 4.4 円。
-
-
NestedVirtualization の有効化
-
現在の設定の取得
gcloud compute instances export インスタンス名 --destination=./property.yml
-
設定の変更
./property.yml に、次を追加。
advancedMachineFeatures: enableNestedVirtualization: true
-
変更した設定の反映
gcloud compute instances update-from-file インスタンス名 --source=./property.yml --most-disruptive-allowed-action=RESTART
これで
grep -cw vmx /proc/cpuinfo
が4
となります。
また、/dev/kvm
も見つかります。$ ls -l /dev/kvm crw-rw---- 1 root kvm 10, 232 Dec 19 08:01 /dev/kvm
-
エミュレータの実行
GCE に SSH でログインします。
-
事前準備
sudo usermod -a -G kvm ユーザ名
-
ビルド
fx set workstation.qemu-x64 --release fx build
-
エミュレータ実行
fx emu --headless
--headless
指定で GUI サポートを無効にしています。
GUI を有効にした場合については、別記事で紹介します
速度について
KVM 有効時
fx emu --headless
[00002.619] 02429:03379> [fshost] INFO: [block-device.cc(626)] Formatting minfs.
[00008.129] 02429:03379> [fshost] INFO: [block-device.cc(645)] Minfs filesystem re-formatted. Expect data loss.
Formatting minfs.
が約 6 秒で完了します。
KVM 無効時
fx emu -a off --headless
[00014.785] 02838:03481> [fshost] INFO: [block-device.cc(626)] Formatting minfs.
[00064.599] 02838:03481> [fshost] INFO: [block-device.cc(645)] Minfs filesystem re-formatted. Expect data loss.
Formatting minfs.
が約 50 秒で完了します。
Discussion