重启后,通过 efibootmgr 设置的 EFI 设置在被忽略

重启后,通过 efibootmgr 设置的 EFI 设置在被忽略

我在 UEFI 笔记本电脑上有 2 个磁盘 (/dev/sda 和 /dev/sdb)。 都是 GPT。

sda1 - NTFS  - Windows,
sda2 - FAT32 - EFI partition where is Windows Boot Manager and GRUB

sdb1 - NTFS  - another windows 
sdb2 - NTFS  - My data
sdb3 - FAT32 - EFI partition
sdb4 - EXT4  - Debian

按照 EFI 顺序,我可以看到 Windows 启动管理器和 GRUB。我可以在它们之间切换,这样就可以正常工作了。我考虑使用 syslinux 来启动 debian。我想在 sdb3 上安装 syslinux,我将其挂载并将这些文件复制到此分区的以下位置:

/EFI/SYSLINUX/initrd.img
/EFI/SYSLINUX/ldlinux.e64
/EFI/SYSLINUX/syslinux.cfg
/EFI/SYSLINUX/syslinux.efi
/EFI/SYSLINUX/vmlinuz

维姆林兹初始化文件我从 sdb4\boot 复制并重命名。系统Linux系统启动ldlinux.e64我从 syslinux-6.03.tar.gz 下载的http://kernel.org系统Linux配置文件我写的,内容是

PROMPT 0
TIMEOUT 300
DEFAULT deb

LABEL deb
    LINUX vmlinuz
    APPEND ROOT=/dev/sdb4
    INITRD initrd.img

然后我通过命令将记录添加到 EFI

efibootmgr -c -d /dev/sdb3 -p 1 -l \\EFI\\SYSLINUX\\syslinux.efi -L "SYSLINUX2"

efiboot 管理器响应成功并显示 SYSLINUX2 作为启动选项,但当我重新启动计算机(通过重新启动命令)并转到 UEFI 设置时,没有添加 SYSLINUX2 选项。只有 GRUB 和 Windows 启动管理器。下次启动到 debian 后,efibootmgr 也只响应 Windows 启动管理器和 GRUB。

我读到过有人在使用安全启动时遇到问题。我已禁用它,但 GRUB 不会出现此问题。

哪里出了问题?如何使 efibootmgr 设置持久?我在哪里犯了错误(如果有的话)?

答案1

您看到的是一个错误,而且几乎肯定与安全启动无关。我有几个建议,但没有一个能保证解决问题:

  • 更新固件-- 如果错误出在固件中,更新固件可能会解决问题。请咨询计算机(或主板)制造商以查找更新。(它们可能被称为“BIOS 更新”,尽管从技术上讲您的固件不是 BIOS。)更新后,重新启动进入 Linux 并重试。
  • 将固件重置为默认设置-- 有时 EFI 启动管理器列表会损坏,导致您描述的症状。在设置实用程序中将所有固件设置重置为默认值可能会解决此问题。不幸的是,此步骤将删除所有有效的启动管理器条目,因此您可能需要使用紧急工具(例如我的rEFInd 启动管理器在 USB 驱动器或 CD-R 上)进行启动,直到您重新创建工作条目。
  • 删除未使用的启动管理器条目-- 删除未使用的启动管理器条目(使用 选项-Befibootmgr也可以解决损坏的条目。尝试efibootmgr单独或efibootmgr -v更详细的输出来查找重复或不需要的条目。(请注意,固件可能会在您重新启动时自动重新创建一些条目。例如,这可能发生在网络启动选项或启动外部媒体的选项中。)
  • 使用其他工具创建启动项-- 有时efibootmgr不起作用,但另一个操作系统中的工具(如bcdedit简易UEFI在 Windows 中)或bcfgEFI shell 中的工具就可以完成这项工作。因此,您可以尝试使用这些工具来代替efibootmgr
  • 使用后备文件名EFI/BOOT/bootx64.efi--如果其他方法都不起作用,则可以使用后备文件名(在 x86-64 系统上);但是,此文件名通常是计算机尝试启动的最后一个文件名。因此,如果它已经通过其他名称启动(例如 Windows 引导加载EFI/Microsoft/Boot/bootmgfw.efi程序),则可能需要备份它,将所需的引导管理器/加载程序重命名为当前正在启动的默认启动管理器/加载程序,并重新配置新的引导加载程序以提供使用新名称伪装的引导加载程序。这充其量只是一种杂耍,并且并非所有 Linux 的 EFI 引导加载程序都可以链式加载到另一个 EFI 程序,因此它可能无法正常工作。(我不记得 SYSLINUX 是否可以链式加载另一个 EFI 程序。)
  • 切换到 BIOS/CSM/传统启动-- 大多数 EFI 都提供兼容性支持模块 (CSM),这使它们能够启动 BIOS 模式的引导加载程序。因此,您可以为 Linux 安装 BIOS 模式的引导加载程序,激活 CSM,然后以此方式启动。但是,如果您要双启动另一个操作系统,则需要安装它是BIOS 模式引导加载程序也是如此,这可能需要从 GPT 更改为 MBR 分区。总体而言,这种方法可能有点麻烦;但在某些 EFI(主要是 2011 年左右的旧版本)上,它可能是最好的方法。
  • 退回电脑,获得退款-- 如果所有其他方法都失败了,并且计算机处于商店退货期限内,您可以将其退回以换取一台可以正常工作的计算机。事实上,如果可能的话,我建议在前两种方法之前先采用这种方法。如果您这样做,请务必联系制造商,告诉他们您退回计算机的原因。EFI 从第一天起就存在严重的错误,而一些制造商一直没有及时修复它们,部分原因是他们的客户从不抱怨,所以制造商没有意识到这些错误的严重性。

答案2

和原帖一样,我在使用时看到了旧的、无效的条目efibootmgr。我尝试使用该-B选项删除它们,似乎有效,但重新启动后,旧列表又回来了,我的更改丢失了。

对于我来说,在 Thinkpad 上,解决方案是进入 BIOS 设置,并在 Boot 选项卡上将“Boot Order Lock”设置为已禁用。 几时已启用您无法修改启动项。希望这能帮助其他人!

答案3

更新:

大家好,我又来了,

开始再次对其进行处理,现在已通过将 .efi 文件重命名为 Windows 等效文件 (bootmgfw.efi) 进行修复,然后按照上述说明重新安装 efivar 文件系统 efivarfs,然后通过键入以下内容在 VRAM 中设置 uefi 启动项

efibootmgr -c -d /dev/sda -p 4 -L "linuxmint_grub" -l "\EFI\linuxmint_grub\bootmgfw.efi"

将 ESP 放在 /dev/sda,分区 4 上。

没有哪个启动是完美无缺的,efibootmgr 条目一直存在,唯一的缺点是:GRUB 会在启动时自动启动,尽管它已经关闭。这似乎是 GRUB 的问题,稍后会修复。

欢呼并希望我能提供帮助 ;)

