tangptr@126.com 发表于 2023-10-16 04:04:47

【虚拟机】WSL2下QEMU+KVM,试图平替VMware!

本帖最后由 tangptr@126.com 于 2023-10-16 04:18 编辑


# 前言
首先说明,不能完全替代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-22.04 LTS。可以去应用商店里下载。
但是呢,还得整个活,让WSL启用嵌套虚拟化。
在`%UserProfile%`目录里,创建一个`.wslconfig`文件,添加以下代码:
```

nestedVirtualization=true
```
注意要先关掉WSL2
```
wsl --shutdown
```
等待八秒后进入WSL,确认一下是不是真的有虚拟化功能了:
```
cat /proc/cpuinfo | grep -E 'svm|vmx'
```
有输出就证明有虚拟化。

# 更新内核
默认的WSL内核是没有KVM的,要重新折腾一份。WSL2的内核源码可以[去GitHub下载](https://github.com/microsoft/WSL2-Linux-Kernel/releases)。
先做点准备工作:
```
sudo apt update -y
sudo apt upgrade -y
sudo apt -y install build-essential libncurses-dev bison flex bc libssl-dev libelf-dev cpu-checker aria2
```
这里我选择6.1.21.2版内核,下载并解压:
```
aria2c -x 10 https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-6.1.21.2.tar.gz
tar -xf WSL2-Linux-Kernel-linux-msft-wsl-6.1.21.2.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-6.1.21.2/
```
把微软的编译配置复制出来:
```
cp Microsoft/config-wsl ./config
```
然后开始配置
```
make menuconfig
```
进入菜单式界面,这里进入`Virtualization`,然后根据自己情况进行选择。
接着进入`Processor type and features`,来到`Linux guest support`,勾选`KVM Guest support (including kvmclock)`。
最后开始编译。
```
make -j$(nproc)
```
编译要花一会时间,所以中途可以去看番。
编译完成的内核映像在`./arch/x86/boot/bzImage`这个位置,你可以将其复制到任意位置。
回到`.wslconfig`配置文件,添加这一行代码:
```
kernel=<内核文件路径>
```
注意这里要使用Windows风格路径,且`\`符号必须双拼,可以含空格,不需要引号,比方说:`kernel=D:\\a b c\\bzImage`。
然后`wsl --shutdown`关掉你的WSL,八秒后再打开。
确认一下KVM可以使用了:
```
kvm-ok
```
输出`KVM acceleration can be used`就说明KVM能用了。

# 安装QEMU
由于选用的发行版是Ubuntu-22.04 LTS,因此`apt`下载到的QEMU版本是6.2.0的,有点老。这里直接通过源码搞个新的。(目前最新版是8.1.1)
```
wget https://download.qemu.org/qemu-8.1.1.tar.xz
tar -xf qemu-8.1.1.tar.xz
cd qemu-8.1.1
```
编译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
sudo apt install -y libsdl2-dev libgtk-3-dev libvte-dev libspice-protocol-dev libspice-server-dev
pip install ninja sphinx sphinx-rtd-theme ensure-pip
```
然后配置编译参数:
```
./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
```
另外,QEMU从7.2版之后源码不再附带`libslirp`,需要自己编译安装,否则不能配置模拟网卡:
```
git clone https://gitlab.freedesktop.org/slirp/libslirp.git
cd libslirp
meson build
sudo ninja -C build 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](https://spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe)。

# 增强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](https://virt-manager.org/download)。
在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吧。

溯影 发表于 2023-10-18 18:29:57

牛逼,我一看标题就知道不简单,进来一看果然是精华帖
页: [1]
查看完整版本: 【虚拟机】WSL2下QEMU+KVM,试图平替VMware!