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