感谢DeepSeek-V4-Flash-0731,所有的操作全是他干的。
Arch Linux不支持腾讯的ace反作弊系统,因此腾讯的游戏基本无法使用,所以我尝试在一块移动硬盘(1Tssd+ssk外壳,高速Type-C接口)上安装原生的Windows,使用Win To Go和Win To USB制作的系统虽然更加简单,但是腾讯的ace完全不支持,所以只能选择使用原生部署方案,这个方法在Windows上一般可以使用dism工具解决,但是Linux环境下虽然有类似的工具,但是依然非常复杂。
部署全流程
本节是完整可复现流程。每步都有「验证点」——验证不过不要进入下一步。
约定
ISO= Windows 11 镜像文件(zh-CN 优先)TARGET= 目标 USB 盘(如/dev/sdb),全程用 by-id 访问,禁止用盘符PE= 自制引导盘镜像(我们叫 pe.raw)- 格式化/分区目标盘由 setup 自己完成(unattend 里
WillWipeDisk),无需手工分区
§1 盘身份校验(防错盘,每次做)
ls -la /dev/disk/by-id/usb-*
lsblk -o NAME,SERIAL,VENDOR,SIZE,RM
# 目标盘必须 RM=0(非可移动标记)或确认序列号;操作只按 by-id 进行
§2 解包 ISO(必须全量)
7z x /path/Win11.iso -o/path/isorebuild
# 检查关键文件:
ls isorebuild/sources/install.wim isorebuild/sources/boot.wim
ls isorebuild/sources/lang.ini && ls isorebuild/sources/zh-CN # ← 缺了它们 setup 报语言错误
§3 制作 PE 引导盘
核心:两个分区。
| 分区 | 大小 | 文件系统 | 内容 |
|---|---|---|---|
| P1 ESP | 2G | FAT32 | EFI 引导件 + sources\boot.wim + boot\boot.sdi |
| P2 PE | 8G | NTFS | sources\install.wim + sources 全量(setup.exe、lang.ini、zh-CN…) |
truncate -s 16G pe.raw
L=$(sudo losetup -f); sudo losetup -P $L pe.raw
sudo sgdisk -o /dev/$L
sudo sgdisk -n 1:0:+2G -t 1:ef00 -c 1:ESP /dev/$L
sudo sgdisk -n 2:0:0 -t 2:0700 -c 2:PE /dev/$L
sudo partprobe /dev/$L; sleep 1
sudo mkfs.vfat -F32 -n ESP /dev/${L}p1
sudo mkntfs -Q -L PE /dev/${L}p2
# P1:EFI 引导件
sudo mount /dev/${L}p1 /mnt/esp
sudo mkdir -p /mnt/esp/EFI/boot /mnt/esp/EFI/microsoft/boot /mnt/esp/sources /mnt/esp/boot
sudo cp isorebuild/efi/boot/bootx64.efi /mnt/esp/EFI/boot/
sudo cp -r isorebuild/efi/microsoft/* /mnt/esp/EFI/microsoft/
sudo cp isorebuild/sources/boot.wim /mnt/esp/sources/ # ★必须放这(BCD 的 [boot] 卷引用)
sudo cp isorebuild/boot/boot.sdi /mnt/esp/boot/
# P2:安装源(install.wim 放 NTFS——大于 FAT32 4G 上限的必须 NTFS)
sudo mount /dev/${L}p2 /mnt/pe
sudo mkdir -p /mnt/pe/sources
sudo cp -r isorebuild/sources/. /mnt/pe/sources/ # 全量:含 lang.ini/zh-CN/setup.exe
# unattend 也放这里(setup 通过命令行参数读取)
sudo cp assets/autounattend.xml /mnt/pe/sources/unattend.xml
验证点:ls /mnt/esp/EFI/boot/bootx64.efi /mnt/esp/sources/boot.wim;ls /mnt/pe/sources/install.wim /mnt/pe/sources/lang.ini。
§4 注入启动钩子(安装自动化的关键)
直接改 解包目录 里的文件后重新打 WIM,不要用
wimlib update(对微软官方 WIM 的修改实测不可靠)。
# 方案:apply → 改 → capture(100% 可靠)
mkdir -p pe-tree
wimlib-imagex apply isorebuild/sources/boot.wim 1 pe-tree
# winpeshl.ini:★ 逗号语法(空格写法实测无效)
cat > pe-tree/Windows/System32/winpeshl.ini <<'EOF'
[LaunchApps]
%WINDIR%\System32\cmd.exe, /c X:\run-install.cmd
EOF
# run-install.cmd:LabConfig 硬件检查绕过 + setup
cat > pe-tree/Windows/run-install.cmd <<'EOF'
@echo off
reg add HKLM\SYSTEM\Setup\LabConfig /v BypassTPMCheck /t REG_DWORD /d 1 /f
reg add HKLM\SYSTEM\Setup\LabConfig /v BypassSecureBootCheck /t REG_DWORD /d 1 /f
reg add HKLM\SYSTEM\Setup\LabConfig /v BypassCPUCheck /t REG_DWORD /d 1 /f
reg add HKLM\SYSTEM\Setup\LabConfig /v BypassRAMCheck /t REG_DWORD /d 1 /f
C:\sources\setup.exe /unattend:C:\sources\unattend.xml
EOF
wimlib-imagex capture pe-tree /tmp/boot-fixed.wim "Windows PE" --compress=LZX --check
sudo cp /tmp/boot-fixed.wim /mnt/esp/sources/boot.wim
若 capture 版引导失败(黑屏/固件重启),回退原始 boot.wim(安装仍可交互完成,见 §5-2 手动分支)。
§5 启动 KVM 全自动安装
参数要点(都是坑过的)
sudo qemu-system-x86_64 \
-machine "pc,accel=kvm" -cpu host -smp 4 -m 4096 \
-drive "if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd" \
-drive "if=pflash,format=raw,file=vars.fd" \
-drive "file=pe.raw,format=raw,if=ide" \
-drive "file=/dev/sdX,format=raw,if=ide" \
-device "usb-ehci" -device "usb-kbd" \
-net none -vga std -display none \
-monitor "tcp:127.0.0.1:4444,server,nowait" \
-serial file:serial.log -no-reboot
- 必须
-machine pc(i440fx):q35 下 WinPE 枚举问题多 - 必须
if=ide:AHCI/SCSI/USB 虚拟介质在本实验组合全部失败 -net none:离线安装(避免 NDUP 网络路径)- 引导盘 = IDE0 → Disk 0;目标盘 = IDE1 → Disk 1(unattend 里
DiskID=1!)
unattend.xml 关键规则(详见 assets/autounattend.xml)
windowsPE必须含Microsoft-Windows-International-Core-WinPE(语言组件,否则卡语言页)CreatePartition只能有 Order/Type/Size/Extend——Format/Active必须放在ModifyPartitions(放错报“组件或设置不存在”)InstallFrom用/IMAGE/INDEX或/IMAGE/NAME(如 "Windows 11 Pro")ProductKey可用通用零售 Pro keyVK7JG-NPHTM-C97JM-9MPGT-3V66T
监控
截图轮询(monitor TCP + socat):
echo "screendump /tmp/s1.png" | socat - tcp:127.0.0.1:4444
# OCR 确认“正在复制 Windows 文件 / 正在准备要安装的文件(NN%)”
手动分支(capture 版引导失败时)
原始 boot.wim 默认会启动 setup;语言页出现时:sendkey alt-n 继续 → 若出现“这台电脑无法运行 Windows 11” → 先退出重启,Shift+F10 执行 LabConfig 四条 reg add 再重跑 setup(或直接用注入版引导盘)。
§6 阶段 B:specialize + 截断
安装完成(“正在完成”→ guest 自动重启 → qemu 因 -no-reboot 退出)后:
# 仅挂目标盘,重新启动
qemu-system-x86_64 ... -drive "file=/dev/sdX,format=raw,if=ide" ... -no-reboot
- 二次启动 = specialize(数分钟黑屏)
- 在 OOBE 首屏出现前/刚出现时 poweroff VM(monitor
quit) = 截断点 - 此后实体机首次开机直接从国家/地区页开始 OOBE,不会出现“为什么我的电脑重启了”
验证:sudo sgdisk -p /dev/sdX 应有 EFI(300M)+MSR+主分区;PortableOperatingSystem 未置位(见 §8)。
§7 引导修复(setup ESP 为空时的兜底,官方 bcdboot)
setup 的 BFSVC 在部分环境写引导失败(日志:
BiCreateEfiEntry failed c0000225)。机制未知,修复用微软官方 bcdboot 即可。
- 用 PE 引导盘(原始 boot.wim 即可)启动,等 setup “缺少媒体驱动程序”界面
- Shift+F10(可能需按 2~3 次才弹出)→ CMD
- diskpart(逐条输入,注意命令完成再输下一条):
select disk 1
select partition 1
assign letter=E ← 用 E!S 在 WinPE 常被占用会报“驱动器号不可用”
select partition 3
assign letter=W
exit
- bcdboot(★ 键盘输入
\后紧跟的字符易丢,\后停顿 1 秒再输):
bcdboot w:\windows /s e: /f uefi
- 输出 “已成功创建启动文件。” 即成功;失败多为路径拼错(
w:\indows少了 w)。
验证:挂载 ESP:EFI\Microsoft\Boot\BCD + EFI\BOOT\BOOTX64.EFI 存在。
§8 最终体检(交付前)
sudo hivexregedit --export /mnt/sys/Windows/System32/config/SYSTEM 'ControlSet001\Control' | grep -i portable
# 必须无输出(PortableOperatingSystem 未置位 = 绝对原生 = ACE 通过)
完整清单见https://github.com/Moritz230127/win11-native-usb-install