添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
本帖最后由 [email protected] 于 2024-8-2 23:45 编辑

首先说明,不能完全替代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

    至于怎么装系统,就不是本文关心的事情了。

    安装SPICE Guest Tools

    这个东西类似于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吧。