信创 2026/11/01 20:02

[肥鱼大战信创] 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
内存/CPU1024MB / qemu32 单核(ARM 上跑 x86 只能单线程 TCG)
显示-vnc 127.0.0.1:1 + Remmina,无 gtk/sdl 后端
网卡RTL8139 + 用户态 NAT(slirp)

1. 为什么只能是 TCG:先搞清楚「能不能」再动手

动手前先确认三件事,避免在错误的方向上浪费时间:

  1. 架构:uname -m 是 aarch64,而要跑的 XP 是 x86。宿主机与客户机不同架构,VirtualBox / VMware / KVM 这类依赖硬件虚拟化或同架构的方案全部出局。
  2. KVM:ls /dev/kvm 不存在,/proc/cpuinfo 里也没有 vmx/svm 标志。没有 KVM,-accel kvm 无从谈起。
  3. 唯一出路: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  libpmem1

3.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.iso69DBF131116760932DCF132ADE111D6B45778098
批量版(VOL)…_cd_vl_x14-74070.isoD142469D0C3953D8E4A6A490A58052EF52837F0F

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,一次通过。

两个顺带发现、可复用的排障技巧:

  1. 保留蓝屏现场:加 -no-reboot -no-shutdown,崩溃时 QEMU 停住而不是重启,可以直接截图/看 monitor。
  2. 从显存读被截断的蓝屏全文: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 打开,窗口弹在麒麟桌面上

三个必踩的坑(记下来直接跳过):

  1. 文件关联必须写 HKLM:这台机器 HKCU\Software\Classes 不被合并进 HKCR,assoc/ftype 都查不到。写 HKCU 关联会失效,必须写 HKLM\Software\Classes。
  2. 给 XP 传文件别用浏览器下载再运行:IE 下载的文件带「来自 Internet」标记(MotW),即使存到 C 盘,其中的 ADODB/FSO 仍被安全区拦住(「禁止访问其它域的数据源」),同盘 copy 也去不掉。改用 QEMU 虚拟光驱传文件,完全绕开浏览器安全区。
  3. 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 found

convert 顺带重建 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 里做图形操作),务必记住:

  1. VNC 的鼠标事件对 usb-tablet 无效,mouse_move / 绝对坐标点击都不生效。只能靠键盘。
  2. 唯一可靠的输入入口是 Win+R 运行框(它一定会拿到键盘焦点)。流程固定为:Win+R → 输入 → 截图核对 → 再回车。
  3. 长命令一律写成 .bat 放虚拟光驱里,敲一个 d:\xxx.bat 最可靠。在 cmd 里直接敲长命令容易被吞字。
  4. 每步之间留 0.5 秒以上并截图确认,因为连续 sendkey 时上一条 Enter 有时不生效,两条命令会粘在一起。
  5. 绝对不要在桌面/资源管理器有焦点时发 Ctrl+A 或 Delete:桌面上会全选图标,一按回车就把二十几个程序一起拉起来(实测把整机搞死一次);资源管理器里会触发批量删除确认。
  6. 给 XP 传文件用 QEMU 虚拟光驱(genisoimage 生成 ISO → eject + change 换盘),不要用浏览器下载,绕开 MotW 安全区。
  7. 后台进程管理:QEMU、下载这类长任务用后台任务方式起,收尾用 monitor 的 quit 命令关(比找 PID 可靠);setsid/nohup 起的进程会脱离可见 PID 命名空间,pkill 杀不掉。
  8. 判断客机是否卡死: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 自救
已有 0 条评论 (旧评论在前)
  1. 暂无评论 / 0 Comment
添加新评论 (Markdown Supported)
(ノ°ο°)ノ