多个引导项的排序问题

问题

本机(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.efi1,901,056d86858bd…当前生效 = XorBoot
BWINEFI:\EFI\Microsoft\Boot\bootmgfw.efi.bak2,830,632—原 Windows 引导备份
BWINEFI:\EFI\Microsoft\Boot\bootmgfw_win10.efi2,830,632282f826e…原 Windows 引导(供 XorBoot 菜单调用)
BWINEFI:\EFI\xorboot\xorboot.efi1,901,056d86858bd…与 bootmgfw.efi 同一份
BWINEFI:\EFI\xorboot\xorboot.xor93,696—菜单配置

判定证据:efibootmgr 里 BootCurrent = 0003(固件确实启动的是 Windows 项)、BootOrder 里 Windows 仍在首位——但实际进来的是 NixOS。哈希对比确认 bootmgfw.efi 与备份的 bootmgfw_xor.efi 完全相同。

两层引导的分工(认知要点)

层谁在管作用
第一层 XorBoot占住固件的 Windows 项选 OS:NixOS(默认)/ Windows
第二层 systemd-boot盘1 的 NIPXESP选 NixOS 世代(记录完整保留)
固件层厂商变量已降级为「启动 XorBoot 的通道」,排序不再重要

维护与风险

  1. Windows 大版本更新会覆盖 bootmgfw.efi ⇒ XorBoot 会消失、恢复 Windows 直接启动。重做一次「替换」即可。
  2. 必须关闭 Secure Boot(XorBoot 未签名)。
  3. NixOS rebuild 仍会改 BootOrder(把自己的项排前)⇒ 那一次重启会跳过 XorBoot 直接进 systemd-boot(能进 NixOS,但当次选不了 Windows);下次开机固件又改回 Windows 第一,XorBoot 恢复。可接受,但知道就好。
  4. 盘2 僚机(BC711-NixOS)不在 XorBoot 菜单里 ⇒ 要进僚机得从固件菜单(F7/Esc)选 BC711-NixOS 或 UEFI OS;或在 XorBoot 里补一项指向盘2 的 \EFI\systemd\systemd-bootx64.efi。
  5. 恢复原状: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 项可以移除;已无必要。