ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows 10 上使用 QEMU 安装 Windows 10 虚拟机:WHPX 加速与 virtio 驱动实战

Windows 10 上使用 QEMU 安装 Windows 10 虚拟机:WHPX 加速与 virtio 驱动实战 如果你跟我一样平时跑虚拟机首选 VirtualBox 或 VMware Workstation看到“在 Windows 10 上用 QEMU 装 Windows 10 虚拟机”这个标题第一反应多半是Windows 宿主机上都有一堆带界面的虚拟机软件何必绕一圈去折腾命令行为主的 QEMU说实话我以前也这么想。直到我需要在几台没有图形界面的服务器上统一启停虚拟机才发现 QEMU 这套“一条命令拉起一台机器”的玩法在脚本化、批量复制环境、跨平台管理上的优势是传统 GUI 虚拟机软件比不了的。后来回到自己的 Windows 10 办公机也顺手试了试在 QEMU 里完整装一遍 Windows 10 客户机过程中踩了不少坑也把 TCG、WHPX、virtio 驱动这些概念彻底搞明白了。这篇就记录整个流程命令基于 QEMU 8.xWindows 宿主机和客户机都是 Windows 10示例可以直接抄。1. 为什么非要在 Windows 宿主机上折腾 QEMU如果你只是偶尔开个虚拟机确实没必要换。但如果你和我一样需要反复创建干净的测试环境或者想把虚拟机的启动、停止、备份全部写进脚本QEMU 的命令行模型会带来完全不同的体验。这一节先把动机和基本概念讲清楚。1.1 VirtualBox、VMware 用得好好的QEMU 不可替代在哪先说结论QEMU 不是来取代 VirtualBox 或 VMware 的桌面便捷性的它适合的是“把虚拟化当成基础设施”而不是“双击打开一个窗口”的使用方式。我用 VirtualBox 的时候最烦的一点是同一个虚拟机环境想复制一份给同事除了导出 ova还得确认安装路径、扩展包版本、磁盘文件位置稍有不慎就路径漂移。QEMU 这边整个虚拟机就是“一个磁盘文件 一组启动参数”我用一份.bat或.ps1脚本就能完整描述这个虚拟机跑在什么配置上。换机器的时候拷走磁盘文件改一下路径脚本一执行虚拟机原地复活。QEMU 在 Windows 上还有一个比较实际的用途它和设备模型的耦合度很低。你可以用一条-device参数从 virtio 网络切到 e1000从 VGA 切到 virtio-gpu不用像商用软件那样依赖固定的一套虚拟硬件。对做驱动兼容性测试、操作系统镜像验证的人来说这个自由度高到几乎没有替代品。1.2 先搞清楚 QEMU 在 Windows 上靠什么加速QEMU 在 Linux 上最常用的加速后端是 KVMWindows 上没有 KVM但也不是只能靠纯软件模拟。QEMU 在 Windows 上主要有两种模式加速模式原理速度适用场景TCG纯软件动态二进制翻译慢CPU 占用高没有 WHPX 时的兜底方案WHPX调用 Windows Hypervisor Platform接近原生虚拟化推荐优先使用TCG 模式几乎不需要额外配置装上 QEMU 就能跑。但它是一行一行转换客户机指令再执行装 Windows 10 这种大系统会比较煎熬。WHPX 是微软提供的虚拟化 APIQEMU 可以通过它复用 Windows 自带的 Hypervisor 调度能力速度提升非常明显。启用 WHPX 需要两个条件电脑 BIOS 里打开硬件虚拟化Intel VT-x / AMD-V然后进入 Windows 的“启用或关闭 Windows 功能”勾选“Windows Hypervisor Platform”重启后生效。这一步做完QEMU 启动参数里加上-accel whpx就能用上硬件加速了。1.3 这篇实验环境是什么我这次的宿主机是 Windows 10 Pro 22H2x64 架构CPU 是支持 VT-x 的桌面级处理器内存 32GBQEMU 用的 8.1 版本安装包。客户机同样安装 Windows 10 Pro x64虚拟机分配 4 核、8GB 内存磁盘 80GB 动态分配。如果你宿主机内存只有 8GB虚拟机建议给 4GB否则宿主和客户机都会很难受。CPU 核心数也不建议无脑多给TCG 模式下核心数给太多反而会让 Windows 调度开销变大。2. 安装 QEMU 和准备 Windows 10 镜像很多初学者第一关就卡在“QEMU 到底去哪下载、装完怎么没有快捷方式”。这很正常QEMU 本来就不是那种“双击下一步再点开始”的软件我们一步步来。2.1 QEMU 安装包选择官方站点 qemu.org 的 Downloads 页面里有 Windows 安装包文件名通常是qemu-w64-setup-2024xxx.exe这类。下载时注意区分 32 位和 64 位现在宿主机基本是 x64直接选 w64 版本。安装过程很简单但有一个细节要特别留意安装路径尽量别带空格。虽然你现在装在C:\Program Files\qemu后面加引号也能用但以后写脚本时路径带空格就要到处加引号很烦。我一般直接装在C:\qemu命令短脚本也干净。安装器可以选择是否加入 PATH建议勾上或者装完手动把目录加进系统环境变量。验证安装是否成功打开 CMD 或 PowerShell输入qemu-system-x86_64 --version能打印出版本信息就说明环境没问题。如果提示找不到命令可以先用完整路径C:\qemu\qemu-system-x86_64.exe --version2.2 创建干净的目录QEMU 不会帮你管理虚拟机文件不像 VirtualBox 会默认建一个 VirtualBox VMs 目录。建议提前规划好目录我习惯这么建目录存放内容D:\vm\win10\diskWindows 10 的虚拟磁盘文件D:\vm\win10\isoWindows 10 安装镜像D:\vm\win10\driversvirtio-win 驱动 ISOD:\vm\win10\script启动脚本这样做的原因很简单所有跟这台虚拟机有关的东西都塞在一个目录里以后备份、迁移、清理都非常直观。2.3 下载 Windows 10 安装镜像与 virtio-win 驱动Windows 10 的安装镜像建议用微软官方 Media Creation Tool 下载或者从你已有的正版环境下获取合法镜像。你手里如果有 Enterprise LTSC 2021 这种版本同样能用安装流程没有区别关键看是否具备相应授权。下载完成后把 ISO 文件放到D:\vm\win10\iso目录下文件名我用Win10_22H2_x64.iso作为示例。第二个镜像才是 QEMU 装 Windows 的关键virtio-win 驱动 ISO。QEMU 给客户机提供的高性能虚拟设备Windows 默认不认识必须手动加载驱动。virtio-win 镜像可以从 Fedora 项目的 virtio-win 页面下载文件名一般是virtio-win.iso大小接近 600MB放到drivers目录。注意如果你安装时用默认的 IDE/SATA 磁盘控制器Windows 倒是免驱但性能一般。要体验 QEMU 的性能优势磁盘和网卡尽量上 virtio驱动镜像就绕不开。2.4 关于 UEFI/BIOS 启动方式的选择QEMU 默认使用 SeaBIOS 模拟传统 BIOS 引导Windows 10 x64 完全支持这也是我第一次尝试时用的方案。传统 BIOS 的优点是配置少启动稳定不用额外找固件文件。只有当你需要 Secure Boot、磁盘容量超过 2TB、或者想尽量贴近物理机 UEFI 环境时才需要给 QEMU 准备 OVMF 固件。做法是额外下载 OVMF 包在启动命令里用-drive ifpflash,formatraw,readonlyon,file...挂载。第一次玩 QEMU 的人我不建议一上来就搞 UEFI先用传统 BIOS 把整个流程跑通后面再按需升级。3. 用 qemu-img 创建虚拟磁盘类型、参数与坑安装 Windows 之前得先有一块“空硬盘”。QEMU 自带的磁盘工具叫qemu-img它负责创建、检查、转格式、打快照属于必会命令。3.1 qcow2 和 raw选谁QEMU 支持的磁盘格式非常多Windows 装机最常用的两种是 raw 和 qcow2。格式特点适合场景raw镜像大小和分配大小完全一致I/O 开销低性能最好追求速度、磁盘空间充足qcow2动态增长支持快照、压缩、加密日常学习、测试、需要备份如果你真的要在 QEMU 里长期日常用 Windows而且宿主机磁盘不紧张raw 会更稳。但 qcow2 的快照功能太实用了安装完系统、装完驱动、做快照之后随便折腾坏了一条命令回滚强烈推荐 qcow2。创建命令qemu-img create -f qcow2 -o cluster_size64K D:\vm\win10\disk\win10.qcow2 80G-f qcow2指定格式-o cluster_size64K设置集群大小。Windows 的 NTFS 和虚拟磁盘 I/O 模式对 64K 的集群比较友好默认的 2MB 也不是不能用但某些场景下 64K 性能更稳。80G是逻辑容量不是立即占 80GB。qcow2 是动态分配刚创建时文件很小随着虚拟机里的数据增加才会慢慢变大。创建完可以用dir看文件只有几百 KB。3.2 给 Windows 10 预留多大磁盘、要不要动态分配Windows 10 安装完加系统更新、休眠文件、自带应用轻松突破 30GB。虚拟磁盘建议至少给 60GB我给的是 80GB。有人担心动态分配的磁盘会越用越胖其实 Windows 删除文件之后QEMU 的 qcow2 镜像不会自动瘦身需要手动执行qemu-img convert或定期用工具回收。如果是测试用的虚拟机懒得维护就直接给固定大小如果只是想快速验证qcow2 动态增长更灵活。3.3 创建后检查磁盘信息创建完成后可以用 info 子命令看一眼磁盘基本情况qemu-img info D:\vm\win10\disk\win10.qcow2输出里应该有格式、虚拟大小、磁盘实际占用、集群大小这些信息。如果虚拟大小是 80G实际大小只有 200KB 左右说明动态分配生效了没问题。4. 第一轮启动QEMU 命令行参数逐项解读第一次启动 QEMU 命令行你可能会被一长串参数吓到。不用慌它的逻辑很直白就是“告诉我用哪种机器、多少内存、接哪块磁盘、连接什么网络、输出到哪里”。下面这句是我第一次装 Windows 10 用的完整命令。4.1 最小可启动命令在 CMD 里执行PowerShell 用反引号 换行CMD 用 ^ 换行qemu-system-x86_64 ^ -machine q35 ^ -accel tcg ^ -m 8192 ^ -smp 4 ^ -cpu qemu64 ^ -drive fileD:\vm\win10\disk\win10.qcow2,ifvirtio,formatqcow2,cachewriteback ^ -drive fileD:\vm\win10\iso\Win10_22H2_x64.iso,mediacdrom ^ -drive fileD:\vm\win10\drivers\virtio-win.iso,mediacdrom ^ -boot orderd ^ -device virtio-net-pci,netdevnet0 ^ -netdev user,idnet0 ^ -vga std ^ -display gtk ^ -usb ^ -device usb-tablet这里我故意先用-accel tcg目的是先跑通安装流程。如果你已经开启了 Windows Hypervisor Platform可以把-accel tcg换成-accel whpx把-cpu qemu64换成-cpu host速度会快很多。4.2 参数表每一个参数到底在干什么参数作用备注-machine q35使用比较现代的芯片组模型q35 比默认的 pc/i440fx 更接近新硬件-m 8192分配 8GB 内存按宿主内存调整-smp 4分配 4 个虚拟 CPUTCG 模式下不建议过多-cpu qemu64模拟一个通用 x86_64 CPUWHPX 下换-cpu host效果好-drive ...ifvirtio把 qcow2 磁盘作为 virtio-blk 设备安装时需加载 viostor 驱动-boot orderd优先从光驱启动d 代表 CD-ROMc 代表磁盘-netdev user用户态 NAT 网络客户机通过 QEMU 访问外部网络-device virtio-net-pci挂载 virtio 虚拟网卡安装后需装 NetKVM 驱动-display gtk用 GTK 窗口显示也可以试-display sdl-device usb-tablet绝对坐标鼠标设备没有它鼠标会乱飘4.3 把启动命令做成 .bat 脚本每次都手敲这么长命令不现实。我建议把启动命令存成D:\vm\win10\script\start-install.bat以后想重装系统就调用它想开始日常使用就另建一个start.bat。脚本内容就是上面那串命令开头加一句echo off cd /d D:\vm\win10这样哪怕其他终端路径不同脚本也能正确找到磁盘文件。4.4 启动后屏幕界面与可能的卡顿执行脚本后如果一切正常会弹出一个 GTK 窗口显示 Windows 10 的安装引导画面。如果没有弹窗看看终端有没有报错。常见的“无显示输出”是因为-display gtk在你的 QEMU 版本里不支持换-display sdl或-display sdl,gloff再试。TCG 模式下Windows 10 安装界面会比较拖沓鼠标移动、菜单切换都可能感觉到延迟这是正常的。等系统装完、换成 WHPX 启动参数之后会流畅不少。5. 安装 Windows 10 时加载 virtio 驱动的完整操作很多人在这一步放弃。Windows 安装程序跑到选择磁盘那一步界面里空空如也提示找不到驱动器。这不是 ISO 坏了也不是命令写错而是 Windows 根本不认识 QEMU 提供的 virtio 磁盘控制器。5.1 卡在“找不到驱动器”时别急如果你用的是 IDE/SATA 磁盘理论上不需要额外驱动但性能差点。如果你按上面命令用ifvirtio创建磁盘Windows 安装程序确实无法直接识别必须手动加载viostor驱动。在 Windows 安装界面点击“加载驱动程序”会弹出浏览窗口。此时 virtio-win ISO 已经作为第二块光驱挂进虚拟机了在“这台电脑”或“浏览”里找到光驱盘符通常是E:或D:进入viostor\w10\amd64目录。5.2 手动加载 viostor 驱动的步骤具体操作为点击 “加载驱动程序” 按钮。选择 “浏览”。定位到 virtio-win ISO 所在光驱。打开viostor文件夹。进入w10子目录再进入amd64。点击确定等待它列出 viostor 驱动。选择驱动点击下一步。加载成功后安装程序会立刻识别出那块未分配空间后面分区、安装操作就和平常一样了。5.3 系统安装完成后的第一件事继续装完 virtio 驱动系统装完进入桌面后第一件事不是联网激活而是把 virtio-win 完整驱动装上。推荐方式在虚拟机的资源管理器里打开 virtio-win ISO直接运行virtio-win-guest-tools.exe。这个安装包会统一安装网卡、内存气球、virtio 串口、显示驱动等一堆组件。装完驱动建议重启一次。重启后打开设备管理器确认网络适配器里能看到 virtio 网卡且无黄色感叹号磁盘驱动器里能看到一个 virtio 磁盘设备系统设备里也有 Balloon 服务这才算完整。5.4 如果一直蓝屏考虑换回 SATA 控制器有个别环境在 virtio-blk 驱动加载后会蓝屏代码通常和inaccessible boot device有关。这种情况不一定是驱动问题有时候是 QEMU 版本和镜像里的驱动不匹配。替代方案是先把磁盘控制器换回 SATA-drive fileD:\vm\win10\disk\win10.qcow2,formatqcow2,ifnone,iddrive0 ^ -device ide-hd,drivedrive0,buside.0但这样安装完系统后硬件路径就固定成 IDE 了后续再切 virtio 还需改驱动。我的建议是如果 virtio 驱动能装上就坚持用 virtio只有反复蓝屏、时间成本太高时才退回到 SATA 方案。6. 日常使用启动参数调整、网络端口转发与剪贴板系统装好virtio 驱动也装完接下来就是从安装模式切换到日常使用模式。这一步也需要改启动命令去掉安装光驱调整启动顺序让虚拟机直接从硬盘启动。6.1 正式启动命令去掉安装介质日常启动不需要再挂安装 ISO但 virtio-win ISO 可以保留万一要装额外驱动。启动顺序改为从磁盘优先qemu-system-x86_64 ^ -machine q35 ^ -accel whpx ^ -cpu host ^ -m 8192 ^ -smp 4 ^ -drive fileD:\vm\win10\disk\win10.qcow2,ifvirtio,formatqcow2,cachewriteback ^ -boot orderc ^ -device virtio-net-pci,netdevnet0 ^ -netdev user,idnet0 ^ -vga std ^ -display gtk ^ -usb ^ -device usb-tablet注意这里把-accel tcg换成-accel whpx把-cpu qemu64换成-cpu host。除非你的机器实在开不了 WHPX否则日常使用别用纯 TCGWindows 10 会卡到怀疑人生。6.2 user 网络与 hostfwd 端口转发QEMU 的-netdev user相当于一个 NAT 网络客户机默认能通过 DHCP 拿到 10.0.2.x 的 IP访问外部网络没问题。但宿主机想访问客户机默认是访问不了的需要通过hostfwd做端口转发。比如我想在宿主机上用 Windows 自带的远程桌面连接客户机先在虚拟机里开启“远程桌面”然后在 QEMU 网络参数里加一句-netdev user,idnet0,hostfwdtcp::23389-:3389这样宿主机访问127.0.0.1:23389就会被转发到客户机的 3389 端口。宿主机打开 mstsc填写127.0.0.1:23389就能连进去。这个方式比在 QEMU 里折腾剪贴板共享要省事得多。6.3 剪贴板/文件互通优先用 RDP 而不是纠结 QEMU 的共享目录很多人会习惯性找“共享文件夹”设置但 QEMU 默认没有像 VirtualBox 那样的无缝共享目录。比较顺手的几个路子需求推荐方案复制文本 / 文件拖送QEMU 窗口内装 SPICE guest tools或直接用 RDP 连接传输大文件在客户机里启动一个共享目录或 HTTP 服务长期桌面连接给客户机配置好 IP宿主机通过 hostfwd 用 RDP我实测下来最省心的方案就是给客户机开远程桌面然后在宿主机上用 mstsc 连。RDP 天然支持剪贴板和本地磁盘映射文件拖拽也很流畅比折腾 SPICE 要快得多。6.4 调整显示参数分辨率与鼠标定位QEMU 默认的-vga std分辨率不高Windows 装完驱动后通常可以自己调节分辨率。如果鼠标还是漂移多半是没加-device usb-tablet。这个设备会把鼠标坐标改成绝对定位和 Windows 更兼容。如果需要更高性能的显示可以尝试-vga virtio但 virtio-gpu 需要 Windows 驱动支持virtio-win-guest-tools 安装的组件里一般包含。这里量力而行跑普通桌面-vga std就够了。7. 性能优化和排错从开机慢到各种疑难杂症最后这部分算是我这几天的经验合集。前后踩了不下十个坑很多问题其实一句话就能点破但不写出来网上零散搜要花很久。7.1 优先开启 WHPX 硬件加速如果你在 Windows 10 宿主机上跑 QEMU默认情况下可能还在 TCG 模式速度很慢。开启 WHPX 后虚拟机运行速度会有质的提升。检查是否开启在“启用或关闭 Windows 功能”里勾选“Windows Hypervisor Platform”然后重启。启动命令里用-accel whpxqemu-system-x86_64 -accel whpx -cpu host ...如果报The WHPX API is unavailable说明系统没启用该功能或者虚拟机环境不支持嵌套虚拟化。如果确认功能已开还报错可以检查一下“内核隔离”中的内存完整性是否开启某些机器上硬件加速会受到影响。7.2 TCG 软件模拟下的提速策略如果 WHPX 实在开不了只能 TCG 时可以通过几个小调整让体验没那么折磨给虚拟机 4 个 vCPU 就好不要贪多TCG 多核调度在某些 Windows 版本里表现得不太稳定。磁盘缓存用cachewriteback可以稍微降低 IO 延迟。磁盘格式用 raw在 TCG 模式下 IO 开销比 qcow2 更低。安装系统时把 Windows 更新推迟避免后台更新占满 CPU。TCG 下不是不能跑但真要拿来办公或跑测试还是建议修复 WHPX。毕竟硬伤就是硬伤软件模拟替代不了硬件虚拟化。7.3 我遇到过的报错和解决清单现象原因解决方式Windows 安装时看不到磁盘没加载 virtio 驱动加载 viostor 驱动报错WHPX API is unavailable未启用 Windows Hypervisor Platform控制面板按步骤开启并重启报错unrecognized accelerator参数里写了不支持的加速后端换成-accel tcg或确认 WHPX 功能鼠标乱飞缺少 tablet 设备加-device usb-tablet客户机无法上网忘加网卡设备或网卡驱动未装核对-device virtio-net-pci和 NetKVM 驱动开机直接到黑屏显示参数和 QEMU 前端不兼容换-display sdl或-vga virtio启动顺序错误导致进入安装界面-boot参数没改日常启动用-boot orderc7.4 顺带一提 ARM64 镜像与跨架构模拟如果你搜 QEMU 搜到“模拟 ARM64”那其实是用qemu-system-aarch64去跑 ARM64 系统和本文里 x86_64 的 Windows 10 是两回事。Windows 10 ARM64 在 x86 宿主机上不是不能模拟但速度很感人安装和驱动链路也复杂得多。想体验 QEMU 跨架构能力建议先用 ARM64 Linux 练手等把qemu-system-aarch64的 UEFI、设备树、virtio 概念都摸熟再回来挑战 Windows ARM64。7.5 最后留给新手的两个实用习惯装完驱动、正常进入桌面后建议立刻给干净的 qcow2 做一次快照qemu-img snapshot -c clean-install D:\vm\win10\disk\win10.qcow2后面你随便安装测试软件把系统弄坏了一条命令回到干净状态qemu-img snapshot -a clean-install D:\vm\win10\disk\win10.qcow2快照的代价是磁盘文件变大所以只在关键节点打别频繁打。另一个习惯是每次启动虚拟机都用固定的脚本管理别直接手搓一长串命令。时间久了你会发现QEMU 的威力不在一行命令而在于那套“一切皆可脚本化”的思维方式虚拟机、网络、磁盘、快照全都可以用文本描述和保存这才是它从 Linux 一路火到 Windows 的真正原因。
返回列表