UEFI 启动损坏,如何安全地继续?

UEFI 启动损坏,如何安全地继续?

我有一台笔记本电脑,可以双启动 Windows 10(从 Windows 8.1 升级)和我的主要操作系统 Ubuntu 14.04。我已将系统配置为 UEFI 启动,直到今天早上,它一直运行良好。

昨晚我用 Windows 做了一些事情,这在这台机器上很少见。今天早上,电脑启动时直接进入 Windows。我怀疑 Windows 弄乱了启动设置,所以我在启动时使用“escape”手动选择安装了 grub 的驱动器。

计算机在启动时首先检查的默认 grub/boot 分区现在直接指向启动 Windows——没有 grub 菜单。幸运的是,我在初始安装期间使用了启动修复,并选择了让其他分区的第一个扇区指向 grub/boot 分区的选项。当我选择根分区时,我收到来自 BIOS 的通知,说它不安全。

在我考虑清楚之前,我进入 BIOS 并禁用安全启动,然后尝试从根分区启动。GRUB 启动正常,所以我选择了 Ubuntu,然后进入我的 LUKS 密码屏幕。

此时,我认为禁用安全启动并尝试加载 Ubuntu 可能是一个错误。毕竟,如果一旦有东西干扰了完全正常且正常运行的签名启动加载程序,UEFI 就被禁用了,那还有什么意义呢?

我有点不知道安全操作的正确方法是什么。有没有办法恢复 Ubuntu 而不进行不安全的启动?有什么建议吗?

-谢谢

答案1

在更直接地回答您的主要观点之前,我想先解决您问题中的一些误解。请耐心等待……

计算机启动时首先检查的默认 grub/boot 分区现在直接指向启动 Windows

在基于 EFI 的计算机上,引导加载程序作为普通文件存储在EFI 系统分区 (ESP)。由于 NVRAM 中存储了条目,计算机知道在启动时要启动哪些文件,这些条目标识了要运行的分区和文件。EFI 下没有“默认...启动分区”之类的东西;这是 BIOS 启动的方式,而不是 EFI 启动的方式。

我在初始安装期间使用了启动修复,并选择了让其他分区的第一个扇区指向 grub/boot 分区的选项。

在 EFI 下,“引导扇区”不存在——或者更准确地说,引导代码不存储在磁盘或分区的第一个扇区中。它全部通过文件处理并由 NVRAM 中的条目引用。

当我选择根分区时,我收到 BIOS 的通知,说它不安全。

您没有选择分区;您选择了一个引导加载程序文件。根据您的描述,我猜您选择了EFI/ubuntu/grubx64.efiESP。这开始引起问题,但我将回到这一点……

我进入了 BIOS

您没有 BIOS,您有 EFI。我知道很多人,甚至制造商,都将 EFI 称为 BIOS,但这只会导致混淆,因为它鼓励人们将 BIOS 假设拖入启动过程,就像您所做的那样。

我认为禁用安全启动并尝试加载 Ubuntu 可能是一个错误。毕竟,如果一旦有东西干扰了完全正常且正常运行的签名启动加载程序,UEFI 就被禁用了,那还有什么意义呢?

不要混淆 EFI(或 UEFI,即 EFI 2.x)和安全启动。安全启动只是 UEFI 的一个可选功能。而 EFI 则是替代品用于 BIOS。许多 EFI(甚至 UEFI)缺乏安全启动支持——但安全启动需要 UEFI。

我有点不知道安全操作的正确方法是什么。有没有办法恢复 Ubuntu 而不进行不安全的启动?有什么建议吗?

为了支持安全启动,Ubuntu 使用一个名为 Shim 的程序。在 Ubuntu 中,它的文件名为shimx64.efi。Shim 被硬编码为启动 GRUB ( grubx64.efi),然后可以调用 Shim 来验证 Linux 内核。

请注意,我之前写过,您可能启动了grubx64.efi。在禁用安全启动的情况下,这将正常工作;但是,如果您启用安全启动,则可能不会grubx64.efi满足默认的安全启动要求,因此它将失败。shimx64.efi另一方面,由 Microsoft 签名(其密钥存在于几乎所有计算机中),因此可以工作。这是解决方案的关键(双关语不是我想要的,但它是最好的词):重新配置您的系统以通过 Shim 启动。您可以使用实用程序在 Ubuntu 中执行此操作efibootmgr。首先,使用 查看可用选项sudo efibootmgr -v

$ sudo efibootmgr -v
BootCurrent: 0000
Timeout: 0 seconds
BootOrder: 0000,0007,0003,2003,0001,2001,2002
Boot0000* ubuntu    HD(2,1f4800,82000,5f6b4992-fcfe-4a2c-9e67-98b0a30dfe7d)File(\EFI\ubuntu\shimx64.efi)
Boot0001* Lenovo Recovery System    HD(3,276800,1f4000,de3b7563-97f5-48c6-ab7f-2f5d6d57c644)File(\EFI\Microsoft\Boot\LrsBootMgr.efi)RC
Boot0002* EFI Network 0 for IPv4 (08-9E-01-FF-CA-4D)    ACPI(a0341d0,0)PCI(1c,0)PCI(0,0)MAC(089e01ffca4d,0)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0RC
Boot0003* ubuntu    HD(2,1f4800,82000,5f6b4992-fcfe-4a2c-9e67-98b0a30dfe7d)File(\EFI\ubuntu\grubx64.efi)RC
Boot0004* EFI Network 0 for IPv6 (08-9E-01-FF-CA-4D)    ACPI(a0341d0,0)PCI(1c,0)PCI(0,0)MAC(089e01ffca4d,0)030d3c000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000RC
Boot0007* Windows Boot Manager  HD(2,1f4800,82000,5f6b4992-fcfe-4a2c-9e67-98b0a30dfe7d)File(\EFI\Microsoft\Boot\bootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}....................

这只是一个例子,您的示例可能在重要方面有所不同。但请注意,有两个ubuntu条目,其中一个引用shimx64.efi,另一个引用grubx64.efi。您可能通过条目进行引导grubx64.efi,如行中所示BootCurrentgrubx64.efi条目也可能是行中的第一个BootOrder。要更改此设置,您必须BootOrder使用 选项创建一个新的-o条目efibootmgr,如下所示:

sudo efibootmgr -o 0000,0007

您还可以添加其他选项,如果前两个选项失败,计算机将使用这些选项。当然,您应该指定与 Shim 和 GRUB 条目相关的数字,而不是0000,0007(除非这些数字恰好是数字)。还请注意,我首先指定了 Shim 条目,然后指定 GRUB 条目作为后备,以防其中一个条目失败;理论上,指定仅有的Shim 条目应该可以正常工作。最好将当前BootCurrent值作为第二个(或更后面的)选项,因为您知道它在禁用安全启动的情况下也可以工作。这样,如果您犯了错误或者 Shim 二进制文件损坏,您仍然应该能够禁用安全启动并通过使用计算机的内置启动管理器或通过其他方式调整启动顺序来返回到您的工作系统。

完成此操作后,重新启动固件并重新启用安全启动。它应该从那时起就可以正常工作。

相关内容