KVM/QEMU实战:AMD Ryzen AI Max+ 395上的Ubuntu Server与Win10虚拟机部署全记录 最近折腾了一台搭载AMD Ryzen AI Max 395的迷你主机目标很明确宿主机跑Ubuntu Server 24.04 LTS做家里的常驻服务器但手头有几个Windows专属软件也必须能跑起来。和大多数人的第一反应不同我没直接在这台机器上装双系统而是选择了KVM/QEMU方案把Win10装成虚拟机。这套组合踩下来有惊喜也有坑把完整过程整理出来给想在高性能AMD平台上跑服务器Windows虚拟机的朋友做个参考。折腾环境、装虚拟机这事细节决定成败少踩一个坑就能省一晚上。1. Ryzen AI Max 395到底强在哪为什么选它跑Win10虚拟机1.1 一块“APU天花板”带来的虚拟机红利AMD Ryzen AI Max 395这颗处理器严格说已经不是传统意义的APU了。它集成了Zen 5架构的16核32线程CPU、RDNA 3.5架构的40CU核显以及XDNA 2架构的NPU。最关键的是内存——它支持超高位宽的LPDDR5X统一内存顶配规格下容量轻松来到96GB甚至128GB级别。这种“CPUGPU内存全部打包”的设计放在服务器场景里简直是为虚拟化量身定做的。跑虚拟机这件事最怕的不是CPU不够快而是“吃不饱”。CPU慢一点无非是多等几秒编译、多转一会儿码但如果内存带宽不足虚拟机里的磁盘IO、网络转发、图形绘制全都会卡而且卡得毫无规律排查起来非常折磨。Ryzen AI Max 395的超高位宽统一内存恰好把这层瓶颈拿掉了我在Win10虚拟机里同时开浏览器、Office套件和几个绘图软件宿主机的负载依然很轻松。另一个红利来自核显。很多人在Linux服务器上装Win10虚拟机默认会放弃图形加速Windows桌面卡成幻灯片。但在这颗处理器上Radeon 890M级别的核显有amdgpu驱动QEMU可以借助它给虚拟机提供不错的图形性能。后续如果愿意深入折腾这块核显还支持SR-IOV直通能给虚拟机分出独立的显卡设备——这个后文会细说。1.2 无头服务器场景下的资源分配思路我这台机器内存是128GB硬盘用了两条NVMe组了软件RAID 1。规划资源时我给自己定了这么一套分配方案资源项宿主机保留Win10虚拟机分配备注CPU6核12线程10核20线程宿主机跑Docker和编译任务不能全给虚拟机内存64GB64GBWin10给64GB已是“豪横”水平剩余留给文件缓存存储2TB NVMe RAID 1200GB虚拟磁盘qcow2格式后续可按需扩容网络千兆/2.5G物理网卡桥接模式虚拟机需要能被NAS和其他设备直接访问很多第一次玩虚拟化的人容易犯一个错误把所有核心全塞给虚拟机。我一开始也这么干过结果宿主机卡到连SSH都延迟。原因很直白宿主机本身要跑文件系统、网络协议栈、虚拟化层这些都得吃CPU。你给虚拟机32个vCPUKVM调度器本身也会产生额外开销反而降低整体吞吐。预留资源这件事没有标准答案我的经验是宿主机至少保留25%的CPU和25%的内存尤其在无人值守的服务器上。你要是只跑一个Windows虚拟机、宿主什么都不干那可以多给点但只要跑Docker、跑监控、跑NAS服务务必要留余量。Ryzen AI Max 395一共就16个物理核心给虚拟机10到12个剩下的足够稳住宿主机这个平衡点是最舒服的。2. 宿主机Ubuntu Server 24.04 LTS的环境准备与踩坑2.1 安装时容易被忽略的SSH与RAID配置Ubuntu Server 24.04 LTS用的还是subiquity文本安装向导整体很清爽但有两个选项非常容易被忽略。第一个是OpenSSH server安装向导在“软件配置”阶段会问你要不要装SSH默认是不装的。无头服务器没有显示器没有键盘不装SSH就意味着你得再接显示器去救极其痛苦。所以我建议这里直接勾选“Install OpenSSH server”并且准备好自己电脑上的终端软件。第二个是磁盘布局。24.04的安装器支持自定义存储配置可以用软件RAID。我现在这台机器是两条NVMe组RAID 1当时在安装界面里选了“Custom storage layout”然后对两块盘分别建了相同的分区再组合成md设备。具体的菜单路径是先选中对第一块盘新建GPT分区表创建EFI和Linux文件系统分区第二块盘做同样操作然后点“Create RAID”选RAID 1把两个对应分区加进去最后在RAID设备上建LVM或者直接用ext4。这套操作在subiquity里不算难但要记住RAID 1是“两块盘完全镜像”容量只有单盘大小数据安全性远比性能重要。装完之后第一件事我建议马上跑一遍sudo apt update sudo apt upgrade -y sudo reboot不要跳过升级。24.04刚发布后有几个内核小版本修正涉及KVM和amdgpu驱动的稳定性长期跑虚拟机最好穿上最新补丁。2.2 安装后必做的虚拟化确认与内核参数系统装完确认虚拟化是否可用的标准动作如下egrep -c (vmx|svm) /proc/cpuinfo如果输出数字大于0说明CPU的虚拟化扩展已经打开。AMD平台对应的是SVM通常在BIOS里叫“SVM Mode”或者“AMD-v”。有一类迷你主机默认把SVM关闭哪怕你在系统里看到/dev/kvm不存在也没法用KVM只能退回QEMU纯软件模拟——那个性能落差会让人怀疑人生。所以拿到新机器第一件事进BIOS把SVM打开顺便确认Secure Boot的模式不要影响后续加载OVMF。再安装一个cpu-checker工具做确认sudo apt install cpu-checker kvm-ok理想输出是INFO: /dev/kvm exists KVM acceleration can be used到这里宿主机的虚拟化地基就打好了。3. 虚拟化方案选型KVM/QEMU为什么是唯一靠谱选项3.1 对比VirtualBox、VMware后的结论这个话题容易引战但我只从“服务器长期跑虚拟机”这个场景说结论。VirtualBox的GUI和易用性确实好但它的无头管理、性能以及稳定性和KVM不在一个量级而且VirtualBox的vboxdrv内核模块每次内核升级都要重新编译在无人值守的服务器上这就是定时炸弹。VMware Workstation的兼容性很强但它是面向个人桌面场景的且需要GUI辅助管理许可证也是开销放在纯命令行SSH环境里很别扭。KVM/QEMU是Linux内核自带的全虚拟化方案架构上分两层KVM负责CPU虚拟化和内存虚拟化直接利用AMD-V/SVM硬件扩展QEMU负责模拟设备。这套方案的优势一句话总结它是Linux系服务器上性能损耗最小的方案同时libvirt生态提供了完整的命令行管理能力备份、快照、迁移、自动启动全都有成熟API。Ryzen AI Max 395这种性能怪物配KVM才不浪费。3.2 virtio全套驱动虚拟机性能的关键用QEMU装Windows最容易被人忽视却又影响最明显的是磁盘和网卡的总线类型。装的时候如果图省事用默认的IDE硬盘和e1000网卡装完系统也能用但磁盘IO和网络吞吐会惨不忍睹。KVM里有个概念叫半虚拟化设备也就是virtio系列。简单解释普通设备模拟是QEMU给虚拟机模拟出一块“像真的一样”的网卡/硬盘每次IO请求都要经过完整的设备仿真路径开销巨大而virtio让虚拟机直接感知到自己运行在虚拟化环境中与QEMU通过共享内存环形队列交换数据省去仿真损耗。这就好比你要送一个包裹模拟设备是快递员每层楼敲门问有没有人virtio是直接在楼道里装了一部专用货梯楼层对讲快递员不用出电梯就知道各家需求。virtio全家桶包括组件对应驱动作用virtio-blkviostor.sys虚拟磁盘控制器virtio-netNetKVM虚拟网卡virtio-gpuviogpudo虚拟显卡qemu-guest-agentqemuwatchdog宿主机与虚拟机通信的小助手所以创建虚拟机之前必须准备好一份virtio驱动镜像ISO格式装系统的时候在“加载驱动”步骤预装否则一切白搭。4. Win10虚拟机创建全过程从virt-install到系统安装4.1 准备Win10 ISO和virtio驱动ISO安装KVM相关软件包sudo apt install qemu-system-x86 qemu-utils libvirt-daemon-system libvirt-clients virtinstlibvirt通过systemd管理装好会自动启动libvirtd服务可以用systemctl status libvirtd确认。然后要准备两个ISO文件都放进/var/lib/libvirt/images/目录Win10官方ISO建议用微软官方媒体创建工具或官方镜像站下载。virtio-win ISOFedora项目维护的Windows virtio驱动集合文件名一般是virtio-win-x.x.xx.iso里面包含了viostor、NetKVM、viogpudo等所有需要的驱动。这两个文件是后续安装的基础缺一不可。我遇到过有人只准备Win10 ISO、装系统时才发现认不出virtio硬盘然后各种乱改配置纯粹浪费时间。4.2 用virt-install一行命令创建虚拟机下面是我实际使用的virt-install命令先贴出来再逐段解释sudo virt-install \ --name win10 \ --memory 65536 \ --vcpus 20 \ --cpu host-passthrough,cache.modepassthrough \ --machine q35 \ --boot uefi \ --disk path/var/lib/libvirt/images/win10.qcow2,size200,formatqcow2,busvirtio,cachewriteback \ --cdrom /var/lib/libvirt/images/Win10_22H2_Chinese.iso \ --disk path/var/lib/libvirt/images/virtio-win.iso,devicecdrom \ --os-variant win10 \ --network networkbridged-network,modelvirtio \ --graphics vnc,listen127.0.0.1,port5900 \ --video virtio \ --boot hd,cdrom,menuon几个关键点说下为什么这么选--cpu host-passthrough直接把宿主机的CPU特性全部透传给虚拟机CPU性能和迁移性不可兼得但在同一台机器上长期跑这是最高性能选择。不要用默认的qemu64性能差很多而且缺少部分指令集可能导致Win10某些软件崩溃。--machine q35QEMU的新一代芯片组支持PCIe、UEFI、原生NVMe模拟。老式的i440fx芯片组虽然兼容性好但对Win10来说功能缺失太多性能也有损耗。--boot uefi使用OVMF固件也就是UEFI启动。Win10对UEFI支持很成熟Legacy BIOS能避则避安装系统时分区风格也统一用GPT。--network networkbridged-network,modelvirtio这里我的libvirt里已经定义了一个名为bridged-network的桥接网络后文会讲怎么建。创建命令跑完如果没加--noautoconsole终端会卡在等待VNC连接的状态别慌这是正常的。它其实在等待你去连VNC完成安装。4.3 安装Win10时的几个关键选择VNC连上去之后就会看到Win10安装界面。这里有几个坑第一选择安装版本时建议选专业版Pro因为专业版支持组策略、RDP远程桌面等远程管理功能家庭版会少很多服务器场景需要的东西。第二到了“您想进行哪种类型的安装”这一步一定要选“自定义仅安装Windows高级”因为我们要在空虚拟磁盘上安装不是升级。第三最关键的一步进入磁盘分区界面后会看到“无法找到任何驱动器”或者磁盘显示未分配但无法新建分区。这就是因为在virtio磁盘上还没加载驱动。点击“加载驱动程序”→“浏览”找到光驱里的virtio-win目录进入vioscsi\w10\amd64或viostor\w10\amd64文件夹系统会自动识别驱动加载后就能看到磁盘了。我第一次装的时候在这个界面卡了半小时后面才知道还得加载vioscsi控制器驱动而不仅仅是viostor。装完系统后重启VNC画面会黑屏一段时间然后进入Windows首次启动的OOBE流程。走到这一步Win10虚拟机的基础就已经立住了。5. 安装后的性能调优与网络打通5.1 让Win10用上接近原生的磁盘性能系统装完第一件事不是装驱动、不是调设置而是用virsh关闭虚拟机然后对配置做几项微调。先用virsh shutdown win10优雅关机然后编辑配置sudo virsh edit win10在disk标签里确认有这些关键属性disk typefile devicedisk driver nameqemu typeqcow2 cachewriteback iothread1 queues4/ source file/var/lib/libvirt/images/win10.qcow2/ target devvda busvirtio/ /diskcachewriteback在虚拟机层面看来是异步写入能显著提升小块随机写的性能iothread和queues让磁盘中断可以由多个线程分发减少CPU单核瓶颈。这套配置下我在Win10里跑CrystalDiskMark顺序读写能到接近宿主机裸盘性能的七八成随机4K也远好于默认的IDE模拟。如果对性能极致敏感还可以在关机状态下用qemu-img convert把qcow2转成raw格式sudo qemu-img convert -O raw win10.qcow2 win10.raw -praw格式没有qcow2的元数据和写时复制开销性能更高但代价是失去快照能力。我个人的取舍是服务器环境优先保快照能力所以保留qcow2性能损失在日常使用里几乎不可感。5.2 桥接网络配置让外部设备直接访问虚拟机默认的KVM NAT网络让虚拟机只能从宿主机访问外部外部设备想直接连虚拟机里的Windows就费劲了。要解决这个问题要用桥接网络。在Ubuntu Server 24.04的netplan配置文件/etc/netplan/01-netcfg.yaml里把物理网卡加入网桥network: version: 2 ethernets: enp1s0: dhcp4: no bridges: br0: interfaces: [enp1s0] dhcp4: yes parameters: stp: false forward-delay: 0然后应用配置sudo netplan apply如果这才发现连不上SSH了是因为enp1s0的IP已经转移到了br0上重新用主机IP连一次即可。接着在libvirt里定义这个桥接网络sudo virsh net-define /dev/stdin EOF network namebridged-network/name forward modebridge/ bridge namebr0/ /network EOF sudo virsh net-start bridged-network sudo virsh net-autostart bridged-network然后编辑虚拟机配置把interface改成interface typenetwork source networkbridged-network/ model typevirtio/ /interface重启虚拟机后Win10会直接从路由器获取局域网IP外部设备可以RDP远程桌面、访问文件共享跟在实体机上装了Win10没有任何区别。5.3 CPU、内存与虚拟化层面的精细调优到这里虚拟机已经能用了但离“舒服地长期跑”还差几步。CPU拓扑最好在创建时就规划好。如果系统里经常跑需要识别核心数的软件建议用virsh edit在cpu标签里显式声明拓扑cpu modehost-passthrough checknone topology sockets1 cores10 threads2/ cache modepassthrough/ /cpu10核20线程配合Windows本身的调度器足够把多线程任务压满。注意不要把sockets设太多Windows对多路CPU的NUMA感知和授权策略有很多历史包袱单socket多核多线程是最稳的配置。内存侧如果宿主机内存富余建议给虚拟机锁定内存并开启大页memoryBacking hugepages/ locked/ /memoryBacking使用大页能减少TLB miss内存密集型应用明显受益。但锁内存后虚拟机占用的物理内存不能再被宿主机回收所以仅在内存充足时这样设置。我给了64GB锁定宿主机还剩64GB日常完全够用。还差最后一步安装qemu guest agent。在Win10虚拟机里加载virtio-win ISO安装guest-agent组件然后宿主机执行sudo virsh qemu-agent-command win10 {execute:guest-ping}能看到响应就说明宿主机和虚拟机之间建立了可靠通道。这个工具在关机冻结文件系统、做快照迁移时是刚需没有它快照容易损坏文件系统。6. 无头环境下最折磨人的几个坑6.1 没有显示器时怎么完成Win10初始化无头服务器装Windows虚拟机最大的障碍不是技术而是你没法像在实体机上一样盯着屏幕操作。虽然virt-install创建时已经开启了VNC但VNC在无头环境下的使用有几个隐含的坑。第一VNC端口默认只听本地回环地址。我之前创建命令里用了listen127.0.0.1这样从外部直接连VNC是连不上的。解决方式不是把它改成0.0.0.0裸奔而是通过SSH隧道转发ssh -L 5900:localhost:5900 useryour-server然后本地VNC客户端连localhost:5900即可。这一来VNC服务不暴露到公网SSH加密隧道也保护了会话内容。第二Win10首次启动OOBE时VNC下鼠标键盘操作偶尔会漂移或者没反应。我遇到过两次解决办法是先按CtrlAltDel切换登录画面再切回来或者等OOBE加载完再操作别一上来就急着点。第三分辨率。VNC默认只有800x600Win10桌面看着很难受。装完virtio-gpu驱动后可以在显示设置里调整分辨率也可以直接在virsh edit里给video标签加一行model typevirtio heads1 primaryyes。6.2 Win10找不到磁盘与TPM报错的处理无头环境遇到“自动修复”循环和TPM报错是另一个高频坑。“自动修复”循环大多是因为强制关机或者VNC写入中断系统文件出现异常。Win10的自动修复在虚拟机里很容易失效因为它要用的恢复环境可能没装全。碰到这种情况先在VNC里选“高级选项”→“命令提示符”然后执行sfc /scannow dism /online /cleanup-image /restorehealth大概率能救回来。如果连高级选项都进不去只能用Win10安装介质引导进入“修复计算机”多半就是重装系统或者从快照恢复了——这就是我为什么坚持用qcow2格式保留快照能力的原因。TPM方面Win10不像Win11那样硬性要求TPM 2.0但有些软件和Windows更新会检查这个设备。如果想彻底消除这类弹窗可以给虚拟机装配软件TPMswtpmsudo apt install swtpm然后在虚拟机XML里加入devices tpm modeltpm-crb backend typeemulator version2.0/ /tpm /devices重启后Windows就能识别到TPM 2.0设备了。6.3 虚拟机随宿主机自启与快照管理服务器长期运行最不希望的就是宿主机重启后还得手动一个个启动虚拟机。libvirt提供了非常简单的自启设置sudo virsh autostart win10这样宿主机开机后libvirtd会自动拉起这台虚拟机Windows也会以恢复模式短暂检查后进入桌面。说到快照qcow2格式支持两种快照内部快照和外部快照。内部快照是把状态和磁盘变更都记在同一个qcow2文件里简单但会拖慢整个虚拟磁盘性能外部快照是生成一个新的增量qcow2文件性能和灵活性更好但要自己管理备份链。日常操作建议用外部快照sudo virsh snapshot-create-as win10 win10-clean-state win10刚装完系统时的干净状态 --disk-only --atomic这个快照会生成一个新的磁盘镜像文件原文件变成只读底座新写入的数据都进增量文件。想回滚时删除增量文件即可瞬间回到快照时刻的状态。要注意的是做快照前最好通过qemu guest agent冻结一下Windows文件系统否则正在写入的数据可能处于不一致状态。这也是我前面为什么强调guest agent一定要装。到这里这台Ryzen AI Max 395迷你主机上的Win10虚拟机就算完整落地了KVM原生虚拟化、virtio全驱动、桥接网络、自启管理、快照备份该有的都有了。实际跑了一周多日常办公、跑Windows工具软件、访问共享文件夹都很稳定宿主机负载低得离谱。如果你手头也有这台处理器的高性能主机或者类似的高核心数AMD平台完全可以照这套流程搭一套自己的Linux服务器Windows虚拟机环境。硬件性能越强虚拟化带来的体验就越接近原生这是用一次就回不去的体验。