ネスト仮想化
できること
- Windows 10 VM の WSL2 と Hyper-V、Linux VM の KVM と microVM、実機に触れない仮想化の実験環境。
- Web 画面で VM ごとにスイッチが 1 つ。ネストを有効にした VM も、ホスト再起動時に他の VM と同じく一時停止・復元され、内側の Hyper-V や KVM の状態も保存されます。
しくみ
keel ハイパーバイザーがゲストの仮想マシン制御構造のシャドウを持ち、内側の VM をゲストに代わって実行します。デモ、VMCS シャドウイング、ネスト EPT の順に段階を踏んで作りました。Hyper-V には Microsoft が文書化していない要件もいくつかありました。
計測結果
- Linux 6.12 の KVM を L1 にした場合:内側の VM は 4〜5 秒でユーザー空間に到達。fork+exec 2000 回が 2.18 秒(最初のデモでは 213 秒)、内側の VM exit 1 回は 32 µs。
- Windows 10 22H2 + Hyper-V:31〜35 秒で SSH 可能。WSL2 は 4〜5 秒で起動し、起動停止 10 回に成功。Hyper-V 上の第 2 世代 Alpine VM は 60 秒以内にログインプロンプトに到達。
制限事項
- Intel ホストのみ。AMD のネスト SVM は未実装です。
- ネストを有効にした VM には PCI パススルーデバイスを付けられません。kcell では有効にできません。
- Windows の VBS と HVCI(メモリ整合性)はまだ動きません。Windows 11、Windows Server、Proxmox を外側のゲストにする構成は未確認です。
- VM exit の多い処理(小さな I/O が大量)は、ホスト上で直接動かすより明らかに遅くなります。WSL2、開発環境、ラボ向きで、本番の仮想化には向きません。
- アップグレードが試用中の間は、旧スロットが新しいチェックポイント形式を読めないため、ネストした VM はホスト再起動時にシャットダウンされます。