更新 NVRAM,以便在 Debian 系统上运行 shimx64.efi 而不是 grubx64.efi,以实现安全启动

更新 NVRAM,以便在 Debian 系统上运行 shimx64.efi 而不是 grubx64.efi,以实现安全启动

我想将我的 Debian 配置为在启用安全启动的情况下启动,但事实并非如此,原因如下...


操作系统特定的引导加载程序存储在ESP安装在的分区上/boot/efi

Debian 系统有它自己的子目录,debian以下是该文件夹的内容:

sudo ls /boot/efi/EFI/debian

命令的输出是:

BOOTX64.CSV  fbx64.efi  grub.cfg  grubx64.efi  mmx64.efi  shimx64.efi

根据我的理解,为了使 Debian 启动时启用安全启动,EFI 应该执行,shimx64.efi而 EFI 又会执行grubx64.efi(当前正在执行启动加载程序)

那是对的吗?如果没有请纠正我。

我确实通过发出以下命令调查了为什么我的 Debian 无法使用安全启动:

efibootmgr -v

这是上述命令的输出(请向右滚动)

BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001
Boot0001* debian        HD(1,GPT,4cc75323-a915-4249-9c01-e553cf705ad4,0x800,0x100000)/File(\EFI\debian\grubx64.efi)..BO

此输出代表启动条目(存储在 中NVRAM),目前只有一个执行GRUB名为 的启动管理器grubx64.efi

据此,很明显 EFIgrubx64.efi直接执行而不是执行shimx64.efi,这一定是安全启动不适用于我的 Debian 系统的原因。

我的问题是,如何编辑此启动项以便执行它shimx64.efi,以及这是否会使 Debian 在启用安全启动的情况下工作而不会使系统无法启动?

您能否另外告诉我们为什么没有shimx64.efi设置为NVRAM而不是grubx64.efi使安全启动开箱即用。

这很奇怪,因为许多人报告说安全启动可以开箱即用。


有关更多信息,我使用的是 Debian 12,它是全新安装的,没有任何会干扰安全启动的自定义或专有驱动程序。

编辑:

我已发出以下命令来添加新条目:

sudo efibootmgr -c -d /dev/sdb -p 1 -L DebianShim -l \\EFI\\debian\\shimx64.efi

现在会产生两个条目:

sudo efibootmgr -v

输出:

BootCurrent: 0001
Timeout: 5 seconds
BootOrder: 0000,0001
Boot0000* DebianShim    HD(1,GPT,4cc75323-a915-4249-9c01-e553cf705ad4,0x800,0x100000)/File(\EFI\debian\shimx64.efi)
Boot0001* debian        HD(1,GPT,4cc75323-a915-4249-9c01-e553cf705ad4,0x800,0x100000)/File(\EFI\debian\grubx64.efi)..BO

当然,我确保通过更改顺序来激活我的新条目:

sudo efibootmgr -b 0001 -o 0000

不管怎样,问题是重新启动后我的新条目没有保留,它消失了。
这是具有相同问题的相关问题:
https://superuser.com/questions/1166398/efi-settings-set-via-efibootmgr-are-ignored-after-reboot

我还尝试删除原始引导条目并添加新条目,但它会恢复到旧条目,即执行的条目grubx64.efi

谷歌的进一步研究表明,这可能是MSI主板的一个错误,即它们的固件。

但值得注意的是,设置一些其他选项(例如超时)效果也很好。

答案1

问题

如果我没看错的话,听起来好像 EFI 启动管理器没有更新 NVRAM 中的变量。我这样说是因为我有同样的问题,并且“解决它”需要一些时间,我将尝试解释这一点。问题是,如果不直接访问 UEFI 固件,EFI 变量将以只读权限加载

解决方案

正如您所说,我假设您有一个 MSI 品牌主板,上面安装了 LiveUpdate 固件版本(与我拥有的主板品牌相同,但也有错误的 UEFI 固件)。如果没有,请注意无论制造商如何,此过程都将有效,因为它通过 UEFI Shell 访问 NVRAM。无需使用操作系统。

脚步:

  1. 将 USB 记忆棒(大小至少 8GB)格式化为 FAT32
  2. 从 Roderick Smith 的 Great EFI Bootloader 下载 ISO 映像/CD-R 映像:获取 rEFInd。我已经链接到下载页面,以防您想研究引导加载程序(这样做的原因是为了防止先有鸡还是先有蛋的问题 - 您必须至少有一个 shell 才能访问 shell。此磁盘映像已包含一个原始的 EFI 外壳)。
    • 如果您只想有一个可启动的 shell,您可以从此 Github 存储库下载更新的预编译二进制文件:UEFI外壳
  3. 使用 Rufus 或其他映像创建工具(如dd将 CD-R 映像写入 USB)。
  4. 使用新创建的 USB 设备重新启动您的电脑。
    • 如果您选择 CD-R 方法,请使用箭头键并按向右箭头,直到突出显示 UEFI shell,然后按Enter
    • 如果您仅选择 Shell 方法,系统应立即启动并直接进入 shell。

下一步

您现在应该处于 UEFI shell 中,并且能够直接修改变量和值。请执行下列操作:

  1. 查看已有的内容:bcfg boot dump
  2. 确定需要更新的 EFI 分区的位置:dir fsX:其中 X 是从 0 开始到磁盘计数减 1 结束的磁盘编号。我们正在查找目录所在的磁盘EFI,即fs0:\EFI
  3. 继续列出 EFI 中嵌套的目录,直到找到要添加的 Shim.efi 文件的位置。我相信你的情况,这将是:fsX:\EFI\debian\shimx64.efi
  4. 获取步骤 3 的结果,并发出以下命令:cfg boot add 0 <location from step 3> DebianShim

DebianShim 实际上可以是任何东西,因为这是引导加载程序用来显示条目的文本。我相信 0 可以是 0 到 9 之间的任何数字。这是启动顺序,因此 0 将位于顶部。

边注:我相信要完成此更改,您必须启动 LiveUpdate 设置实用程序并关闭 CSM,前提是您的 Windows 版本是在 UEFI 模式下安装的。


来源

使用 rEFInd 和 Rufus 恢复 EFI NVRAM 启动项- 这是我第一次用来解决这个问题的链接。忽略评论回复:灾难就像efibootmanager你所使用的那样。

相关内容