尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ubuntu Server + KVM/QEMU 安装 Windows 10 虚拟机全指南:virtio 性能调优与踩坑记录

Ubuntu Server + KVM/QEMU 安装 Windows 10 虚拟机全指南:virtio 性能调优与踩坑记录 这台主力机刚到手的时候我犹豫了很久到底要不要直接装Windows。AMD Ryzen AI Max 395这套平台16核Zen 5、Radeon 8060S集显加上128GB统一内存说实话跑Windows也不是不行游戏、创作软件都能招呼。但我的核心负载在Linux侧——跑模型推理、容器编排、自动化任务这些在Windows下折腾成本太高。麻烦的是手头有几个业务工具偏偏是Windows only客户指定的财务客户端、老旧的U盾管理程序、一个只能在Win10下正常工作的行业软件。于是方案就变成了宿主机跑Ubuntu Server 24.04用KVM/QEMU开一台Windows 10虚拟机平时Linux侧负载照跑需要Windows环境的时候远程桌面进去处理。这篇文章把完整的搭建过程、关键参数、踩过的坑全部整理出来。适合两类人一是在AMD新平台Linux服务器上需要Windows兼容环境的人二是想把桌面Linux改成无头服务器、又离不开Windows小尾巴的人。整个过程不涉及任何商业虚拟化软件全部基于Linux内核自带方案稳定性和性能都经得起长期跑。1. 为什么在Ubuntu Server上装Win10我选择了KVM/QEMU1.1 先搞清楚这套硬件的底气AMD Ryzen AI Max 395是Strix Halo平台的旗舰型号核心规格摆在这16核32线程的Zen 5 CPU、RDNA 3.5架构的Radeon 8060S核显、XDNA 2 NPU内存最高可以配到128GB LPDDR5X。对虚拟化场景来说这套硬件的核心优势不是显卡多强而是CPU核心数足够多、内存容量足够大。我给虚拟机分16GB内存和8个vCPU宿主机还能剩下16个线程和上百GB内存跑自己的业务互不干扰。Ubuntu Server 24.04是当前LTS版本仓库里的QEMU 8.2、libvirt 10.0和virtinst 4.1组合已经非常成熟对UEFI引导、vTPM、virtio设备这些虚拟化特性的支持都很完整不需要自己编译任何东西。内核6.8对Zen 5架构的SVM虚拟化支持也早就到位了装好系统基本开箱即用。1.2 桌面级方案和Server级方案的分水岭网上很多教程推荐在Linux桌面主机上用VirtualBox或者VMware Workstation装Windows这在有图形界面的场景下没问题但换到无头Server环境就不太合适了。我自己做了个对比放在这方便你判断方案适用场景无头管理的难度性能损耗我的评价VirtualBox桌面Linux、临时测试命令行管理较别扭需额外装扩展包中等不适合长期Server承载VMware Workstation桌面Linux/Windows需要在图形界面操作Server上难维护中等上手容易但授权和生态偏桌面KVM/QEMU libvirtLinux服务器、云主机命令行或Web UI都很成熟很低接近原生首选方案Proxmox VE多虚拟机、集群化管理Web UI强大但等于换了一套系统很低如果宿主机纯粹跑虚拟机可以选它我最终没上PVE的原因很简单这台机器不只是虚拟化宿主Linux侧还要跑不少服务PVE的Debian底座会限制我的软件调配自由度而Ubuntu Server 原生KVM不需要额外装系统直接在当前环境里把虚拟化能力打开就行。1.3 为什么KVM是Server场景下的正统答案KVM本身是Linux内核模块虚拟化指令直接走硬件不经过用户态模拟层所以性能损耗比全虚拟化方案低很多。配合QEMU作为用户态设备模拟器再加上libvirt这一层管理工具整个体系就是云计算厂商标配的那套虚拟化栈。你在AWS、阿里云上买的ECS底层就是这套东西稳定性经过大规模生产验证。对个人用户来说KVM生态的最大优势是命令行工具链成熟。virt-install一条命令建虚拟机virsh管理生命周期virt-viewer看控制台全部都能在纯SSH环境下完成。服务器要的就是这种可脚本化、可远程操作的管理方式。2. 装好Ubuntu Server 24.04后先确认虚拟化三要素2.1 BIOS里的SVM开关我差点栽在这新买的主板或者迷你主机BIOS里默认最容易被忽略的就是AMD SVM Mode这个选项。某些品牌机为了所谓的“安全”默认是关闭的一旦关着后面所有虚拟化操作都会报错。开机进BIOS找到Advanced或者Overclocking菜单里的SVM Mode设为Enabled。我测试的时候遇到过一种反直觉的情况BIOS里明明显示SVM已经开启但系统里检查还是不行。后来发现是这台机器的BIOS有个“虚拟化技术”和“SVM”两个并列选项一个控制IOMMU一个控制CPU虚拟化只开前者是不够的。遇到这种情况两个都打开。2.2 内核模块与软件包一条指令全部搞定装完系统先验证CPU虚拟化是否已经暴露给系统egrep -c (vmx|svm) /proc/cpuinfo返回的数字大于0就说明CPU虚拟化指令已经可用。如果是0检查BIOS。接着确认内核模块lsmod | grep kvm正常应该能看到kvm_amd。如果看不到手动加载sudo modprobe kvm_amd然后安装整套虚拟化组件Ubuntu Server 24.04的仓库已经打包好sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst ovmf swtpm这里我额外提醒一下ovmf和swtpm这两个包很多人会漏掉。ovmf提供UEFI固件没有它虚拟机只能走传统BIOS引导swtpm提供软件模拟的TPM芯片Windows 11和部分加密场景依赖它。虽然我们装的是Win10但后面如果想升级Win11或者开BitLocker没有vTPM会很尴尬。2.3 用户组权限别让sudo成为唯一出路libvirt的客户端工具默认只允许root和libvirt组成员操作虚拟机。如果你不想每条命令都加sudo把当前用户加进组里sudo usermod -aG kvm,libvirt $(whoami)这个操作需要重新登录会话才生效。我一开始没加组导致后期写自动化脚本时到处是sudo别提多痛苦。顺手把libvirtd服务设为开机自启sudo systemctl enable --now libvirtd2.4 网络准备给Windows虚拟机一个桥接网络虚拟机网络模式有NAT和桥接两种。NAT模式下虚拟机通过宿主机共享IP上网外部设备访问虚拟机需要做端口转发非常绕。桥接模式让虚拟机直接出现在局域网里有自己的IP外部可以直接RDP过去这才符合“服务器上独立Windows环境”的定位。Ubuntu Server 24.04默认用netplan管理网络配置文件在/etc/netplan/下。把物理网卡配置改成桥接network: version: 2 ethernets: enp88s0: dhcp4: false bridges: br0: interfaces: [enp88s0] dhcp4: true注意网卡名称要根据实际环境改可以通过ip -br addr查看。应用配置前强烈建议备份原文件并且最好人在机器旁边操作因为如果配置写错SSH连接会直接断掉。我当时就是远程操作一个回车之后连接就断了幸好IPMI还能进。3. 从ISO到第一台Win10virt-install命令全解3.1 准备工作两个ISO一个都不能少第一个是Windows 10安装镜像。去微软官网下载“下载Windows 10光盘映像”页面选择版本后可以得到ISO文件。建议下载22H2版本的官方镜像稳定性最好。第二个是virtio-win驱动镜像。Windows默认不认识virtio虚拟设备特别是磁盘控制器没有这个驱动安装程序连硬盘都看不到。下载地址在Fedora的virtio-win项目目录下搜索“virtio-win.iso”就能找到稳定版。把两个镜像都放到服务器上比如/var/lib/libvirt/boot/目录权限设为644确保libvirt能读取。3.2 完整创建命令参数逐个拆开看我最终使用的创建命令如下中间踩了几个坑都体现在参数里了sudo virt-install \ --name win10 \ --memory 16384 \ --vcpus8 \ --cpu host-passthrough,cache.modepassthrough \ --disk path/var/lib/libvirt/images/win10.qcow2,size120,formatqcow2,busvirtio,cachewriteback \ --cdrom /var/lib/libvirt/boot/Win10_22H2_Chinese_Simplified_x64.iso \ --disk path/var/lib/libvirt/boot/virtio-win.iso,devicecdrom \ --network bridgebr0,modelvirtio \ --os-variantwindows10 \ --video qxl \ --graphics spice,listen0.0.0.0 \ --sound none \ --boot uefi逐个解释关键参数的意义--memory 16384分配16GB内存。395平台标配64GB以上内存16GB给Windows绰绰有余。--vcpus8分配8个vCPU。不是越多越好这个在第五章详细说。--cpu host-passthrough直接把宿主机CPU的全部特性透传给虚拟机Windows能正确识别出“AMD Ryzen AI Max 395”而不是一个被掩盖的QEMU虚拟CPU。这在性能调度和软件兼容性上都更优。--disk size120创建120GB的qcow2虚拟磁盘。qcow2是稀疏文件开始很小用多少占多少不会一下子吃满宿主机空间。--network bridgebr0,modelvirtio使用刚才创建的桥接网卡虚拟机直接出现在局域网中。--boot uefi使用UEFI引导代替传统BIOS。Windows 10对UEFI支持完善也为vTPM和后续Win11升级留好路。3.3 vTPM的补充配置virt-install版本较老或者参数不支持时--tpm不一定能用。我在创建后发现需要手动给虚拟机补上vTPM设备方法是编辑虚拟机XML配置sudo virsh edit win10在devices部分加入tpm modeltpm-crb backend typeemulator version2.0/ /tpm保存后重启虚拟机。这里背后是swtpm在提供软件模拟的TPM 2.0芯片Windows可以正常识别并用于BitLocker等功能。实测Win10对vTPM的依赖不像Win11那么强制但存在比不存在好。3.4 创建后的基本检查创建完成后用virsh list --all确认虚拟机状态。正常情况下应该显示win10已经定义但没启动。启动虚拟机sudo virsh start win10如果需要看安装画面有图形环境的机器可以用virt-viewer纯命令行环境建议直接跳到第四章装完系统后用RDP体验更好。4. Windows安装中最难受的一步给virtio磁盘装驱动4.1 现象安装程序看不到硬盘virt-install创建完成后进入Windows安装程序如果你选择的是virtio磁盘总线大概率会遇到一个让新手崩溃的画面磁盘列表一片空白提示“找不到任何驱动器”。这不是镜像问题也不是硬件问题而是Windows安装程序本身不带virtio存储控制器驱动。virtio是半虚拟化设备guest系统需要通过专门的驱动与宿主通信这跟传统模拟的SATA/IDE完全不同。virtio的优势是延迟低、吞吐高、CPU占用小缺点就是安装阶段比较折腾。4.2 加载驱动其实就三步在Windows安装程序“找不到驱动器”的界面点击“加载驱动程序”然后浏览到virtio-win.iso挂载的光驱。注意不要直接选根目录要逐级进入virtio-win.iso - amd64 - w10 - viostor.inf选择兼容的“Red Hat VirtIO SCSI controller”或“VirtIO Block Device”下一步就能看到磁盘了。之后正常分区、安装Windows即可。有个小细节提醒如果虚拟机里挂了两个光驱安装程序可能不会自动展开virtio-win光驱需要先在“此电脑”里手动打开D盘或E盘确认路径。我在实际操作中还遇到过驱动目录选错导致“找不到适配的驱动”提示换成w10文件夹就正常了。4.3 装完系统后的第一件事补齐全套virtio驱动系统装好进入桌面后马上去设备管理器看应该能看到一堆带黄色感叹号的未知设备。这些都需要驱动光靠Windows Update可不行。打开virtio-win光驱运行里面的virtio-win-guest-tools.exe一次装齐所有驱动包括网卡、显卡、内存气球、串口和QEMU guest agent。QEMU guest agent特别重要它让宿主机能通过virsh命令与Windows内部交互比如安全关机、读取IP地址、冻结文件系统做快照。装好之后宿主机执行sudo virsh domifaddr win10就能直接看到虚拟机的IP地址不用再进Windows里去查。4.4 为什么要用virtio而不是SATA有人可能觉得既然virtio安装驱动这么麻烦不如直接把磁盘总线改成SATAWindows原生支持省事。这个想法在低负载场景下可以接受但virtio的性能优势太明显了。同样一块NVMe SSDvirtio磁盘的随机读写性能通常比模拟SATA高出一倍以上CPU占用还更低。既然都已经在KVM上了就该用完整套virtio安装时多花五分钟后面长期受益。5. 把395的实力喂给Win10内存、CPU、磁盘三件套调优5.1 CPU拓扑为什么建议8核16线程而不是直接给32线程刚开虚拟机时我贪心把所有32线程都给了Windows结果性能反而不好。原因在于Windows对CPU拓扑非常敏感vCPU数量超过一定阈值后线程调度的开销开始吞噬性能特别是在普通桌面应用和单线程负载场景下。更合理的做法是指定拓扑让Windows认为虚拟机是一个8核16线程的CPUsudo virsh edit win10找到vcpu标签改成vcpu placementstatic8/vcpu cputune vcpupin vcpu0 cpuset0/ vcpupin vcpu1 cpuset1/ vcpupin vcpu2 cpuset2/ vcpupin vcpu3 cpuset3/ vcpupin vcpu4 cpuset4/ vcpupin vcpu5 cpuset5/ vcpupin vcpu6 cpuset6/ vcpupin vcpu7 cpuset7/ /cputune同时指定CPU拓扑sudo virsh edit win10在cpu标签内加cpu modehost-passthrough checknone topology sockets1 dies1 cores8 threads2/ cache modepassthrough/ /cpu这样Windows会识别为一个物理CPU、8个物理核心、每个核心2线程。对软件授权识别、应用调度都很友好。实际测试中从这个配置下跑多线程编译和Office类应用响应速度比32线程全给的时候还快。5.2 内存固定与大页内存让虚拟机少折腾默认情况下libvirt会把虚拟机内存作为可回收资源宿主内存压力大时可能触发交换。对于Windows这个内存大户我建议把内存设为固定分配不让宿主回收memoryBacking hugepages page size2048 unitKiB/ /hugepages locked/ /memoryBacking对应地宿主系统要预分配大页内存echo 8192 | sudo tee /proc/sys/vm/nr_hugepages一条命令分配16GB的2MB大页。持久化写入/etc/sysctl.d/99-hugepages.conf。大页内存可以减少虚拟机的TLB miss对数据库、编译这类内存密集型的负载有肉眼可见的提升。5.3 磁盘IOcache模式与iothread虚拟磁盘的cache参数直接影响写入稳定性。我最终用的是cachewriteback这是性能和安全性之间的平衡点。cacheunsafe虽然性能最好但一旦宿主机突然断电虚拟机数据可能损坏生产环境千万别碰。如果你的虚拟机跑的是对磁盘要求高的应用可以考虑给virtio磁盘分配独立的iothread把磁盘中断处理从vCPU上剥离出来。在XML中添加iothreads2/iothreads然后磁盘设备中指定disk typefile devicedisk driver nameqemu typeqcow2 cachewriteback iothread1/ ... /disk实测iothread能让磁盘IO延迟更稳定特别是在多任务并发的场景下。5.4 什么时候别调优说句泼冷水的话如果你的Windows虚拟机只是偶尔远程进去处理一下财务软件上面这些调优里CPU拓扑有意义hugepages和iothread带来的体感差异几乎为零。调优之前先判断负载类型。我自己是全套调完之后跑分心理舒坦但日常使用中真正感知明显的还是CPU拓扑、内存固定这两个。6. 无头Server下使用Win10的正确姿势RDP、自启动与端口6.1 开启远程桌面比SPICE体验好太多无头服务器上访问虚拟机画面传统方式是用virt-viewer或SPICE客户端但体验一般分辨率、剪贴板、声音都有限制。更务实的方案是直接在Windows虚拟机里开启远程桌面然后用你的物理机RDP连接。Windows自带的RDP协议在局域网内流畅度和剪贴板共享都做得很好还支持声卡重定向。虚拟机内操作路径设置 - 系统 - 远程桌面 - 启用远程桌面。然后确认防火墙放行3389端口。6.2 虚拟机随宿主机自启动服务器重启后虚拟机最好能自己起来不然每次都要手动virsh start。一行命令搞定sudo virsh autostart win10libvirtd服务在系统启动时自动拉起所有标记为autostart的虚拟机。注意如果虚拟机的磁盘有问题宿主启动后会反复尝试拉起失败所以确保虚拟机正常关机过再设置这个。6.3 外部访问从固定IP到安全策略由于用的是桥接网络虚拟机直接从局域网DHCP获取IP。为了避免IP漂移我在虚拟机内把IPv4设为固定地址例如192.168.1.50掩码和网关与宿主机一致。从外部RDP连接只需要保证宿主机和虚拟机的防火墙都放行了相关端口。Ubuntu Server默认如果开了ufw需要允许转发sudo ufw allow in on br0如果要从公网访问这台Windows虚拟机我的建议是不要直接把3389映射出去。更稳的做法是走SSH隧道在物理机上执行ssh -L 33389:192.168.1.50:3389 useryour-server-ip然后RDP连接localhost:33389。这样所有流量都走加密SSH通道不用在公网暴露RDP服务。6.4 虚拟机内的Windows基础优化进入Windows后我做了几个常规优化电源计划改为“高性能”防止笔记本式省电策略拖慢性能在“系统属性 - 高级 - 性能设置”里关闭动画和透明效果提高RDP响应速度关闭Windows Defender的定时扫描时段避免每天某个时间虚拟机突然卡顿。这些优化对虚拟化环境尤其重要因为在RDP场景下每一帧渲染都要走网络越少的系统后台动作意味着越流畅的远程体验。7. 平台相关故障记录与排查思路395 24.04容易踩的坑7.1 启动报错KVM is not available症状virt-install创建成功但virt-viewer里虚拟机一启动就自动退出查看日志显示KVM is not available。排查链路第一层检查/proc/cpuinfo里是否有svm标志第二层检查lsmod | grep kvm_amd第三层检查/dev/kvm是否存在。多数情况下是BIOS里的SVM没开少数情况是内核模块没自动加载执行sudo modprobe kvm_amd后重启libvirtd解决。7.2 Windows安装完成后重启蓝屏 INACCESSIBLE_BOOT_DEVICE症状系统能安装完但第一次重启后蓝屏。排查链路这个蓝屏几乎都是存储驱动问题Windows在重启后没有正确加载virtio引导驱动。修复方式在Windows安装界面按ShiftF10打开命令行用diskpart查看分区情况确认系统分区是否被正确标记为活动分区。如果是uefi引导检查EFI分区是否存在。更直接的规避方式是安装时使用SATA总线创建一次系统装好后在系统内切换到virtio驱动但操作复杂我更推荐重新安装安装过程中确保viostor驱动加载成功再分区。7.3 桥接网络不通症状虚拟机内IP地址能正常获取但外部设备无法访问虚拟机。排查链路先看br0在宿主机上是否正常获取IP再测试sudo virsh domifaddr win10确认虚拟机IP最后检查防火墙转发规则。Ubuntu Server如果启用了UFW默认FORWARD策略可能是DROP需要显式放行br0上的转发流量sudo iptables -I FORWARD -i br0 -o br0 -j ACCEPT还有一个坑物理网卡如果启用了Wol网络唤醒或者多队列特性桥接模式下可能会有异常。测试时可以先关闭这些高级特性。7.4 vTPM初始化失败Windows提示安全设备错误症状虚拟机正常启动但Windows设备管理器里TPM设备显示异常或者BitLocker无法启用。排查链路确认swtpm服务正在运行检查虚拟机XML里的tpm设备配置。如果之前用virsh edit加过tpm段保存后没重启虚拟机TPM设备可能没有重新初始化。重启虚拟机后如果还不行删除tpm设备再重新添加。实测中还有一个干扰项BIOS里开了PSP fTPM的话KVM宿主上的软件TPM可能和宿主自身TPM冲突需要把宿主BIOS里的fTPM关闭。7.5 性能反差虚拟机内CPU占用高但运行卡顿症状Windows任务管理器显示CPU占用率不高但操作明显卡顿。排查链路最先怀疑的对象是QXL显卡驱动没装。如果没有virtio显卡驱动Windows用的是Microsoft基本显示适配器所有图形渲染走CPU模拟RDP下尤其卡。装好virtio-win全套驱动后这个问题基本消失。其次检查内存是否被气球驱动回收过多如果虚拟机关机后配置的内存和实际可用内存差太多检查memoryBacking里是否配置了hugepages和locked没配置的话Windows内存可能被换出。写在最后关于这套方案的几个真实体会从搭建到现在这台虚拟机已经稳定跑了差不多一个季度。Windows 10虚拟机的主要用途是跑那几个Windows only业务软件和偶尔的Office工作Linux侧则承担着AI推理、容器服务和各种自动化脚本。两者互不干扰性能也都够用。我个人最大的体会是KVM这套东西看着命令多、参数杂但一旦建立起来稳定性远超预期。几个月里我经历了几次宿主机内核升级和重启虚拟机能通过autostart自动恢复运行状态Windows里正在编辑的文档也不受影响。最后分享一个实用小技巧Windows更新前先在宿主机上拍一个虚拟机快照sudo virsh snapshot-create-as win10 before-update before windows update如果更新出了问题一条命令回滚sudo virsh snapshot-revert win10 before-updateqcow2镜像支持快照是原生功能不占用额外磁盘空间基于COW机制平时不用不占地方应急时能救命。这套“Ubuntu Server KVM Win10”的组合核心思路就一句话让Linux做它擅长的事让Windows待在该在的地方。
返回列表