Windows10 WSL2上のゲストから/dev/kvmを経由して、その上にさらにネストさせる形で仮想マシンを動かすことができた。

環境

  • Windows 10 Pro Insider Program (Devチャネル、OSビルド 20246.1) 1
  • WSL2上のゲスト
    • Ubuntu 20.04.1 LTS (Focal Fossa)
    • Linux 4.19.128-microsoft-standard
    • カーネルパラメータ initrd=\initrd.img panic=-1 nr_cpus=4 swiotlb=force pty.legacy_count=0
    • QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.7)
  • Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz

手順

WSL2(Windows Subsystem for Linux 2)全体の設定 C:\Users\ユーザ名\.wslconfig に以下の設定を追加することで、 仮想化支援のネストを許可する。

[wsl2]
nestedVirtualization=true

参考にしたブログ記事 2 では、WSL2上のゲストカーネルを再ビルドするような手順が紹介されているが、今回は必要なかった。 単純に nestedVirtualization=true とするだけで対応できた。

動作確認 Part.1

QEMU/KVM上でcirrosイメージを動かしてみる。

# non-root ユーザからも KVM の利用を許可
$ sudo chmod a+rw /dev/kvm

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

# cloud-init を無効化した cirros イメージを取得
$ wget https://github.com/eprasad/virt-cirros/raw/master/virt-cirros-0.3.4-x86_64-disk.img
$ qemu-system-x86_64 -enable-kvm -hda ./virt-cirros-0.3.4-x86_64-disk.img -nographic -serial mon:stdio

$ lsof -p $(pgrep qemu) | grep kvm
qemu-syst 22812 bobuhiro11  mem       REG   0,12           13766 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
qemu-syst 22812 bobuhiro11    9u      CHR 10,232      0t0  13769 /dev/kvm
qemu-syst 22812 bobuhiro11   11u  a_inode   0,12        0  13766 kvm-vm
qemu-syst 22812 bobuhiro11   12u  a_inode   0,12        0  13766 kvm-vcpu:0

動作確認 Part.2

QEMU以外でも動作確認してみる。 例として最近気になっているrust-vmmのリファレンス実装 3 も動かしてみる。

$ git clone https://github.com/rust-vmm/vmm-reference.git
$ cd vmm-reference
$ cargo build
$ ./resources/kernel/make_busybox.sh
$ pytest tests/test_run_reference_vmm.py
============================================================================================================ test session starts ============================================================================================================
platform linux -- Python 3.8.5, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: /home/bobuhiro11/vmm-reference
collected 1 item

tests/test_run_reference_vmm.py .                                                                                                                                                                                                     [100%]

============================================================================================================= 1 passed in 2.30s =============================================================================================================

$ ./target/debug/vmm-reference --kernel path=./resources/kernel/vmlinux-hello-busybox,cmdline="console=ttyS0 pci=off",himem_start=1024 --memory mem_size_mib=1024 --vcpus num_vcpus=1

$ lsof -p $(pgrep vmm-reference) | grep kvm
vmm-refer 23670 bobuhiro11  mem       REG   0,12           13766 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
vmm-refer 23670 bobuhiro11    3u      CHR 10,232      0t0  13769 /dev/kvm
vmm-refer 23670 bobuhiro11    4u  a_inode   0,12        0  13766 kvm-vm
vmm-refer 23670 bobuhiro11    6u  a_inode   0,12        0  13766 kvm-vcpu:0

話は脱線するが、もしmake_busybox.shを実行したときにリンクまわりでコケる場合にはbusyboxの一部のツールに対して、ビルドをスキップするとよい。

$ git diff
diff --git resources/kernel/busybox_static_config resources/kernel/busybox_static_config
index eceb67f..6b14ed5 100644
--- resources/kernel/busybox_static_config
+++ resources/kernel/busybox_static_config
@@ -196,10 +196,10 @@ CONFIG_COMM=y
 CONFIG_CP=y
 CONFIG_FEATURE_CP_LONG_OPTIONS=y
 CONFIG_CUT=y
-CONFIG_DATE=y
-CONFIG_FEATURE_DATE_ISOFMT=y
+CONFIG_DATE=n
+CONFIG_FEATURE_DATE_ISOFMT=n
 # CONFIG_FEATURE_DATE_NANO is not set
-CONFIG_FEATURE_DATE_COMPAT=y
+CONFIG_FEATURE_DATE_COMPAT=n
 CONFIG_DD=y
 CONFIG_FEATURE_DD_SIGNAL_HANDLING=y
 CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y
@@ -630,7 +630,7 @@ CONFIG_FEATURE_MOUNT_OTHERTAB=y
 CONFIG_NSENTER=y
 CONFIG_FEATURE_NSENTER_LONG_OPTS=y
 CONFIG_PIVOT_ROOT=y
-CONFIG_RDATE=y
+CONFIG_RDATE=n
 CONFIG_RDEV=y
 CONFIG_READPROFILE=y
 CONFIG_REV=y
@@ -873,7 +873,7 @@ CONFIG_NC_EXTRA=y
 CONFIG_NETSTAT=y
 CONFIG_FEATURE_NETSTAT_WIDE=y
 CONFIG_FEATURE_NETSTAT_PRG=y
-CONFIG_NSLOOKUP=y
+CONFIG_NSLOOKUP=n
 CONFIG_NTPD=y
 CONFIG_FEATURE_NTPD_SERVER=y
 CONFIG_FEATURE_NTPD_CONF=y