一年前,作者在更新 Debian 软件包后,笔记本电脑无法启动 Linux 系统,而是反复重启进入 BIOS 设置界面。最近,作者再次遇到此问题,一台运行 Kali Linux 的机器也出现了同样的情况。
**问题分析**
作者花了几个小时分析问题,发现是 GRUB 配置文件的问题。升级 BIOS、手动输入启动命令都无法解决问题。GRUB 显示错误 “bli.mod not found”,以及加载 Debian 12 安装程序的 GRUB 配置文件也会造成 BIOS 重启。
最终发现问题出在新增的“UEFI Firmware Settings”菜单项上,GRUB 配置文件会在显示该菜单前运行 `fwsetup --is-supported` 命令。如果旧版 GRUB 二进制文件遇到该命令,就会重启进入 BIOS 设置。
**代码修改**
GRUB 2.12 及以上版本在 `grub_cmd_fwsetup()` 函数中添加了对 `--is-supported` 参数的检查。2.12 之前的版本没有此检查,遇到该参数会直接重启进入 BIOS。
**根本原因**
Debian 12 安装程序使用的是旧版 GRUB 模块,作者的笔记本也存在旧版模块。`/boot/grub/x86_64-efi/efifwsetup.mod` 文件并非 Debian 包的一部分,而是 `grub-efi-amd64-bin` 包的一部分。由于作者之前安装 Debian 后恢复了旧笔记本的备份,导致该包未安装,旧系统使用 `grub-pc` 包,只安装了 MBR 版本的 GRUB。`grub-install` 识别系统为 EFI,并复制了旧的模块到 `/boot/grub/`,直到 Debian 集成了新的配置更改及 `grub-efi-amd64-bin` 包,作者更新 GRUB 后才出现问题。
**Kali 机器**
作者准备一台 Kali Linux 作为渗透测试盒,也出现了同样的问题。作者检查了 GRUB 安装,发现 `grub-efi-amd64-bin` 包已安装。但 EFI 文件位于单独的分区,而 UEFI 固件仍在启动 Debian 的 `grubx64.efi` 文件,导致 BIOS 重启。通过重命名 Debian 文件夹解决问题。
**总结**
在添加跨多个位置的特性时,必须考虑潜在的副作用,不仅要考虑新特性的影响,还要考虑部分更改造成的影响。GRUB 2 等复杂软件可能存在不同的安装路径和大量软件包,因此更需要注意这个问题。