在Arch Linux环境下将Windows11原生部署到移动硬盘中的一种可行方法(全部操作由DeepSeek-V4-Flash-0731完成)

感谢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.wimls /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

:warning: 若 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)

  1. windowsPE 必须含 Microsoft-Windows-International-Core-WinPE(语言组件,否则卡语言页)
  2. CreatePartition 只能有 Order/Type/Size/Extend——Format/Active 必须放在 ModifyPartitions(放错报“组件或设置不存在”)
  3. InstallFrom/IMAGE/INDEX/IMAGE/NAME(如 "Windows 11 Pro")
  4. ProductKey 可用通用零售 Pro key VK7JG-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 即可。

  1. 用 PE 引导盘(原始 boot.wim 即可)启动,等 setup “缺少媒体驱动程序”界面
  2. Shift+F10(可能需按 2~3 次才弹出)→ CMD
  3. diskpart(逐条输入,注意命令完成再输下一条):
select disk 1
select partition 1
assign letter=E        ← 用 E!S 在 WinPE 常被占用会报“驱动器号不可用”
select partition 3
assign letter=W
exit
  1. bcdboot(★ 键盘输入 \ 后紧跟的字符易丢,\ 后停顿 1 秒再输):
bcdboot w:\windows /s e: /f uefi
  1. 输出 “已成功创建启动文件。” 即成功;失败多为路径拼错(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

以后找机会测试一下

这仍然使用了windows pe部署,不知道与arch有什么关系.所以为什么不直接启动pe安装windows呢,还不用整这么麻烦