[肥鱼大战信创] ARM64 国产机 QEMU 运行 Windows XP
最近也是实在忍受不了机械硬盘的 Windows 办公电脑的卡顿了,于是看着现在 Agent 的能力已经不同以往,而且现在工作用的软件,除了一个强依赖 IE/ActiveX 的系统之外,其余都能在 Linux 上找到替代或者是直接原生运行。于是上周,我便压力大肥鱼,让他看看有没有什么办法能在 麒麟 9000X 的信创机上,跑起来个性能要求最低的 Windows XP 来跑这个系统的控件以及 IE 浏览器本身,没想到还真成了。于是便让大肥鱼总结经验,写出来这个文。
现在主力机已经换上信创这台了,至少信创机是固态硬盘。虽说 Windows 肯定更舒服就是了,但一是不让也没法装 Windows 系统,海思没这驱动,二是不允许装别的系统,就连拆机拆硬盘都不让...
大肥鱼正在深度思考DeepSeek
已完成思考以下内容由 AI 生成
0. 一句话结论
在 国产 ARM64 处理器(如麒麟 9000X)+ 银河麒麟 V10 的国产机上,因为没有 /dev/kvm、CPU 也不带虚拟化扩展,x86 的 Windows XP 只能靠 QEMU 的 TCG 软件模拟跑起来。这件事完全可行,已经装好、实测稳定;代价是慢——相当于一台 300~500 MHz 的老机器,日常开老软件、办公、跑老旧业务系统没问题,别指望 3D。
整件事最容易翻车的地方只有一个:QEMU 版本。必须用 5.2,麒麟自带的 4.2 装 XP 必蓝屏。 记住这一句,能省掉 90% 的弯路。
| 项目 | 值 |
|---|---|
| 宿主机 | 国产 ARM64 处理器(aarch64),银河麒麟 V10 SP1 |
| 虚拟化能力 | 无 /dev/kvm,无 vmx/svm(硬件虚拟化完全不可用) |
| 模拟器 | QEMU 5.2(Debian bullseye,便携式前缀安装,非系统安装) |
| 客户机 | Windows XP Professional SP3(x86, 32 位) |
| 磁盘 | 20GB qcow2,IDE 接口,装完实际占约 4GB |
| 内存/CPU | 1024MB / qemu32 单核(ARM 上跑 x86 只能单线程 TCG) |
| 显示 | -vnc 127.0.0.1:1 + Remmina,无 gtk/sdl 后端 |
| 网卡 | RTL8139 + 用户态 NAT(slirp) |
1. 为什么只能是 TCG:先搞清楚「能不能」再动手
动手前先确认三件事,避免在错误的方向上浪费时间:
- 架构:
uname -m是aarch64,而要跑的 XP 是 x86。宿主机与客户机不同架构,VirtualBox / VMware / KVM 这类依赖硬件虚拟化或同架构的方案全部出局。 - KVM:
ls /dev/kvm不存在,/proc/cpuinfo里也没有vmx/svm标志。没有 KVM,-accel kvm无从谈起。 - 唯一出路:QEMU 的 TCG(Tiny Code Generator),把 x86 指令逐条翻译成 ARM 指令执行。能跑,慢,但稳定。
判断依据本身就是排查法:先看架构,再看 KVM,最后才轮到选模拟方案。很多「装不上」的问题,其实在一开始「能不能装」这一步就已经决定了。
2. 复现路线图(总览)
① 组装 QEMU 5.2 便携版(不用系统安装,解决无 root / apt 不可用)
↓
② 拿到并甄别一张真正的 XP SP3 安装盘 ISO(补丁盘 ≠ 安装盘)
↓
③ 造一张无人值守应答软盘 winnt.img(内含 WINNT.SIF)
↓
④ 用一组精简参数启动 QEMU 完成无人值守安装
↓
⑤ 装好后按需增强:共享文件夹 / 打印 / 文档转发 / USB 直通 / 内网 VPN
↓
⑥ 做整盘还原点,防止断电损坏下面按这个顺序展开。每一步都给出「可复现的命令」和「为什么这么做」。
3. 第一步:组装 QEMU 5.2 便携版
3.1 环境限制决定了安装方式
这台机器上 sudo 报 sudoers 权限异常、apt 因 userns 限制无法写 /usr。所以不能用系统包管理器装软件,改用「便携前缀」:
题主注:此处大肥鱼说 sudo 权限异常的原因是被 WorkBuddy 和 Kylin OS 的 KYSEC 拦截了- 从仓库直接下载
.deb; - 解包到用户目录,而不是装进系统。
3.2 解包的正确姿势(坑)
常规的 dpkg-deb -x xxx.deb 目标目录 在这台机器上会因 utime 失败报错。必须改成两段式:
dpkg-deb --fsys-tarfile xxx.deb | tar -x -m -C $HOME/opt/qemu52-m 参数是绕开 utime 报错的关键(不解出时间戳)。
3.3 缺依赖怎么补
ldd 找到的 not found 库,反查 soname 对应哪个包名,逐个下载解包补齐。常见缺口(记录备查):
libvirglrenderer1 libbrlapi0.7 libcacard0 libusbredirparser1
librdmacm1 libibverbs1 libslirp0 libspice-server1 libpmem13.4 BIOS/固件文件不在你想的地方
Debian 把 BIOS/ROM 从 qemu-system-data 里拆出去,单独放在 seabios / vgabios / ipxe-qemu 三个包里。直接抓这三个包解包,或者从旧版 QEMU 的 usr/share/qemu 目录拷贝即可——固件与模拟器版本无关,这条路最省事。
3.5 镜像源选择
官方源在部分网络环境下超时,可改用国内镜像源(如 TUNA,实测约 940KB/s)。哪个源快用哪个,不必死磕官方。
小结:QEMU 5.2 组装完成,产物约 55MB,位于 $HOME/opt/qemu52。这个版本(bullseye、glibc 2.31)与银河麒麟的 glibc 一致,能直接跑。4. 第二步:甄别一张「真的安装盘」
4.1 坑:补丁盘长得像安装盘
拿到的 zh-hans_windows_xp_service_pack_3_x86_cd_x14-60563.iso(398MB)其实是SP3 补丁光盘,根目录只有一个更新包 exe,不能引导、不能装系统。文件名里带 service_pack_3 但没有 professional 的,基本就是补丁盘。
4.2 正确的简体中文安装盘(MSDN 原版,601MB)
| 版本 | 文件名 | SHA1 |
|---|---|---|
| 零售版(FPP) | zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso | 69DBF131116760932DCF132ADE111D6B45778098 |
| 批量版(VOL) | …_cd_vl_x14-74070.iso | D142469D0C3953D8E4A6A490A58052EF52837F0F |
4.3 鉴别特征(可写进脚本自动判断)
安装盘根目录有 I386\、WIN51、WIN51IP.SP3,且有 El Torito 引导扇区;补丁盘不可引导。这个判断逻辑(算 SHA1 + 对表 + 解析 ISO9660 根目录和 El Torito)可以做成一个纯标准库的 verify_iso.py,没有第三方依赖也能跑。
5. 第三步:无人值守应答软盘
XP 的无人值守安装靠一张 1.44MB 软盘里的 WINNT.SIF。本机没有 mtools,就用 Python 手工构造 FAT12 软盘镜像(mkfloppy.py),做完用 fsck.vfat -n 校验。
WINNT.SIF 关键字段:
[Data]
AutoPartition=1 ; 自动分区格式化,免手工
[Unattended]
Repartition=Yes ; 有旧盘就重建
[UserData]
; 注意:这里不要写 ProductKey,见下面的坑5.1 产品密钥坑(极易误判为「还在安装」)
- ISO 卷标是
GRTMPFPP_CN,属于零售版(FPP)介质; - 而网上流传的
MRX3F-47B9T-2487J-KWKMF-RPWBY是批量授权(VLK)密钥; - Setup 会校验密钥与介质类型是否匹配,不匹配就弹「输入的产品密钥无效」,然后静默卡在密钥页——安装计时停住、不报错退出,非常容易误以为还在跑。
解法:把 5 段密钥全部清空 → 下一步 → 「是否立即输入产品密钥?」选否。装完是 30 天宽限期的未激活状态(激活服务器早已停,宽限期满了弹提示,不影响使用)。
所以应答文件里默认不要写 ProductKey。
6. 第四步:核心启动参数
6.1 精简的日常启动命令
qemu-system-i386 \
-machine pc \
-accel tcg \
-cpu qemu32 \
-smp 1 \
-m 1024 \
-L $HOME/opt/qemu52/usr/share/qemu \
-drive file=xp.qcow2,if=ide,index=0,media=disk,format=qcow2 \
-vga cirrus \
-device piix3-usb-uhci,id=usb1 \
-device usb-tablet,bus=usb1.0 \
-device ich9-usb-ehci1,id=usb2 \
-netdev user,id=net0 \
-device rtl8139,netdev=net0 \
-rtc base=localtime \
-display none \
-vnc 127.0.0.1:1 \
-monitor unix:mon.sock,server,nowait逐项说明:
-accel tcg:纯软件模拟,没有 KVM 就是它。-smp 1:ARM 上跑 x86 只能单线程 TCG。加核不仅不快,还会触发内存序警告、可能随机蓝屏。-cpu qemu32:模拟 Pentium III 级别,最稳。-L:指向便携版 QEMU 的usr/share/qemu,让模拟器找到 BIOS/ROM。- 两条 USB 总线(
piix3-usb-uhci+ich9-usb-ehci1):这是后面 USB 直通的关键,QEMU 不允许跨速度挂载,全速设备走 UHCI、高速设备走 EHCI,挂错会报speed mismatch。usb-tablet是虚拟鼠标,去掉就没法绝对定位。 -netdev user:用户态 NAT(slirp),客户机网关是10.0.2.2,DNS 是10.0.2.3。-display none -vnc 127.0.0.1:1:麒麟自带的 QEMU 4.2 只编译了 vnc 后端(无 gtk/sdl),所以显示统一走 VNC + Remmina。-monitor unix:...:监控口,是后续「热插拔 USB、发按键、抓屏」的命脉,务必开着。
6.2 安装模式额外加的参数
-drive file=winnt.img,format=raw,if=floppy,index=0,readonly=on \
-cdrom xp.iso \
-boot order=dc- 软盘加
readonly=on,因为 QEMU 会独占锁镜像,多开做对照实验时能避免写锁冲突。 - 无人值守下只有两处要人工:一开始的「Press any key to boot from CD…」(敲一下空格),以及上面的产品密钥页(选否)。
6.3 时间预算(TCG 全模拟,务必心里有数)
| 阶段 | 耗时 |
|---|---|
| 文本模式加载驱动 | ~4 分钟 |
| 分区/格式化 | ~2 分钟 |
| 复制文件 | ~10 分钟 |
| 重启进图形界面安装 | ~40 分钟 |
| 收尾重启 | ~5 分钟 |
7. 核心坑:QEMU 4.2 装 XP 必蓝屏 0x7F
这是整个项目最大的障碍,值得单独一节讲清楚「现象 → 定位 → 根因 → 解法」的完整链条,因为它示范了一个通用的排障方法论。
现象:ISO 全新安装,文本模式走到 Setup is starting Windows 处必崩:
STOP: 0x0000007F (0x0, 0x0, 0x0, 0x0)并且自动重启后无限循环。
排除矩阵(每项单独开虚拟机验证过,结果全部一样崩):CPU 型号(qemu32/pentium3/core2duo)、显卡(cirrus/std)、内存(512/1024)、软盘有无、-no-acpi、-M pc-i440fx-2.11、-icount auto、-no-hpet。
定位手段:-d int -D qlog.txt 抓客户机异常日志,发现真正的异常不是除零(0x7F 参数全 0 只是表象),而是反复 v=0e CR2=00000023(空指针)→ v=08 双重故障;EIP=0x8080d867 落在栈区(SP≈0x8080d860),EAX=0x23。也就是说客户机在执行栈上的垃圾数据——寄存器与栈都被写坏了。
根因:这不是 Windows 的逻辑问题,而是 QEMU 4.2 在 ARM64 上翻译 x86 的指令翻译缺陷。
解法:换 QEMU 5.2,一次通过。
两个顺带发现、可复用的排障技巧:
- 保留蓝屏现场:加
-no-reboot -no-shutdown,崩溃时 QEMU 停住而不是重启,可以直接截图/看 monitor。 - 从显存读被截断的蓝屏全文:monitor 里
pmemsave 0xb8000 16000 vga.bin,再按 80×25、字符/属性交错解析。
8. 装好后的增强(按价值排序)
这一节是本项目的「产出物」,每项都已实测打通。复现者可以按需取用。
8.1 共享文件夹:为什么是 FTP,而不是 SMB / WebDAV
结论先行:共享目录用「宿主机起一个纯用户态的 FTP + WebDAV 服务,客户机访问 ftp://10.0.2.2:2121/」。因为 slirp 网络里 10.0.2.2 就是宿主机回环地址,客户机不用填任何地址或密码。
试过但走不通的路(记录在案,别再重复):
- WebDAV 映射盘符:XP 的 WebDAV 重定向器不支持带端口的 URL,
net use Z: http://10.0.2.2:8080/必报「系统发生 67 错误」(服务端一条请求都收不到,说明是重定向器本地失败,不是网络问题)。80 端口又需要 root 才能监听。 - SMB:宿主机 samba 要在 445 端口必须 root;普通用户起 smbd 服务一个连接就退出。
所以 FTP 是这台机器上唯一稳的方案。 中文文件名正常显示,无乱码。
8.2 打印转发:XP 出 PostScript,宿主机 CUPS 真正干活
原理三句话:XP 里装「标准 TCP/IP 端口 → 10.0.2.2:9100/9101」,发裸数据流;宿主机 printd.py 收下后交给对应 CUPS 队列渲染出纸。
- 驱动选 XP 自带的 PostScript 通用驱动
MS Publisher Imagesetter,别去找厂商的 XP 驱动——真正干活的是宿主机 CUPS。 - 一个端口对应一个队列(数据流里没队列名),所以「哪台打印机」完全由端口号决定:9100 → CUPS 默认队列,其余按名字排序 9101、9102…
- 为什么不用 IPP:XP 的
printui命令行无法建 IPP 端口(报「参数无效」),唯一正规入口要图形操作。走标准 TCP/IP 端口可以全命令行复现:
cscript //nologo %windir%\system32\prnport.vbs -a -r IP_10.0.2.2 -h 10.0.2.2 -o raw -n 9100
cscript //nologo %windir%\system32\prnmngr.vbs -a -p "<打印机名>" -m "MS Publisher Imagesetter" -r "IP_10.0.2.2"脱敏说明:上例中的 <打印机名> 是占位符。实际部署时填你自己 CUPS 队列对应的打印机名,其余不变。多台打印机就多建几个端口(9101、9102…)依次对应。8.3 文档转发:XP 里双击办公文档,用宿主机 WPS 打开
起因:XP 里装的那套 WPS 一启动就把整机拖死(桌面时钟停、键鼠全无响应,只能硬复位,发生过两次)。而这台虚拟机真正需要的只是「能看能改 doc/xls/ppt」,没必要在模拟环境里再跑一套 WPS。
方案:XP 只负责「把文件递出去」,排版渲染全在宿主机做。
XP 双击 .docx
→ 文件关联指向 wscript.exe "C:\hostopen\hostopen.vbs" "%1"
→ 脚本把文件读成二进制,HTTP PUT 到 10.0.2.2:9102
→ 宿主机 opendaemon.py 落盘到 share\来件\
→ 按扩展名调宿主机的 wps/et/wpp 打开,窗口弹在麒麟桌面上三个必踩的坑(记下来直接跳过):
- 文件关联必须写 HKLM:这台机器
HKCU\Software\Classes不被合并进 HKCR,assoc/ftype都查不到。写HKCU关联会失效,必须写HKLM\Software\Classes。 - 给 XP 传文件别用浏览器下载再运行:IE 下载的文件带「来自 Internet」标记(MotW),即使存到 C 盘,其中的 ADODB/FSO 仍被安全区拦住(「禁止访问其它域的数据源」),同盘 copy 也去不掉。改用 QEMU 虚拟光驱传文件,完全绕开浏览器安全区。
- VBScript 里别用字节数组下标:
b(i)取 ADODB.Stream 的字节数组在 XP 上报「类型不匹配」,URL 编码改用AscW纯算术实现。
8.4 USB 直通:设备让给 XP 用
宿主机插着的 USB 设备,可以指定其中几个「让给」XP(独占,宿主机同时用不了)。
关键前提——设备节点权限:/dev/bus/usb/BBB/DDD 默认 root:root 660,普通用户只能读不能写,QEMU 的 usb-host 会静默失败。需要一条 udev 规则把节点交给 plugdev 组:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0660", GROUP="plugdev"热插拔命令(虚拟机开着也能用,立即生效):
device_add usb-host,bus=usb2.0,vendorid=0xVVVV,productid=0xPPPP
device_del usb_VVVV_PPPP实测结论(都是真机验证过的):
- USB 3.0 设备(5Gbps)直通时 QEMU 会自动降到 480Mbps 当 USB 2.0 用,不报 speed mismatch,慢但能用。
- U 盘文件系统必须是 FAT32/NTFS;exFAT 读不了(XP SP3 原生不支持,微软补丁 KB955704 官方链接已下线)。双击会弹「磁盘未格式化,是否格式化」,千万点否,点是将清空数据。
- 免驱摄像头(UVC)直通后 XP 没驱动,只会显示「未知设备」;U 盘、USB 打印机、串口线这些 XP 自带驱动的才真正可用。
- U 盾(HID 类)会被误判成键鼠:很多国产 U 盾上报的接口类就是
03(HID),自动脚本会拒绝直通,需要加--force。它走 usb1.0(12M 全速),不是 usb2.0。
8.5 内网 VPN:虚拟机「天然」跟着宿主机走
一个反直觉但很有用的结论:QEMU 的用户态网络(slirp)不是桥接——XP 发出的每个 TCP 连接,都是 QEMU 进程在宿主机上用自己的身份重新发起的。所以只要宿主机的路由表把目标地址指到 VPN 隧道口,XP 就自动跟着走隧道。
这意味着:虚拟机里根本不用装 VPN 客户端,宿主机连上 VPN,虚拟机就能访问内网;宿主机 VPN 一断,虚拟机里的内网快捷方式就打不开(这是正常现象,不是虚拟机坏了)。
一个真实案例:虚拟机里那个 SSL VPN 客户端(2018 年旧版,协议版本过旧)连不上新网关,报 Handshaking Failed。查到最后是客户端太旧 + 安装不完整(Loadlibrary 'gwlog.dll' Error(126)),修不好也不用修——走「宿主机连 VPN」的老路即可。
脱敏说明:本节隐去了具体的 VPN 网关地址、隧道网段与内网业务系统 URL。复现时只需替换成你自己的内网地址即可,判断方法与结论完全通用。
8.6 开机网络自愈
坑:XP 的 DHCP Client 服务开机不会自动启动(虽然 sc qc dhcp 显示 AUTO_START),导致 IP 是 0.0.0.0,一切「连不上宿主机」的报错都源于此。
解法:sc config dhcp start= auto 之后,再往「启动」文件夹放一个隐藏脚本,开机等 30 秒后 net start dhcp + ipconfig /renew。
9. 运维:还原点与断电自救
用户最怕的就是「意外断电/直接关宿主机把虚拟机搞坏」。qcow2 格式自带 refcount 保护,断电最坏是泄漏几个簇,一般不至于全盘报废;但保险起见做一个整盘冷备份:
# 1. 先在 Windows 里正常关机(别杀 QEMU 进程,等于拔电源)
# 2. 关机后做一份干净副本
qemu-img convert -O qcow2 -p xp.qcow2 xp-restore-YYYYMMDD.qcow2
qemu-img check xp-restore-YYYYMMDD.qcow2 # 确认 No errors were foundconvert 顺带重建 refcount、压实稀疏区(20GB 虚拟 → 4.3GB 实际,几秒完成)。
断电后盘报错了,别急着重装,依次试:
qemu-img check xp.qcow2 # 只看不修,先看坏在哪
qemu-img check -r all xp.qcow2 # 尝试就地修复
qemu-img check -r all -T -f qcow2 # 结构损坏更严重时修不好再上还原点。
10. 给「复现者(AI)」的操作清单
这是本项目最「反直觉」的部分:在这台机器上,鼠标基本没用,一切都要靠键盘。 如果一个 AI 想复现整个流程(包括在 XP 里做图形操作),务必记住:
- VNC 的鼠标事件对 usb-tablet 无效,
mouse_move/ 绝对坐标点击都不生效。只能靠键盘。 - 唯一可靠的输入入口是 Win+R 运行框(它一定会拿到键盘焦点)。流程固定为:
Win+R → 输入 → 截图核对 → 再回车。 - 长命令一律写成
.bat放虚拟光驱里,敲一个d:\xxx.bat最可靠。在 cmd 里直接敲长命令容易被吞字。 - 每步之间留 0.5 秒以上并截图确认,因为连续
sendkey时上一条 Enter 有时不生效,两条命令会粘在一起。 - 绝对不要在桌面/资源管理器有焦点时发 Ctrl+A 或 Delete:桌面上会全选图标,一按回车就把二十几个程序一起拉起来(实测把整机搞死一次);资源管理器里会触发批量删除确认。
- 给 XP 传文件用 QEMU 虚拟光驱(
genisoimage生成 ISO →eject+change换盘),不要用浏览器下载,绕开 MotW 安全区。 - 后台进程管理:QEMU、下载这类长任务用后台任务方式起,收尾用 monitor 的
quit命令关(比找 PID 可靠);setsid/nohup起的进程会脱离可见 PID 命名空间,pkill杀不掉。 - 判断客机是否卡死:monitor 里
info registers看HLT位。HLT=1是空闲;HLT=0且IF=0是内核死锁在 CPL0,该system_reset硬复位。
11. 性能真相与替代方案
TCG 的物理上限:单 vCPU 最多吃满 1 个物理核,CPU 100% 是模拟器上限,不是「分配不够」。加核(-smp 4 -accel tcg,thread=multi)能起来但 QEMU 会警告内存序问题、可能随机蓝屏,且这台 XP 是单处理器 HAL,加 vCPU 得先换 HAL,得不偿失。
如果嫌慢,按需选替代方案:
- 只要跑某个 XP 时代的老软件(不需要整个桌面):box64 + Wine,快 5~10 倍,但兼容性要逐个试。
- 需要真正流畅的 XP 桌面:租一台 x86 云主机,RDP/VNC 连过去。
- 手边有 x86 老电脑:那是最省事的。
12. 关键结论速查
| 问题 | 结论 |
|---|---|
| ARM64 国产机能不能跑 XP | 能,QEMU TCG 软件模拟,慢但稳定 |
| 必须用什么版本 | QEMU 5.2(4.2 必蓝屏 0x7F) |
| 无 root / apt 不可用怎么装 | 便携前缀:dpkg-deb --fsys-tarfile 【替换为管道符,直接输入会被Markdown识别为表格】 tar -x -m |
| ISO 怎么选 | 认准文件名带 professional_with_service_pack_3,SHA1 对表 |
| 产品密钥怎么填 | 不填,清空选「否」,30 天未激活不影响使用 |
| 共享文件夹 | FTP(SMB/WebDAV 盘符都走不通) |
| 打印 | XP 出 PostScript → 10.0.2.2:9100 → 宿主机 CUPS |
| 文档编辑 | 转发给宿主机 WPS,XP 里不跑 Office |
| USB 直通 | 双总线 + udev 授权 + 按速度自动选总线 |
| 内网访问 | 宿主机连 VPN,虚拟机自动跟着走(slirp 复用宿主路由) |
| 防损坏 | qcow2 冷拷贝还原点 + qemu-img check -r 自救 |