首先对「在 Linux 上安装 Windows To Go」潜在问题做一个简单分析:

  • Windows 系统的安装过程(从 ESD / WIM 映像释放到 NTFS 分区;dd / Ghost 不算)用到专属于 Windows 的特性,必须要在 Windows 环境下进行(Windows 预安装环境(Preinstall Environment,即 PE)或者完整的 Windows 环境)。需要用虚拟机或者制作 Windows 启动 U 盘。
  • Windows 安装程序会阻止把 Windows 安装在 U 盘上。得益于 Linux 的设备文件抽象,如果使用虚拟机方案,这个问题被天然地解决了。
  • 如果要同时支持 UEFI 和 BIOS 启动方式,需要使用 MBR 分区表并手动写入引导(关于 MBR 分区表,参见安装 Manjaro To Go「手动安装:分区方案」下的解释)。

下面的内容使用微软官方安装光盘映像中的 Windows PE,通过 Windows 安装程序进行安装。使用第三方 PE 和基于 CBS / DISM 的第三方安装程序也是可行的,但请务必选择可靠的第三方软件。

纯 UEFI 路线

在 Virt-Manager 里面建虚拟机,选 UEFI 固件,把 /dev/sdX 当作 raw image 挂到 SATA 总线上,从光盘启动,正常安装。没了。

稍微展开一下——

新建虚拟机:

edk2-ovmfwin10/dev/sdd
图:存储填入设备文件名 /dev/sdd
图:选用 UEFI 固件

安装:

  • 自定义界面点左上角开始安装。
  • Windows 光盘会提示按任意键从光盘启动,如果错过的话把虚拟机重启一下。如果不小心把虚拟机关掉了,需要手动设置启动顺序,把光盘勾上提到第一位。
  • 现在 Windows 被 QEMU 欺骗,会把 U 盘当作一块普通的 SATA 硬盘,正常安装即为可。
  • 提示:装完之后虚拟机别删,Windows To Go 不能进行大版本更新(因为大版本更新必须走 Windows 安装程序,而 Windows 安装程序会阻止在 U 盘上安装),可以再把硬盘挂回虚拟机,从硬盘启动,这样就能正常更新了。
图:手动设置启动顺序
图:由于被识别为 SATA 硬盘,Windows 安装程序不会阻止安装到 U 盘。

UEFI + BIOS 兼容路线

bcdboot

下面把和「纯 UEFI 路线」不同的地方展开一下——

硬盘分区:

  • 推荐使用 host 上的图形界面分区工具,如 GParted、KDE Partition Manager 等。
  • 需要一个 FAT32 启动分区,设为活动分区(在 GParted 上是 boot 标记;先不要设为 EFI 系统分区,否则后面写入引导时不能指派盘符,diskpart 也不行),推荐 100 MiB。
  • Windows 安装程序是个坑,它会把启动分区格式化成 NTFS。

新建虚拟机:

  • 固件使用 BIOS(保持默认即可)。

写入 UEFI 引导:

B:bcdboot C:\Windows /s B: /f UEFI