找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 910|回复: 1

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

[复制链接]
发表于 2023-10-16 04:04:47 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 tangptr@126.com 于 2024-5-13 16:42 编辑

前言

首先说明,不能完全替代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文件,添加以下代码:

[wsl2]
nestedVirtualization=true

注意要先关掉WSL2

wsl --shutdown

等待八秒后进入WSL,确认一下是不是真的有虚拟化功能了:

cat /proc/cpuinfo | grep -E 'svm|vmx'

有输出就证明有虚拟化。

更新内核

默认的WSL内核是没有KVM的,要重新折腾一份。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 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

增强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吧。

回复

使用道具 举报

发表于 2023-10-18 18:29:57 | 显示全部楼层
牛逼,我一看标题就知道不简单,进来一看果然是精华帖
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-28 06:43 , Processed in 0.044704 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表