答案4

我遇到了同样的问题,尝试在 Intel NUC7I5BBNK 和 LinuxMint 18.3 下创建 efi 启动项,并将 ESP 安装在 /boot 上。Efibootmgr 成功且持久地创建了条目,但是它无法访问,未显示在 EFI 可视启动菜单下,并且 Intel BIOS 中自动显示的启动条目仅显示“未检测到有效的启动分区”。此外,我发现无论我多么频繁地更正启动顺序,它都不是持久的,我将尝试使用

mount -o remount,rw -t efivarfs efivarfs /sys/firmware/efi/efivars

尽管它已经安装为“rw”,如下图所示

mount | grep efivars

然后重试。(有关进一步建议,请参阅https://wiki.gentoo.org/wiki/Efibootmgr)。

无法从 UEFI 可视化 bios 菜单直接选择 efi 变量,我可以从构建的文件探索中直观地看到它,但无法选择它。

另一个选项是.efi-Variables在安全启动模式下安装,这不是我最喜欢的。也许这更适合我的 UEFI 实现。所有安装都需要自定义调整!

其次,尝试在 ASUS V3-371-KT51 笔记本电脑上使用 efibootmgr 安装 EFI 条目,完全不起作用 --> 这确实表明它如何依赖于机器和 UEFI 实现。手动从 UEFI 菜单中选择 .efi 文件(有点)有效,但仅限于安全启动模式。

另一篇文章建议的 bcfg 方法仅适用于直接启动,这意味着忽略启动管理器(EFISTUB,据我所知,不要认为这是理所当然的,请自己检查一下,如下所示:https://wiki.archlinux.org/index.php/EFISTUB

顺便说一句:我发现了 3 个错误:

  1. -d代表“磁盘”,而不是“分区”,这意味着如果你的 ESP 位于 /dev/sdb 上,你应该将其更改为“/dev/sdb”

  2. -p代表分区号,在您的情况下为“3”(或“2”,取决于 efibootmgr 和 UEFI 实现的计算方式)

    因此,尝试改变这一点。

  3. 最后但并非最不重要的一点是,我成功启动了 UEFI 闪存驱动器,其中包含所有内核、initrd 文件以及不需要的文件/boot,这与你建议的/boot/EFI/syslinux目录不同。这是通常的做法。

希望这对你有帮助,祝你好运并保重 ;)

相关内容