Linux + Windows 双系统:阻止烦人的 Windows Boot Manager 覆盖第一启动项

文章介绍了一种应对“Windows Boot Manager”反复被固件设为首启动项的方法:利用 UEFI 会自动识别 `EFI/Microsoft/Boot/bootmgfw.efi` 的特性,先备份原始 Windows 引导文件,再将 grub 的 EFI 文件复制并改名为 `bootmgfw.efi`,使系统实际先进入 grub。随后在 Linux 中修改 grub 配置,把 Windows 的链式引导目标改为备份后的原始 EFI 文件。这样即使 Windows Boot Manager 仍排第一,也会先进入 grub,再正常启动 Windows 或 Linux。

原理

UEFI 固件和 Windows 都认这个文件:

EFI/Microsoft/Boot/bootmgfw.efi

很多时候它们并不是“记住了某个旧启动项”,而是每次开机扫描到这个文件后,又重新创建了一个 Windows Boot Manager

既然它非要启动这个文件,那思路就很简单:

  • 先把原本的 Windows 引导文件备份
  • 再把 grub 的 EFI 文件复制过来
  • 并重命名成 Windows 原本那个 EFI 文件名

这样以后就算 Windows Boot Manager 继续排第一,它实际启动的也是 grub。
然后再在 grub 里把 Windows 的链式引导路径改成刚才备份出来的原始 Windows EFI 文件,就能正常进入 Windows。


操作步骤

1)进入 PE,挂载 EFI 分区

进入 PE 后,挂载 EFI 分区,进入目录:

EFI/Microsoft/Boot/

找到 Windows 原本的启动文件:

bootmgfw.efi

先把它备份一份,改个名字保存。
例如我这里改成:

bootmgfw.efi.bak

然后把 grub 对应的 EFI 文件 复制到这个目录,并重命名为:

bootmgfw.efi

也就是让 grub 顶替原来的 Windows Boot Manager。


2)此时直接启动 Windows Boot Manager,会进入 grub

做到这一步后,启动项里不管是:

  • Windows Boot Manager
  • 还是原本的 Linux 启动项

都会进 grub。

这时候先别慌,说明替换已经生效了。
只是由于 grub 里原先记录的 Windows 引导目标还是旧文件名,所以此时从 grub 选 Windows 还进不去。

接下来进入 Linux 修一下 grub 配置。


3)进入 Linux,修改 grub.cfg 里的 Windows 引导路径

进入 Linux 后,找到 grub 配置文件,一般是这个位置:

/boot/grub/grub.cfg

然后找到 Windows 对应的菜单项,把原本指向:

bootmgfw.efi

的地方,改成你刚刚备份后的文件名,例如:

bootmgfw.efi.bak

保存退出。


4)完成

这样处理完以后:

  • 主板/固件如果继续把 Windows Boot Manager 放到第一位
    → 实际会先进 grub
  • grub 中的 Windows 菜单项
    → 再去链式引导真正的 bootmgfw.efi.bak
  • 最终 Linux 和 Windows 都能正常启动

也就是说,Windows Boot Manager 以后就算继续“抢第一”,也只是帮你先进 grub 而已。

enjoy it😍.