ARTICLE DETAIL

资讯详情

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

Ubuntu Server + KVM 虚拟化实战:AMD Ryzen迷你主机运行Windows 10虚拟机

Ubuntu Server + KVM 虚拟化实战:AMD Ryzen迷你主机运行Windows 10虚拟机 手头这台机器我折腾了一个多星期——AMD Ryzen AI Max 395 的迷你主机装了 Ubuntu Server 24.04跑 Windows 10 虚拟机。整个过程踩了不少坑但最后稳定运行下来说实话这套组合比我想象中靠谱得多。如果你正打算用一台高性能小主机同时承担 Linux 服务器和 Windows 应用的双重角色这篇记录应该能帮你省下大量排查时间。入正题之前先交代背景主机是 AMD Ryzen AI Max 39516 个 Zen5 核心、40 个 RDNA 3.5 计算单元、统一内存架构配了 96GB LPDDR5X 和一块 PCIe 4.0 NVMe。为什么要在这个硬件上装 Ubuntu Server 再虚拟化 Windows 10而不是直接装个双系统因为这台机器在我家是 7x24 小时开机的主要当 NAS、开发服务器、Docker host 用偶尔还要跑一些只支持 Windows 的软件——比如老的财务软件、网银助手、特定打印机驱动程序。直接把 Windows 10 做成 KVM 虚拟机比在物理机上双系统灵活太多还能用快照随时回滚。下面从硬件准备、平台选择、驱动加载、网络配置到性能调优完整还原整个实操过程。1. 硬件平台与宿主机准备1.1 这套硬件为什么适合当虚拟化宿主机AMD Ryzen AI Max 395 本质上是为“大统一内存 高密度计算”设计的。16 核 32 线程给虚拟机划分资源时非常从容40CU 的 RDNA 3.5 核显在虚拟化场景里也不是摆设——它既能承担宿主机桌面的输出也能为 Windows 10 虚拟机提供可用的图形加速。和那些带独显的塔式服务器不同这种迷你主机功耗低、噪音小放在书架上跑一年电费也花不了多少。不过要提醒一句这台机器的内存是统一内存架构虚拟机和宿主机共享同一块 LPDDR5X。我分配了 16GB 给 Windows 10宿主机的 Linux 还剩 80GB 左右跑编译、Docker、ZFS 文件系统都没有压力。如果内存只有 32GB 或 64GB 版本建议给 Windows 10 虚拟机分配 12~16GB 时谨慎一点先算好宿主机自己要用的开销。1.2 Ubuntu Server 24.04 安装时的几个关键选择安装系统时我主要做了三个决定第一存储层面用了软 RAID 1。手上正好有两块 1TB NVMeUbuntu Server 24.04 安装器自带的“自定义存储布局”里可以直接做 RAID 1不需要额外命令。这样虚拟机镜像文件、Docker 数据卷都落在 RAID 上单盘故障不会导致整个虚拟机丢数据。如果不打算做 RAID也要至少保证虚拟机的 qcow2 镜像放在剩余空间充足的独立分区别和系统日志挤在一起。第二安装时只选了 OpenSSH server 和 standard system utilities没有装完整的桌面环境。既然是服务器有 SSH 就够了图形界面纯属浪费内存。第三网络用了 DHCP 先跑通后续再改静态地址。24.04 默认用 netplan配置文件在/etc/netplan/下等桥接网络那一步再统一改。1.3 开启 SVM 和 IOMMU检查虚拟化标志BIOS 这一步太容易被忽略但没它一切白搭。开机按 Del 进 BIOS找到SVM ModeAMD 虚拟化技术开关必须设为 Enabled。如果你的主板有IOMMU选项也一并打开虽然不直通设备时用不到但开了以后给后面留条路。装完系统后命令行验证egrep -c (vmx|svm) /proc/cpuinfo ls -l /dev/kvm第一行输出大于 0 说明 CPU 虚拟化指令已生效第二行有/dev/kvm说明内核 KVM 模块正常加载。如果/dev/kvm不存在多半是没装kvm-amd模块先执行sudo modprobe kvm-amd再把kvm-amd写进/etc/modules防止重启后失效。2. 虚拟化平台选型为什么用 KVM/libvirt而不是 VirtualBox 或 VMware2.1 Linux 服务器上的虚拟化方案对比很多人第一反应是装个 VMware Workstation 或者 VirtualBox毕竟 Windows 上用得熟。但在 Ubuntu Server 无桌面环境下这两款都不是理想选择方案性能集成度无头管理适合场景KVM/QEMU原生虚拟化接近物理机内核级集成极好virsh 全命令行Linux 服务器长期跑 VMVirtualBox中等需要自编译内核模块一般桌面用户临时测试VMware Workstation不错闭源内核升级易出问题一般依赖 GUI桌面/工作站场合Proxmox VE基于 KVM 的发行版高极好Web 管理多虚拟机生产环境如果你只有一台机器也不想再套一层 Proxmox 系统直接在 Ubuntu Server 上装 KVM 就是最稳的路子。KVM 是 Linux 内核自带的虚拟化模块QEMU 负责设备模拟libvirt 负责统一管理。整个栈全部开源、免费而且 Ubuntu 仓库里都有不需要额外加源。2.2 安装 KVM 虚拟化栈Ubuntu 24.04 上的安装很简单sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils ovmf拆解一下这几个包分别干嘛的qemu-kvm核心的 QEMU 虚拟化程序负责 CPU/内存/设备模拟libvirt-daemon-systemlibvirtd 守护进程和相关 systemd 服务libvirt-clients提供virsh、virt-install等管理工具virtinst包含virt-install命令用它从命令行创建虚拟机bridge-utils桥接网络工具ovmfUEFI 固件虚拟 Windows 10 建议用 UEFI 启动方式安装完成后启动服务并把当前用户加入 libvirt 用户组sudo systemctl enable --now libvirtd sudo usermod -aG libvirt $USER然后重新登录或newgrp libvirt让用户组生效验证virsh version virsh list --all能正常输出版本号和空的虚拟机列表说明环境已经就绪。3. 准备 Windows 10 镜像与 virtio 驱动3.1 Windows 10 ISO 从哪里拿这一步不用找第三方下载站直接去微软官方“软件下载”页面用媒体创建工具Media Creation Tool下载 Windows 10 22H2 的 ISO 即可。如果机器性能一般或者你只需要一个精简稳定的 Windows 环境也可以选 Windows 10 Enterprise LTSC——它没有商店、Cortana 之类的组件长期服务分支支持周期更长在虚拟机上跑格外划算。关于激活问题这里不展开说但请务必使用正规授权。合法授权方式包括已有的 Windows 10 数字许可绑定微软账户、企业批量授权、或微软官方提供给开发者的评估版镜像评估版一般有 90 天试用期适合先测试虚拟机方案再决定买不买授权。下载完把 ISO 放到宿主机专门目录我习惯放在/var/lib/libvirt/images/下这样 virt-install 直接引用路径权限也统一sudo mkdir -p /var/lib/libvirt/images sudo cp ~/downloads/Win10_22H2_Chinese_Simplified_x64.iso /var/lib/libvirt/images/3.2 virtio-win 驱动盘虚拟机能不能识别硬盘的关键KVM 完全模拟一套传统 SATA 控制器给 Windows 用也行但性能和功能都有损失。更专业的做法是给虚拟机挂virtio-blk磁盘、virtio-net网卡、virtio-balloon内存气球、virtio-serial通信通道。问题是 Windows 不认这些虚拟设备开机后根本找不到硬盘——除非你先准备好 virtio 驱动。virtio-win 驱动盘是 Fedora 项目维护的现成 ISO下载地址在 Fedora 官方镜像源sudo wget -O /var/lib/libvirt/images/virtio-win.iso \ https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso如果网络慢也可以先在 Windows 上下载好再传到宿主机。这个 ISO 里包含了 viostor存储驱动、NetKVM网卡驱动、vioscsi、balloon 等全部驱动。装完 Windows 后第一件事就是把 virtio-win 里所有驱动补上。3.3 虚拟机资源配置清单开工前先规划好各项参数我就不绕弯子直接把最终配置列出来参数分配值理由CPU8 vCPU可热插拔到 1616 核 CPU 分一半给 Windows宿主机仍有余量跑 Docker 等服务内存16GB上限 32GBWindows 10 日常使用 编译软件16GB 舒适不紧张系统盘120GB qcow2虚拟磁盘为稀疏文件实际用了多少才占多少空间数据盘可选 200GB qcow2存软件安装包、虚拟机间共享的工程文件网卡virtio-net接 br0 桥接虚拟机直接暴露到局域网宿主机和它互访走二层交换显示QXL 虚拟显卡 SPICE安装阶段用日常远程桌面走 Windows 自带的 RDP启动方式UEFIOVMF贴合现代 Windows 10 的启动流程兼容性更好关于磁盘格式我特意选了 qcow2 而不是 raw。qcow2 支持稀疏分配、快照、压缩对一个要长期维护的虚拟机来说收益很大。日常使用性能差距在 NVMe 上几乎感觉不到。4. 用 virt-install 创建 Windows 10 虚拟机4.1 创建虚拟磁盘与完整命令创建虚拟磁盘sudo qemu-img create -f qcow2 /var/lib/libvirt/images/win10-system.qcow2 120G然后执行 virt-install这是整个安装过程的核心。我推荐直接在命令行写完整参数比用 virt-manager 图形界面更透明也方便记录成脚本复用sudo virt-install \ --name win10 \ --memory 16384 \ --vcpus 8,maxvcpus16 \ --cpu host-passthrough,cache.modepassthrough \ --os-variant win10 \ --disk path/var/lib/libvirt/images/win10-system.qcow2,formatqcow2,busvirtio,cachewriteback \ --disk path/var/lib/libvirt/images/virtio-win.iso,devicecdrom \ --cdrom /var/lib/libvirt/images/Win10_22H2_Chinese_Simplified_x64.iso \ --network networkdefault,modelvirtio \ --graphics vnc,listen0.0.0.0,port5901 \ --boot uefi逐个说明参数--name win10虚拟机名字之后 virsh 操作都用它标识--memory 16384固定分配 16GB 内存--vcpus 8,maxvcpus16启动时 8 个 vCPU之后可动态扩到 16--cpu host-passthrough直接把宿主机的 CPU 型号、特性透传给虚拟机。Windows 10 对 CPU 型号并不挑剔透传能让虚拟化损耗降到最低——代价是如果你之后把虚拟机迁移到另一台不同 CPU 的宿主机操作系统可能蓝屏但家庭场景没人会做热迁移选它准没错--os-variant win10让 libvirt 使用 Windows 10 对应的 ACPI 和固件配置--disk ... busvirtio系统盘走 virtio-blk 虚拟控制器--disk ... devicecdrom把 virtio-win 驱动盘挂为光驱--cdrom ...Windows 10 安装 ISO--network networkdefault,modelvirtio先挂到 libvirt 默认的 NAT 网络等装好系统再改成桥接--graphics vnc,listen0.0.0.0,port5901监听 VNC 端口 5901用局域网内任意装了 VNC 客户端的电脑连上来操作安装界面--boot uefi使用 OVMF 提供的 UEFI 固件启动执行后virt-install 会启动 virt-viewer如果宿主机没有 GUI 会直接报错。但别慌虚拟机已经在后台创建了直接用 VNC 连过去就行。4.2 连接 VNC进入安装程序在另一台电脑上打开 VNC 客户端Windows 用 RealVNC 或 TightVNCLinux 用 Remmina连接地址宿主IP:5901。这辆“无头服务器”的显示器管道就通了。安装界面和物理机装 Windows 10 基本一样唯一的坎出现在“选择安装位置”这一步——你会看到磁盘列表是空的。别怀疑这就是因为 Windows 不认识 virtio-blk 虚拟磁盘需要手动加载驱动点击“加载驱动程序”浏览到光驱通常是 D 盘或 E 盘选择amd64目录下的w10子目录勾选Red Hat VirtIO SCSI pass-through controller或Red Hat VirtIO SCSI controller下一步Windows 识别出 120GB 虚拟磁盘正常分区安装即可安装过程中的语言、键盘布局、时区选择按个人喜好来。要注意的是微软账户登录环节——在虚拟机里用微软账号其实意义不大还容易卡在验证步骤。Windows 10 安装程序要求联网但你可以先把网线/网络连接断开或者直接创建本地账户。最省事的方式在登录界面选择“改为域加入”然后创建本地账户即可。装完系统进入桌面后第一件事是安装 virtio-win 全套驱动。打开光驱里的virtio-win-guest-tools.exe全部默认安装并重启。重启后任务管理器里能看到 virtio-blk、NetKVM、virtio-balloon 等设备全都正常工作了。4.3 安装 virtio 驱动时的常见误区这里要提两个我踩过的坑第一个是驱动的目录选错。virtio-win 里的 amd64 文件夹下面同时有w10和w11目录Windows 10 应该选w10。有些教程为了省事让用户直接选amd64目录结果 Windows 10 加载驱动时仍然提示“找不到匹配的驱动”那是因为它去 w11 子目录里找去了。直接在指定位置时填E:\amd64\w10最干净。第二个是只装了存储驱动就继续安装结果装完系统后网卡驱动还是感叹号。Windows 10 安装阶段加载了 viostor 后其实不需要 NetKVM 也能把系统装完——但装完网络不通还得回来看 virtio 盘。所以我建议virtio-win-guest-tools.exe这个完整安装包在首次进桌面后立刻装掉别等需要网络了再补。5. 网络配置与远程访问5.1 默认 NAT 网络的优缺点virt-install 里我用了--network networkdefault这个 default 网络是 libvirt 自带的 NAT 网络虚拟网段是192.168.122.0/24。虚拟机通过宿主机的 iptables 规则访问外网外网默认访问不到虚拟机——对安全来说很友好但办不了事。先确认虚拟机拿到地址virsh domifaddr win10 --source agent如果这个命令返回空说明 virtio-serial 的 QEMU guest agent 还没装好。也可以直接在 Windows 虚拟机里运行ipconfig看 IP简单粗暴。临时用 NAT 没问题但长期规划建议改成桥接。毕竟大多数人拿 Windows 虚拟机是要访问局域网里的 NAS、打印机或者从手机远程连上来的。5.2 配置桥接网络 br0桥接的目标是让虚拟机网卡直接挂在物理网卡上和宿主机处于同一局域网。这个步骤在无头服务器上要特别小心——配错了 SSH 会断只能去物理机上改。先看当前网卡名ip -br link show假设物理网卡叫enp1s0编辑 netplan 配置文件一般在/etc/netplan/01-netcfg.yamlnetwork: version: 2 ethernets: enp1s0: dhcp4: false bridges: br0: interfaces: [enp1s0] dhcp4: true parameters: stp: false forward-delay: 0应用前可以先sudo netplan try来测试它会等 120 秒确认没有断开再生效。如果 SSH 断了等超时后会自动回滚这是救命的操作。生效后给虚拟机添加桥接网卡sudo virsh attach-interface win0 --type bridge --source br0 --model virtio --config --live--config把配置持久化到虚拟机定义文件--live立即生效。因为 Windows 10 的 NetKVM 驱动已经装好新网卡一般能自动识别。然后我在 Windows 里把原来的 NAT 网卡禁用了避免两套路由表互相干扰。之后虚拟机直接和家里路由器同一个网段从手机、笔记本、NAS 都能直接访问它。5.3 启用 Windows 远程桌面虚拟机里装完系统日常操作最好别老开 VNC——VNC 连 Windows 的体验远不如 RDP。在 Windows 10 虚拟机里设置 → 系统 → 远程桌面 → 启用远程桌面确认防火墙放行 TCP 3389在 Windows 里新建一个本地账户给上密码之后从 Windows 物理机用mstsc从 Linux 用 Remmina直接连虚拟机的局域网 IP体验和物理机没差别。分辨率自适应、剪贴板共享、文件拖拽全部正常。5.4 开机自启宿主机重启后虚拟机自动拉起服务器型虚拟机最重要的一个设置是自动启动。否则宿主机一旦重启Windows 虚拟机不会自己开机。sudo virsh autostart win10查看sudo virsh list --all在 Autostart 列看到 enable说明已经生效。另外给 Windows 虚拟机装好 QEMU guest agent 后virsh 命令可以优雅地开关机不用再模拟按电源键sudo virsh shutdown win10 sudo virsh start win10guest agent 的安装包在 virtio-win 光驱里也有叫guest-agent装完重启后服务自动运行。6. 性能调优与显示方案6.1 CPU 固定与内存预留KVM 默认的调度策略已经很好了但如果你追求更低延迟、更稳定可以给 Windows 虚拟机固定 CPU 核心。我习惯把 vCPU 0~7 固定到物理核心 8~15 上让 Windows 和宿主机主要进程互不干扰。具体做法编辑虚拟机配置sudo virsh vcpupin win10 0 8 sudo virsh vcpupin win10 1 9 sudo virsh vcpupin win10 2 10 sudo virsh vcpupin win10 3 11 sudo virsh vcpupin win10 4 12 sudo virsh vcpupin win10 5 13 sudo virsh vcpupin win10 6 14 sudo virsh vcpupin win10 7 15这里 8~15 对应第二个 CCD 的物理核心。注意避开超线程兄弟核心以免两个 vCPU 抢同一个物理核心的执行单元。用lscpu -e可以查看每个物理核心和逻辑 CPU 的映射。内存方面最简单有效的优化是关闭 Windows 虚拟机的内存气球balloon驱动。虽然 virtio-balloon 可以动态收缩空闲内存返还给宿主机但在实际使用中经常出现 Windows 误判内存压力、把缓存频繁回收的问题。如果你内存足够直接不用 balloon 反而省心。进入 XML 配置删除memballoon相关标签段即可。6.2 virtio-net 多队列与巨型帧默认的 virtio-net 使用单队列吞吐量在千兆以内没压力一旦虚拟机要做大文件传输或跑局域网备份单队列就可能成为瓶颈。开启多队列后多个 CPU 核心可以并行处理网络包收发。在 vm 配置里给interface添加队列数量sudo virsh edit win10找到interface typebridge部分修改为interface typebridge source bridgebr0/ model typevirtio/ driver namevq queues4/ /interface同时在 Windows 设备管理器里找到 VirtIO Ethernet Adapter进入高级属性把Receive Side Scaling接收端缩放设为 Enabled。这样虚拟机内多核网卡队列就生效了。6.3 显示与图形QXL、SPICE 还是 GPU 直通Windows 10 虚拟机在安装阶段用 QXL 虚拟显卡分辨率默认 1024x768。装完 virtio 驱动后把显示驱动换到 QXL 的高分辨率模式或者干脆用 RDP 操作RDP 自带虚拟显示适配器能自适应分辨率比 QXL 流畅很多。如果你对 WebGL、视频编辑这类 3D 渲染有需求QXL 显然不够。这时候摆在眼前的有两条路第一条是 virtio-gpu。它的 Windows 驱动适配还不算完善稳定性一般日常够用但遇到 DirectX 游戏基本白搭。第二条是 GPU 直通把 Ryzen AI Max 395 的核显直接分配给 Windows 虚拟机。直通之后 Windows 里能看到完整的 Radeon 8060S 显卡硬件加速拉满。但代价是宿主机就没有显示输出了——对无头服务器来讲其实无所谓但需要 IOMMU 分组支持、BIOS 里的设置配合而且这套 APU 的核显直通确实存在兼容性风险。如果你不是重度 3D 需求我不建议一开始就碰先用 RDP 跑几天再决定要不要开直通。6.4 磁盘缓存与 I/O 调度我这台虚拟机磁盘的 cache 设在writeback数据先写虚拟机内存再异步落盘对 Windows 这种频繁小文件读写的系统来说响应速度提升很明显。代价是宿主机掉电时可能丢失最近几秒的写入缓冲——如果虚拟机跑的是数据库等关键服务务必改成none或writethrough以换取一致性。另外给 vcpu 对应的物理核设置 C 状态为 performance 模式也能减少虚拟机的响应抖动。可以用cpupower工具sudo apt install linux-tools-common -y sudo cpupower frequency-set -g performance确认下当前 CPU 调频模式Windows 虚拟机里跑 CPU 密集型任务就比较稳定了。7. 常见问题与排查实录这部分我把实际操作中遇到比较典型的问题整理成表方便你直接对照处理。症状根因解决方法安装时看不到磁盘Windows 没有 virtio 存储驱动安装界面点击“加载驱动程序”指向 virtio-win 光驱E:\amd64\w10首次启动蓝屏 INACCESSIBLE_BOOT_DEVICEvirtio 存储驱动未加载用 WinPE 或安装盘修复启动执行bcdedit检查启动项下次务必装virtio-win-guest-toolsVNC 分辨率固定 1024x768QXL 驱动未装安装 virtio-win 全套驱动或用 RDP 远程桌面虚拟机没有网卡NetKVM 驱动未装或网络模型不是 virtio安装 virtio-win-guest-tools重启确认 XML 里 model 为 virtio宿主机重启后虚拟机不自动启动未配置 autostartsudo virsh autostart win10Windows 虚拟机内网络慢virtio-net 单队列默认配置开启多队列Windows 中开启 RSS虚拟机分配 16GB 内存可用只有 8GBUbuntu 的 HugePages 未开启或 balloon 机制占用了内存检查 virsh 内 memballoon 设置关闭后重启VNC 连接闪断或黑屏网络端口被防火墙拦截检查宿主机 ufw/firewalld放行 5901或改用 SSH 隧道连接 VNCWindows 虚拟机鼠标漂移spice-vdagent 驱动未装安装 virtio-win 光驱中的 guest-tools无法从宿主机访问虚拟机的网页服务NAT 网络没有做端口转发改为桥接网络或使用virsh net-update default add-forward-port做转发7.1 排障思路从宿主到虚拟机逐层排查有时候问题不在虚拟机内部。如果 Windows 虚拟机连不上网络我一般按这个顺序排查在宿主机执行virsh net-list确认网络是 active 状态virsh net-dhcp-leases default看虚拟机有没有拿到 IP进虚拟机ipconfig看网卡是否 upping 网关、ping 8.8.8.8、ping 域名逐步确认是路由问题还是 DNS 问题NAT 网络下最常见的问题是宿主机的防火墙挡了转发流量。Ubuntu 24.04 默认没有启用 ufw如果你以前开启过记得检查sudo ufw status7.2 性能下降时的快速诊断虚拟机普遍变慢时我第一反应是看宿主机资源。用top看 load average、free -h看内存、iostat -x 1看磁盘 IO。如果宿主机一切都正常但 Windows 虚拟机依然卡就回到虚拟机内看任务管理器里的 CPU 和内存占用。还有一个隐藏问题qemu 进程的 CPU 使用率一直很高但 Windows 内 load 很低。这多半是主机 CPU 进入了低功耗 C 状态虚拟机唤醒延迟导致的。按 6.4 的办法把 CPU 调频模式改为 performance 就能缓解。8. 最后的经验与建议在 AMD Ryzen AI Max 395 上跑 Ubuntu Server Windows 10 虚拟机这套组合目前已经稳定运行了一个多月期间经历过宿主机自动更新重启、虚拟机自动开机、通过 RDP 从局域网多个设备同时连接没有掉过链子。最让我满意的是 KVM 的快照功能——每次给 Windows 打大补丁之前我先在宿主机执行一个快照出问题秒回退比物理机重装系统省心一百倍。如果你想长期用这套方案我建议给 Windows 10 虚拟机单独划一块数据盘把 Chrome 缓存、下载目录、软件安装包都指向数据盘系统盘保持干净。这样备份虚拟机时系统盘镜像可以做得很小数据盘单独定时同步。配合 qcow2 的快速快照整个虚拟机的维护成本很低。最后说一句Windows 10 虚拟机本身也不是万能的CPU 透传模式虽然性能损耗最小但这也意味着将来如果把虚拟机迁移到 Intel 平台的宿主机Windows 很大概率会蓝屏。如果你有未来迁移的打算创建时就不要用host-passthrough改选--cpu qemu64或--cpu max这类可移植模式。只是个人使用的话放宽心透传模式带来的性能提升值得这点迁移上的麻烦。
返回列表