问题
本机(GPD G1619-04)固件把 Windows Boot Manager 钉在启动菜单第一位,而 BIOS 内部只能调「硬盘组 / 外设」之间的顺序,不能调同一组内不同引导项的顺序 ⇒ 无法在固件里把 NixOS 提到 Windows 前面。
机制:固件有两套顺序,标准 BootOrder 管不了菜单
实测证据(读 /sys/firmware/efi/efivars/):
| 变量 | 实测值 | 含义 |
|---|---|---|
BootOrder | [1,0,3,10,11] | 标准变量 —— 只决定「无人干预时自动进哪个」,`efibootmgr -o` 改的就是它 |
DefaultBootOrder | [3,0,10,1,11,12,13] | 固件自己的默认顺序,Windows(3) 第一 |
OldBootOrder | 同上 | 同上 |
FastBootOption | 一条完整 device path,直指 \EFI\Microsoft\Boot\bootmgfw.efi | 快速启动的目标就是 Windows |
FixedBoot / FixedBootGroup / FixedBootPriorities | 厂商私有 GUID | 「固定启动优先级」机制,组内顺序由它决定 |
关键:除 BootOrder 外,上述变量在每次开机时都被固件重写(mtime = 开机时刻),且里面 Windows 第一。因此「菜单显示顺序」不是 Linux 能控的。
走过的弯路(全部无效)
efibootmgr -o把盘1 排到首位——只修了自动引导,菜单显示不变;且每次nixos-rebuild后还会被改回去(实测从0001,…变成0003,…,0001,…,Windows 反而跑到第一)。- 删掉 Windows 的
Boot0003/ 重建它的 device path——固件下次开机又重写回来。 - 进 BIOS 手动排——组内不可调,此路不通。
有效方案:让固件以为在启 Windows,实际加载 XorBoot
不去对抗固件的排序,而是把我的入口塞进它死盯的那个位置:
把 BWINEFI:\EFI\Microsoft\Boot\bootmgfw.efi 替换成 xorboot.efi
⇒ 固件那条「Windows 项」实际拉起 XorBoot 菜单
⇒ 固件的「钉死」反而变成了我们的默认入口
⇒ XorBoot 菜单里把 NixOS 设为默认(倒计时 3 秒)引导链变成:固件 →(Windows 项)→ XorBoot 菜单 →① NixOS(默认)/ ② Windows。
NixOS 再交棒给它自己的 systemd-boot,世代记录完整保留。
落地状态(实测,2026-10-09 18:27 重启后)
| 文件 | 大小 | sha256 | 说明 |
|---|---|---|---|
BWINEFI:\EFI\Microsoft\Boot\bootmgfw.efi | 1,901,056 | d86858bd… | 当前生效 = XorBoot |
BWINEFI:\EFI\Microsoft\Boot\bootmgfw.efi.bak | 2,830,632 | — | 原 Windows 引导备份 |
BWINEFI:\EFI\Microsoft\Boot\bootmgfw_win10.efi | 2,830,632 | 282f826e… | 原 Windows 引导(供 XorBoot 菜单调用) |
BWINEFI:\EFI\xorboot\xorboot.efi | 1,901,056 | d86858bd… | 与 bootmgfw.efi 同一份 |
BWINEFI:\EFI\xorboot\xorboot.xor | 93,696 | — | 菜单配置 |
判定证据:efibootmgr 里 BootCurrent = 0003(固件确实启动的是 Windows 项)、BootOrder 里 Windows 仍在首位——但实际进来的是 NixOS。哈希对比确认 bootmgfw.efi 与备份的 bootmgfw_xor.efi 完全相同。
两层引导的分工(认知要点)
| 层 | 谁在管 | 作用 |
|---|---|---|
| 第一层 XorBoot | 占住固件的 Windows 项 | 选 OS:NixOS(默认)/ Windows |
| 第二层 systemd-boot | 盘1 的 NIPXESP | 选 NixOS 世代(记录完整保留) |
| 固件层 | 厂商变量 | 已降级为「启动 XorBoot 的通道」,排序不再重要 |
维护与风险
- Windows 大版本更新会覆盖
bootmgfw.efi⇒ XorBoot 会消失、恢复 Windows 直接启动。重做一次「替换」即可。 - 必须关闭 Secure Boot(XorBoot 未签名)。
- NixOS rebuild 仍会改
BootOrder(把自己的项排前)⇒ 那一次重启会跳过 XorBoot 直接进 systemd-boot(能进 NixOS,但当次选不了 Windows);下次开机固件又改回 Windows 第一,XorBoot 恢复。可接受,但知道就好。 - 盘2 僚机(BC711-NixOS)不在 XorBoot 菜单里 ⇒ 要进僚机得从固件菜单(
F7/Esc)选BC711-NixOS或UEFI OS;或在 XorBoot 里补一项指向盘2 的\EFI\systemd\systemd-bootx64.efi。 - 恢复原状:PE U 盘启动 → 给 Windows ESP 分配盘符 →
copy bootmgfw.efi.bak → bootmgfw.efi即可(备份就在同一目录)。
备份位置
Ventoy:/S500data/软件数据备份/xorboot菜单备份/
├─ 操作说明.txt (完整步骤:diskpart 分配盘符 → 导出 xorboot.efi → 重命名菜单文件 → 部署 → 替换 bootmgfw.efi → 编辑菜单 → 清理)
└─ nixos-win/
├─ EFI/xorboot/xorboot.xor
└─ Microsoft/Boot/{bootmgfw.efi, bootmgfw_win10.efi, bootmgfw_xor.efi}与「六计」的关系
- 计3 M7 三引导验收:① 盘1 NixOS 主机(XorBoot 默认)✅ 已达成;② 旧 Win 物理系统(XorBoot 菜单第二项)待验;③ 盘2 僚机 需从固件菜单进。
- 计5 旧 Win 变 VM 后,XorBoot 菜单里的 Windows 项可以移除;已无必要。