VirtualBox 6.1でIntel CPU上のNested Virtualizationがサポート

はじめに

VirtualBox 6.1でIntel CPU上のNested Virtualizationがサポートされました。

早速使ってみました。ゲストOSが動くことは動くのですが、とても遅いです。そこがちょっと残念。

公式にサポートされているのは、VirtualBox 6.1.0上でVirtualBox 6.1.0を動かすことです。

また、第5世代Core iプロセッサー以降のCPUがサポート対象です。

試した結果

こちらで確認できたのは次の2つです。実マシン上をLevel 0として、ゲストをLevel 1とLevel 2で表します。

なお、実マシンはCore i5 9400の自作PCです。

Level 1 ゲストのVirtualBoxで、ネステッドVT-x/AMD-Vを有効化にチェックが入っていないといけません。
Level 2 ゲストではグレーになってチェックできないようになっています。

VirtualBox上でVirtualBoxを動かす

Windows 10上のVirtualBox 6.1.0で、Ubuntu 18.04を動かし、そのUbuntu上でUbuntu 18.04のLiveCDは動きました。
また、2時間ほどかけてインストールもやってみましたが、正常に終了。

Level 0: Windows 10 VirtualBox 6.1.0
Level 1: Ubuntu 18.04 VirtualBox 6.1.0
Level 2: Ubuntu 18.04

どうして遅いのかをチェック。まず、sysbenchでCPUのスピードをチェック。
sysbenchというベンチマークソフトウェアで測定すると、
Level 1 ゲスト: 1398
Level 2 ゲスト: 1243
1243/1398 = 0.89
でした。
大体89%のスピードで動いているわけですが、体感的にはもっと遅く感じます。

次に、dbenchでディスクI/Oをチェック。Windows上で、シーケンシャルRead/シーケンシャルWrite = 500MB/s / 300MB/sくらい出るSSDを使っています。dbenchでスループットを測定すると、
Level 1 ゲスト: 152MB/s
Level 2 ゲスト: 20MB/s
でした。
ということで、ディスクアクセスが極端に遅くなっていることがわかりました。原因としては、NTFSファイルシステム上のext4ファイルシステム上のext4ファイルシステムということで、ファイルシステムを入れ子にしていることが考えられます。VirtualBoxに、SSDのパーティションを直接アクセスさせる方法があります。Rawハードディスクアクセスという方法です。マニュアルを調べてみると、MBR形式のハードディスクのパーティションは指定できるけれど、GPT形式のハードディスクの記述はないみたいですね。SSDを1つまるごと使うほかないのかな。それを使うと改善されるような気がします。

少しでも速くならないかとLevel 1 ゲストのVirtualBoxで、CPUプロセッサ数を2にしたところ、Level 1 ゲストごとフリーズしました。プロセッサ数は1でないと起動しないみたいです。

KVMを試す

また、KVMを試したところ、Ubuntu上のKVMでFedora 10のResucue CDは動きました。
でも、これは公式にはサポートされていません。

Level 0: Windows 10 VirtualBox 6.1.0
Level 1: Ubuntu 18.04 KVM
Level 2: Fedora 10

まとめ

Intel CPU上のNested Virtualizationを確認しました。安定して動いています。
Level 1 ゲストのVirtualBoxでCPUプロセッサ数を2にするとフリーズします。
まだVirtualBox上のVirtualBoxしかサポートされず、サポート範囲が狭いです。
KVMは一応動作します。
ゲストOSを入れ子にすることで、CPUは89%のスピードで動いています。
ディスクアクセスが極端に遅くなっていることがわかりました。対策すればなんとかなるかな。

おまけ

ちょっと技術的なことを付け加えると、Level 0のVirtualBox 6.1.0で、ゲストOSを動かしたときに、ログファイルを確認すると、VT-x featuresのVMX - Virtual-Machine Extensionsのところがhostとguestとも1になっています。guestが1になっていることがNested Virtualizationを許可するということです。

00:00:02.639739 *********************** VT-x features ***********************
00:00:02.639739 Nested hardware virtualization - VMX features
00:00:02.639740   Mnemonic - Description                                  = guest (host)
00:00:02.639740   VMX - Virtual-Machine Extensions                        = 1 (1)

また、その下の方のVmcsShadowingのところでhostが1になっています。第5世代Core iプロセッサー(Broadwell)以降でないとこの機能が使えないそうです。第4世代のHaswellの一部のプロセッサーでも有効との話がありますが、こちらでは未確認です。
UnrestrictedGuestのhostが1なことが最低でも必要だそうです。

00:00:02.639752   UnrestrictedGuest - Unrestricted guest                  = 0 (1)
00:00:02.639754   VmcsShadowing - VMCS shadowing                          = 0 (1)

ログファイルでVMXとVmcsShadowingが確認できたら、Level 1のゲストの中でLevel 2のゲストが使えると思います。

Level 1のLinuxのゲスト上では/proc/cpuinfoを確認することでもできます。

$ cat /proc/cpuinfo

これでflagsの中にvmxの文字があることを確認してください。