资讯详情

PVE 老 Windows 再打磨:Remote Viewer、SPICE 与 XP 的几个关键修复

📅 2026/10/25 1:53:54 | 华诺云谱 👁 阅读
PVE 老 Windows 再打磨:Remote Viewer、SPICE 与 XP 的几个关键修复
引子前面几篇博客中我已经在 Proxmox VEPVE上安装了 Windows XP SP3 和 Windows 98 SE并陆续配置了 SPICE、显示驱动、AC97 音频以及 USB Tablet。经过这些折腾两台老 Windows 都已经可以正常使用。特别是通过 Ubuntu 上的 Remote Viewer 远程访问后无论是显示效果、声音还是鼠标操作都比最初通过 PVE Console 使用时舒服了不少。原本以为这轮老 Windows 实验可以告一段落了。不过真正使用起来还是发现了一些不太满意的地方。例如Remote Viewer 每次打开都要手动调整缩放比例Windows XP 中按一下Print Screen竟然会导致 SPICE Agent 崩溃。另外之前安装 XP 时为了避免设备管理器中的未知设备以及减少不必要的兼容性问题我还关闭了 VirtIO Balloon 和 QEMU VM Generation ID。当时这么处理没有什么问题毕竟主要目标是让系统先稳定运行。但现在 XP 的 SPICE、显示、声音都已经正常我又有些好奇如果重新启用这些虚拟硬件能不能找到合适的驱动让 XP 真正支持它们于是又有了这一轮优化。这次主要完成了三件事让 Remote Viewer 从“能用”变得更方便不再反复调整缩放比例。升级 XP 的 SPICE Guest Tools解决Print Screen导致 Agent 崩溃的问题。重新启用此前关闭的 VirtIO Balloon 和 VM Generation ID并成功安装相应驱动。此外还顺便解决了 QEMU Guest Agent 无法让 PVE 正确显示 XP IP 地址的问题。下面按实际折腾过程记录一下。一、先说明之前的做法并没有错本次实验仍然使用此前的环境。项目配置虚拟化平台Proxmox VE 9.2.11PVE 主机ThinkPad T480XP 虚拟机VM 152操作系统Windows XP SP3 32 位Ubuntu 客户端Ubuntu 26.04Remote Viewer11.0桌面环境GNOME Wayland前面安装 XP 时我们遇到过两个额外的虚拟硬件设备VirtIO Balloon内存气球设备。QEMU Virtual Machine Generation ID虚拟机代际标识设备。由于 XP 默认没有对应的驱动当时设备管理器里会出现黄色感叹号。最简单的解决方案就是在 PVE 中关闭这两个不必要的设备。这样做既避免了未知设备也减少了老系统的兼容性变量。而且对于一台主要用来体验经典软件的 Windows XP 虚拟机来说这两个功能并不是必需的。因此之前关闭它们是一个合理的稳定性选择并不是遗留了两个没有解决的问题。只是随着实验继续我想进一步了解 XP 究竟能支持多少现代虚拟化功能。所以这次重新从较干净的 XP 环境开始测试保留 Balloon 和 Generation ID 设备再逐步安装驱动。也就是说这一轮不是在修复此前做错的配置而是在已经验证稳定的基础上探索更完整的虚拟硬件支持。二、改进一Remote Viewer从能用到好用1. 每次打开都要手动放大实在有些麻烦此前配置 SPICE 后我习惯在 Ubuntu 上通过 Remote Viewer 访问 XP 和 Win98。基本使用体验已经不错。但 XP、98 的屏幕分辨率通常比较低例如 1024×768。在现代高分辨率显示器上Remote Viewer 默认打开后的画面就显得有点小。虽然菜单里有 Zoom In但每次都需要打开菜单再点击放大。如果要放大两级就得重复操作。偶尔用用还好经常打开就有点烦人了。后来发现Remote Viewer 本身支持直接指定缩放比例remote-viewer --zoom200 connection.vv其中200表示 200% 缩放。但是我的日常使用方式并不是通过终端运行命令而是从 PVE 下载 SPICE 连接文件然后在 Firefox 里直接点击打开。所以问题变成了能不能让所有 SPICE 连接默认就使用 200% 缩放2. 修改 Remote Viewer 的默认启动配置Ubuntu 的应用启动器通常放在/usr/share/applications/Remote Viewer 对应remote-viewer.desktop为了避免修改系统级文件可以复制一份到用户目录mkdir -p ~/.local/share/applications cp /usr/share/applications/remote-viewer.desktop \ ~/.local/share/applications/编辑gnome-text-editor \ ~/.local/share/applications/remote-viewer.desktop找到其中的Exec把启动命令改成Execremote-viewer --zoom200 %u保存后更新应用数据库update-desktop-database ~/.local/share/applications这里还遇到了一个比较奇怪的情况。刚复制用户级.desktop文件时Firefox 再次打开 SPICE 连接文件竟然变成用文本编辑器打开。但只要把复制出来的文件移走原来的行为又恢复正常。后来执行update-desktop-database问题才解决。所以如果你也修改了用户级启动器建议记得执行这一步。可以通过下面的命令检查默认关联xdg-mime query default application/x-virt-viewer正常情况下应返回remote-viewer.desktop到这里默认缩放已经解决。以后通过 Firefox 点击 SPICE 文件就能直接以 200% 缩放打开。3. 快捷键为什么始终没有反应既然缩放参数可以通过启动器配置我又想进一步设置快捷键。例如Ctrl Alt U Zoom In Ctrl Alt J Zoom Out Ctrl Alt 0 Zoom ResetRemote Viewer 提供--hotkeys参数看起来很简单。我先尝试remote-viewer \ --hotkeyszoom-inctrlaltu,zoom-outctrlaltj,zoom-resetctrlalt0 \ connection.vv但实际运行时快捷键完全没有反应。开始怀疑是不是 Ubuntu GNOME Wayland 的问题。于是又尝试通过 XWayland 启动GDK_BACKENDx11 remote-viewer ...结果仍然一样。检查进程pgrep -a remote-viewer可以看到所有参数确实已经传入。所以启动器没有问题参数也没有丢失。后来检查 PVE 下载的 SPICE 连接文件发现里面本身就带着快捷键配置toggle-fullscreenShiftF11 release-cursorCtrlAltR继续研究后发现Remote Viewer 在读取.vv连接文件时会重新加载文件中指定的快捷键覆盖前面通过命令行设置的热键。这就解释了为什么--zoom200正常生效--hotkeys参数能够看到但自定义快捷键始终不工作。问题不是 Wayland也不是键盘而是 Remote Viewer 的配置加载顺序。4. 最终方案自动补充 .vv 快捷键解决思路并不复杂。既然.vv文件中的快捷键会生效那就在 Remote Viewer 读取连接文件前把需要的快捷键加进去。不过PVE 的 SPICE 连接文件包含短时有效的认证票据。如果下载后手动打开编辑器修改很容易因为操作时间过长导致票据过期。我就遇到过 Remote Viewer 弹出Authentication required实际上并不是需要输入 XP 的账户密码而是 SPICE 连接票据已经失效。所以最终选择用一个启动脚本自动处理。先创建mkdir -p ~/.local/bin然后cat ~/.local/bin/pve-spice-open EOF #!/usr/bin/env bash set -euo pipefail vv${1:?缺少 SPICE 连接文件} awk /^\[virt-viewer\]$/ { print print zoom-inCtrlAltU print zoom-outCtrlAltJ print zoom-resetCtrlAlt0 next } /^zoom-(in|out|reset)/ { next } { print } $vv | /usr/bin/remote-viewer --zoom200 - EOF chmod x ~/.local/bin/pve-spice-open这个脚本的工作很简单读取 PVE 下载的.vv文件在原有配置基础上加入 Zoom 快捷键然后立即启动 Remote Viewer。原始连接文件不会被修改。接着编辑~/.local/share/applications/remote-viewer.desktop将Exec改成Exec/home/你的用户名/.local/bin/pve-spice-open %f注意替换为实际的用户目录。最后执行update-desktop-database ~/.local/share/applications再次从 PVE 下载 SPICE 文件在 Firefox 中点击打开。这次终于成功了。现在 Remote Viewer 可以操作效果直接打开 SPICE 文件自动使用 200% 缩放Ctrl Alt U放大Ctrl Alt J缩小Ctrl Alt 0恢复 100%而且不需要每次手动配置。这算是本轮优化中最实用的一项。毕竟它不只适用于 XP 和 Win98我通过 SPICE 访问的其他虚拟机也可以一起受益。如果只需要默认缩放、不关心快捷键其实修改.desktop中的--zoom就足够了不需要额外脚本。三、改进二升级 SPICE Guest Tools解决 XP 截图崩溃Remote Viewer 的问题解决后Windows XP 内部又出现了一个 Bug。此前为了兼容 XP我安装的是spice-guest-tools-0.74.exe当时主要验证显示、声音、剪贴板和基本操作没有发现明显问题。但后来按下 XP 的Print Screen键时竟然弹出了Microsoft Visual C Runtime Library Runtime Error! Program: C:\Program Files\SPICE Guest Tools\32\vdagent.exe也就是说按一下截图键SPICE Agent 就崩溃了。1. 先确认问题出在哪里XP 中运行services.msc找到RHEV Spice Agent暂时停止服务。然后再次按Print Screen。结果没有报错。这基本可以确定崩溃与旧版 SPICE Agent 有关。由于Print Screen会将屏幕截图写入 Windows 剪贴板而 SPICE Agent 又负责与 Remote Viewer 同步剪贴板我怀疑这是旧版 Agent 处理位图剪贴板时触发的兼容性问题。不过这里只能确认崩溃与 Agent 有关还不能断言具体是哪一段剪贴板代码存在 Bug。一开始也考虑过禁用共享剪贴板来绕过。但我觉得既然使用 SPICE就是希望它的功能尽可能正常没有必要为了避免一个 Bug 而放弃剪贴板。不如直接换个版本测试。2. 从 0.74 升级到 0.141查找历史版本后我决定尝试spice-guest-tools-0.141.exe官方下载归档SPICE Guest Tools 历史版本为了方便传入 XP我在 Ubuntu 中制作 ISOsudo apt install genisoimage然后执行genisoimage -o spice-xp-0.141.iso \ -J -R spice-guest-tools-0.141.exe将生成的 ISO 上传到 PVE挂载到 XP 虚拟机。在 XP 中运行安装程序。安装过程中Windows XP 可能提示驱动未通过 Windows 徽标测试。由于这里使用的是专门选择的历史驱动需要根据实际来源和系统环境判断是否继续。安装完成后重启。3. 再次测试 Print Screen重启 XP确认 SPICE Agent 正常运行。再次按下Print Screen这次没有出现 Runtime Error。反复测试也没有复现之前的崩溃。同时QXL 显示、AC97 音频、剪贴板等原有功能保持正常。所以至少在我这台 Windows XP SP3 32 位虚拟机中SPICE Guest Tools 0.141 确实解决了 0.74 的 Print Screen 崩溃问题。这也是为什么我后来决定继续使用 0.141。不过老系统驱动并不是越新就一定越好。新版可能修复旧问题也可能因为停止支持 XP 而引入新的兼容性问题。对于 XP 这样的老系统我觉得最合适的版本不一定是最新版本而是实际测试稳定的版本。4. 顺便处理 QEMU Guest Agent 无法显示 IPSPICE Guest Tools 0.141 还包含 QEMU Guest Agent。但我发现它附带的 Agent 虽然可以运行PVE 却不能正确获取 XP 的网络接口信息。比如qm agent 152 ping能够成功。但 PVE Summary 页面仍然没有正确显示 IP。这说明 Agent 的基本通信已经建立却不代表所有管理功能都可用。后来我重新安装了一个历史版本的 32 位 QEMU Guest Agentqemu-ga-x86.msi同样可以通过 ISO 传入 XPgenisoimage -o qemu-ga-x86.iso \ -J -R qemu-ga-x86.msi挂载后执行 MSI安装程序可以对原有 Agent 进行升级。同时确保 PVE 中启用了VM 152 → Options → QEMU Guest Agent再次检查qm agent 152 ping以及qm agent 152 network-get-interfaces这次网络接口信息能够正常返回PVE Summary 也终于正确显示 XP 的 IP 地址。这里还有一个容易混淆的地方。虽然名称相似但SPICE vdagent主要负责剪贴板等桌面集成功能。QEMU Guest Agent负责 PVE 与客户机之间的管理通信。它们不是同一个程序。因此SPICE Guest Tools 0.141 解决了 Print Screen 崩溃而单独升级 QEMU Guest Agent 解决了 PVE 无法正确获取 IP 的问题。这两项改进需要分开看。四、改进三重新启用 XP 的 Balloon 和 VM Generation ID接下来是这轮实验中另一个比较有意思的部分。前面安装 XP 时为了消除未知设备、减少兼容性问题我在 PVE 中关闭了VirtIO Balloon。QEMU VM Generation ID。关闭以后XP 已经可以稳定运行。所以这次的目标并不是修复一个此前没有解决的故障而是重新启用这两个原本被我们主动关闭的虚拟硬件并看看 XP 能不能找到合适的驱动。为了避免之前多轮安装留下的影响我重新回到较干净的 XP 系统状态保留这两个硬件设备再按照已经验证过的步骤逐步配置。结果还不错。1. VirtIO Balloon原来 0.141 已经包含驱动VirtIO Balloon 是虚拟化环境中的内存气球设备。它的主要用途是让宿主机和 Guest OS 协作动态调整或回收部分内存资源。在 PVE 同时运行多台虚拟机时这项功能可能有助于提高内存利用率。此前 XP 中对应的未知硬件 ID 是PCI\VEN_1AF4DEV_1002我原本准备通过历史版 VirtIO ISO 安装它virtio-win-0.1.141.iso但进一步检查发现SPICE Guest Tools 0.141 本身已经包含 VirtIO Balloon 驱动。因此这次没有必要再单独安装整套 VirtIO ISO。在 PVE 中保留 Balloon 设备安装 SPICE Guest Tools 0.141 后XP 就能识别它。设备管理器中出现VirtIO Balloon Driver没有黄色感叹号。这说明 Balloon 驱动已经成功加载。不过这次我主要验证的是驱动识别和设备状态没有进一步测试动态内存回收时的实际表现。对于这台主要用来运行经典软件的 XP 虚拟机暂时也没有必要刻意压缩它的内存。但至少说明此前关闭 Balloon 只是为了兼容和简化配置并不代表 XP 无法支持 VirtIO Balloon。2. VM Generation ID另一个原本关闭的设备剩下的是ACPI\QEMUVGID它对应 QEMU VM Generation ID。简单来说这是一种用于让 Guest OS 识别虚拟机代际变化的机制。例如当虚拟机发生克隆、恢复到较早状态等操作时支持该机制的客户机软件可以利用 Generation ID 判断状态是否发生变化。这类功能对于某些需要维护状态一致性的服务器应用比较重要。对于普通桌面 XP 来说实际价值并不大。但既然这次想验证 XP 的虚拟硬件支持就顺便研究了一下。3. 找到社区驱动实际安装成功后来在 Proxmox 官方论坛中找到相关讨论Win2003 / Win2k8 R2ACPI QEMU VGID driver missing其中有用户分享了一个老 Windows 可用的 Generation ID 驱动 ISO。我下载并检查后决定在 XP 中试试。这里需要提醒一下这是社区分享的安装介质不是我能够独立确认来源和完整性的微软官方发行包。如果读者想尝试建议先核实文件来源并在可恢复的测试虚拟机中使用。在 PVE 中挂载驱动 ISO。然后进入 XP设备管理器 → 未知设备 → 更新驱动程序 → 从指定位置搜索指向光驱中的驱动文件。安装完成后原来的未知设备不见了。设备管理器的「系统设备」下面出现Microsoft Hyper-V 生成计数器也就是Microsoft Hyper-V Generation Counter打开驱动属性可以看到属性实际结果驱动提供商Microsoft驱动日期2006-06-21驱动版本6.3.9600.16384数字签名未经数字签名而在「常规」页面设备状态明确显示这个设备运转正常。至此可以确认Windows XP SP3 32 位已经能够识别并加载这个 VM Generation ID 驱动。这里仍然需要区分驱动安装成功与完整功能验证。设备管理器报告正常说明设备与驱动匹配而且驱动已成功加载。但我没有进一步验证 PVE 快照恢复时 Generation ID 是否发生预期变化也没有验证 XP 内部是否有程序实际利用这个机制。因此目前只能说驱动成功安装、设备正常工作不能把它写成所有 Generation ID 功能都已通过测试。4. 重新启用和此前关闭并不矛盾回过头看这个过程很有意思。此前安装 XP 时我们选择关闭 Balloon 和 Generation ID是因为当时更关注系统能不能稳定使用。而这次在已经熟悉 XP、SPICE 和驱动兼容性的基础上再把它们重新启用。最终虚拟硬件此前的处理这次的结果VirtIO Balloon主动关闭避免未知设备重新启用驱动正常加载VM Generation ID主动关闭避免未知设备重新启用驱动正常加载这两种处理方式并不存在谁对谁错。如果只是运行经典软件关闭非必要的虚拟硬件完全合理。如果像我一样希望进一步研究 PVE 和 Windows XP 的虚拟硬件兼容性那就值得重新启用并验证。现在至少可以确定这两项设备在 XP 中并不是完全没有驱动可用。五、再看 Windows 98为什么 XP 的可玩性明显更高完成这些优化后再回头看看 Windows 98我有一个很明显的感受XP 虽然也是二十多年前的系统但在现代虚拟化平台上的集成能力确实比 Windows 98 高得多。1. Win98 的基础体验已经不错此前为 Windows 98 配置过VMDisp9x 虚拟显示驱动AC97 3.62 声卡驱动SPICE 音频后端USB TabletRemote Viewer 远程访问。这些配置使 Win98 的显示、声音和鼠标体验都得到了改善。对于运行经典软件而言已经比较实用了。但这里有个容易混淆的地方。我们虽然让 Windows 98 用上了 SPICE 远程显示和音频却没有真正实现完整的 SPICE Guest Integration。比如AC97 并不是 SPICE 专用声卡驱动而是 QEMU 模拟的虚拟声卡通过 SPICE 后端把声音传给远程客户端。USB Tablet 也不依赖 SPICE Guest Agent而是利用绝对坐标输入改善鼠标定位。VMDisp9x 则是社区开发的虚拟显示驱动。这些功能让 Win98 更容易使用却不能自动带来完整的共享剪贴板、文件传输或自动分辨率调整等能力。2. Win98 真正缺少的是 VirtIO Serial 和 SPICE AgentSPICE 的很多桌面集成功能需要 Guest OS 内部运行 Agent。典型的通信链路是Ubuntu Remote Viewer │ SPICE Server │ VirtIO Serial │ SPICE vdagent │ Windows 剪贴板Windows XP 有相应的历史 VirtIO Serial 驱动和 SPICE Agent。而 Windows 98 目前缺少成熟、可直接使用的组合。这就是为什么 XP 可以实现共享剪贴板而 Win98 虽然显示和声音正常很多 SPICE 增强功能却发挥不出来。共享文件夹还有额外要求例如相应的 SPICE WebDAV 客户机组件并不是单独安装显示驱动就能实现的。3. 为什么不给 Win98 开发 VirtIO Serial 驱动VirtIO 本身是公开标准相关 Windows 驱动也有开源实现。但问题在于驱动架构。Windows 98 属于 Windows 9x 系列。Windows XP 属于 Windows NT 系列。早期 VirtIO Windows 驱动主要面向 NT 系统部分实现还依赖 Win98 并不支持的驱动框架。如果要支持 Win98并不是把 XP 的驱动重新编译一下就可以了。开发者需要处理 PCI 设备、中断、Virtqueue、内存管理以及 Win9x 的驱动接口。即便 VirtIO Serial 驱动做出来还需要实现适用于 Win98 的 SPICE Agent。这是一项投入不小的工程。而 Windows 98 用户已经很少其中真正需要完整 SPICE Guest Integration 的用户就更少。所以到目前为止我还没有找到成熟、经过验证的 Win98 VirtIO Serial SPICE Agent 方案。不过像 VMDisp9x、SoftGPU 这些开源项目的存在也说明仍然有人愿意为 Win9x 开发现代虚拟化环境下的新驱动。未来如果有人实现了 Win98 的 VirtIO Serial 和 SPICE Agent倒是值得再次尝试。4. XP 和 Win98 的最终使用状态经过这一轮实验两台虚拟机大致可以这样对比功能Windows XP SP3Windows 98 SESPICE 远程显示正常正常AC97 SPICE 音频正常正常USB Tablet正常正常虚拟显示驱动QXLVMDisp9xSPICE Agent0.141已验证缺少成熟方案共享剪贴板可用尚未实现QEMU Guest Agent可用能获取 IP缺少成熟方案VirtIO Balloon驱动正常加载缺少成熟方案VM Generation ID驱动正常加载缺少成熟方案这也说明了两台系统在 PVE 中适合扮演的不同角色。Windows 98 更适合体验那个年代的桌面和经典软件重点是显示、声音、鼠标以及运行稳定性。Windows XP 则可以在运行经典软件的同时获得更完整的现代虚拟化集成。其中一个重要原因就是 XP 所属的 Windows NT 驱动体系与后来的 Windows 系统有更多延续性。所以即使官方早已停止支持 XP我们仍然能利用历史版本的 VirtIO、QXL、SPICE Agent 等组件让它在现代虚拟化平台上发挥更多功能。写在最后从能运行到用起来舒服回顾这一轮优化实际做的事情并不算多。但每一项都有比较明确的意义。第一Remote Viewer 的使用体验得到改善。以前每次打开 SPICE 文件都需要手动调整画面缩放。现在直接从 Firefox 点击连接文件就能自动使用指定缩放比例和快捷键。而且这一改进适用于所有通过 Remote Viewer 访问的虚拟机。第二解决了 XP 的 SPICE Guest Tools 兼容性 Bug。原先使用的 0.74 在按下 Print Screen 时会导致vdagent.exe崩溃。升级到 0.141 后问题不再复现原有显示和音频功能也没有受到影响。与此同时通过单独升级 QEMU Guest Agent让 PVE 可以正确获取 XP 的 IP 地址。第三重新启用了此前为了稳定性而关闭的虚拟硬件。VirtIO Balloon 和 VM Generation ID 最初并不是没有处理而是被我们有意禁用了。这次通过适当的历史驱动让它们重新出现在 XP 的设备管理器中并且正常加载。从这个角度看这篇并不是把一个不完整的 XP 系统修修补补而是在已经稳定运行的基础上进一步改善使用体验并扩展虚拟化能力。这也让我对 Windows XP 和 Windows 98 有了更直观的认识。两者都能够在今天的 PVE 上运行也都可以通过一些配置获得不错的基本体验。但“能运行”和“能与现代虚拟化平台深度集成”终究不是一回事。XP 的驱动生态让它可以走得更远而 Win98 则更多依靠硬件模拟和社区开发的专用驱动。当然我并不打算为了追求所谓的完美配置把所有虚拟硬件功能都测试一遍。对于 XP 和 Win98 这样的老系统最重要的还是能正常运行当年的软件用起来足够方便。到这里这轮 PVE 老 Windows 的折腾就暂时告一段落了。从最初能装上系统到画面、声音、鼠标都正常再到解决日常使用中的 Bug、改善 Remote Viewer 体验这几台老系统已经达到了我想要的状态。以后如果有值得尝试的新驱动或开源项目也许还会继续折腾。但现在它们已经可以安心留在 PVE 里偶尔打开体验一下那些陪伴过我们的经典 Windows 和老软件了。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