前言
首先说明,不能完全替代VMware,只能说在不盗版VMware的前提下,用WSL2+QEMU+KVM也能玩。
经测试,Windows 10 LTSC 2021不能给WSL2启用嵌套虚拟化,因此我直接选择了Windows 11,其他的Windows 10版本我就没测试了。
启用WSL2
首先是安装Windows Subsystem for Linux,一般是通过控制面板实现。另外WSL2额外要求安装Virtual Machine Platform。
WSL2还要更新搞个特别的更新操作。
wsl --update
安装WSL发行版
一般而言,由于大部分网上使用WSL2的案例均为Ubuntu,因此这里就选择了Ubuntu-24.04 LTS。可以去应用商店里下载,也可以在PowerShell里下载。
wsl --install Ubuntu-24.04
但是呢,还得整个活,让WSL启用嵌套虚拟化。
在%UserProfile%
目录里,创建一个.wslconfig
文件,添加以下代码:
[wsl2]
nestedVirtualization=true
注意要先关掉WSL2
wsl --shutdown
等待八秒后进入WSL,确认一下是不是真的有虚拟化功能了:
cat /proc/cpuinfo | grep -E 'svm|vmx'
有输出就证明有虚拟化。
更新内核
由于系统版本的区别,老一些的Windows 11默认的WSL内核是没有KVM的,要重新折腾一份。
新版Windows 11(Build 26100)虽然默认带上了KVM,默认的内核也不是v6的,有点老,所以干脆重新折腾一份吧。
WSL2的内核源码可以去GitHub下载。
先做点准备工作:
sudo apt update -y && sudo apt upgrade -y
sudo apt -y install build-essential libncurses-dev bison flex bc libssl-dev libelf-dev cpio cpu-checker
这里我选择6.6.36.3版内核,下载并解压:
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-6.6.36.3.tar.gz
tar -xf linux-msft-wsl-6.6.36.3.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-6.6.36.3/
把微软的编译配置复制出来:
cp Microsoft/config-wsl .config
然后开始配置
make menuconfig
进入菜单式界面,这里进入Virtualization
,然后根据自己情况进行选择。
接着进入Processor type and features
,来到Linux guest support
,勾选KVM Guest support (including kvmclock)
。
找到General setup
/BPF subsystem
然后取消所有项,否则编译失败。
最后开始编译。
make -j$(nproc)
编译要花一会时间,所以中途可以去看番。
编译完成的内核映像在./arch/x86/boot/bzImage
这个位置,你可以将其复制到任意位置。
回到.wslconfig
配置文件,添加这一行代码:
kernel=<内核文件路径>
注意这里要使用Windows风格路径,且\
符号必须双拼,可以含空格,不需要引号,比方说:kernel=D:\\a b c\\bzImage
。
然后wsl --shutdown
关掉你的WSL,八秒后再打开。
然后安装内核模块和头文件。
sudo make modules_install headers_install
再次wsl --shutdown
关掉你的WSL,八秒后再打开。
确认一下KVM可以使用了:
kvm-ok
输出KVM acceleration can be used
就说明KVM能用了。
安装QEMU
连内核都重新编译了,那么QEMU也直接通过源码搞个新的吧。(目前最新版是9.0.2)
wget https://download.qemu.org/qemu-9.0.2.tar.xz
tar -xf qemu-9.0.2.tar.xz
cd qemu-9.0.2
编译QEMU有些准备工作要做:
sudo apt install -y git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev libbz2-dev liblzo2-dev ninja-build python3-pip meson ovmf libsdl2-dev libgtk-3-dev libvte-dev libspice-protocol-dev libspice-server-dev libslirp-dev python3-sphinx python3-sphinx-rtd-theme
然后配置编译参数:
./configure --target-list=x86_64-softmmu --disable-werror --enable-kvm --enable-tools --enable-lzo --enable-bzip2 --enable-sdl --enable-gtk --enable-vdi --enable-qcow1 --enable-spice --enable-slirp
开始编译:
make -j$(nproc)
编译完成后安装到系统里:
sudo make install
最后配置KVM权限,免得使用QEMU都要加sudo
前缀。
sudo adduser <用户名> kvm
sudo chown <用户名> /dev/kvm
创建虚拟机
首先用qemu-img
命令创建一个磁盘映像:
qemu-img create disk.img 40G
这里创建了个文件名是disk.img
的40G大小的raw格式映像,虽然可以用其他格式(比如QEMU的qcow1
格式),I/O性能可能会更好,但是毕竟用raw格式方便研究文件系统。
然后创建一个runvm.sh
的脚本文件。这个文件将是我们配置QEMU虚拟机的基石。先添加一些基本的东西:
qemu-system-x86_64 \
-accel kvm \
-bios /usr/share/ovmf/OVMF.fd \
-cpu host,vmx=on,hypervisor=off \
-smp 2 -m 4096 \
-vga qxl \
-cdrom windows_setup.iso \
-drive format=raw,file=disk.img \
-nic e1000e
说明一下每行的意义:
qemu-system-x86_64
是QEMU的可执行文件名。
-accel kvm
指定使用KVM作为加速器。
bios /usr/share/ovmf/OVMF.fd
指定使用OVMF作为固件。OVMF(Open Virtual Machine Firmware)是TianoCore开源的虚拟机UEFI固件。去掉这一行让QEMU使用SeaBIOS这个Legacy固件。
cpu host,vmx=on,hypervisor=off
中,host
是让QEMU告诉虚拟机CPU的型号和主机一致,vmx=on
是让虚拟机开启对Intel VT-x的支持(若主机是AMD的CPU就用svm=on
),hypervisor=off
是让虚拟机不能通过cpuid
的返回值判断虚拟机的存在。
-smp 2
是双核。
-m 4096
是虚拟机使用4G内存。
-vga qxl
是给虚拟机QXL虚拟显卡,这个显卡兼容性最好。
-cdrom windows_setup.iso
是给虚拟机添加一个光驱,虚拟光盘的文件名是windows_setup.iso
。这里应当替换为你要安装的操作系统的安装映像。
-drive format=raw,file=disk.img
是给虚拟机添加一个raw格式硬盘,虚拟硬盘的文件名是disk.img
。
-nic e1000e
是给虚拟机添加Intel E1000e虚拟网卡。
然后启动虚拟机:
bash runvm.sh
至于怎么装系统,就不是本文关心的事情了。
这个东西类似于VMware Tools,本质是为了增强虚拟机使用体验的。
Linux虚拟机可以直接用命令安装:
sudo apt install spice-vdagent spice-webdavd
Windows虚拟机需要从SPICE官网下载SPICE Guest Tools。
增强QEMU使用体验
接下来我们要提升QEMU的使用体验。在runvm.sh
中,追加以下参数:
-device usb-ehci -device usb-mouse -device usb-tablet -device usb-kbd \
-audio spice,model=hda \
-spice addr=0.0.0.0,port=3001,disable-ticketing=on,disable-agent-file-xfer=off \
-device virtio-serial \
-chardev spicevmc,id=vdagent,debug=0,name=vdagent \
-device virtserialport,chardev=vdagent,name=com.redhat.spice.0 \
-chardev spiceport,id=spicechannel1,name=org.spice-space.webdav.0 \
-device virtserialport,nr=2,chardev=spicechannel1,name=org.spice-space.webdav.0
启动虚拟机时会发现没有窗口弹出,因为这里我们指定使用virt-viewer来操作虚拟机。
然后在Windows 11主机上下载安装virt-viewer。
在virt-viewer这里,通过spice://localhost:3001
地址连接到QEMU。
在使用virt-viewer,且SPICE Guest Agent正常运行的情况下:
- 可以双向复制粘贴文本
- 可以无缝切换鼠标
- 可以拖拽发送文件(但只能Host向Guest发送,且只能复制到指定位置:比如Windows上拖拽复制只会复制到桌面上)
- 可以通过virt-viewer播放虚拟机里的声音
警告
严禁使用Windows Update(手动更新也不行),它会干掉SPICE Guest Agent导致其无法正常开机自动启动。后果是鼠标会消失,键盘无响应。
万一发生此事,需要删除掉-device usb-ehci -device usb-mouse -device usb-tablet -device usb-kbd
这一行参数,使其使用标准键鼠,放弃无缝键鼠切换。然后在虚拟机里重装SPICE Guest Tools。
结语
本文介绍了如何安装WSL2,并讲解了WSL2内核的编译来给WSL2添加KVM。然后说明了如何编译最新版的QEMU,以及虚拟机的创建方法,最后讲解了QEMU使用体验的增强方法。
平(价代)替也就这么回事了,真正用起来还是很操蛋的。如果不是有意追求QEMU里某些特性(比如ISA-DebugCon这类VMware没有的虚拟设备),还是老实去玩VMware吧。