损坏的 UEFI 启动,如何安全地进行?

1 grub2 dual-boot uefi 14.04 windows-10

我有一台可以双启动 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?建议?

-谢谢

Rod*_*ith 7

在对您的主要观点进行更直接的回答之前,我想先解决您问题中的一些误解。请多多包涵....

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

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

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

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

当我选择根分区时,我收到了来自 BIOS 的通知,指出它不安全。

您没有选择分区;您选择了一个引导加载程序文件。根据您的描述,我猜您是EFI/ubuntu/grubx64.efi在 ESP 上选择的。这开始解决问题,但我会回到那个点......

我进了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,OTOH,由 Microsoft 签名(其密钥几乎存在于所有计算机中),因此可以使用。这是解决方案的关键(双关语,但这是最好的词):重新配置您的系统以通过 Shim 启动。您可以使用该efibootmgr实用程序在 Ubuntu 中执行此操作。首先,使用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.}....................
Run Code Online (Sandbox Code Playgroud)

这只是一个示例,您的示例可能会在很多方面有所不同。但是请注意,有两个ubuntu条目,一个是指,shimx64.efi另一个是指grubx64.efi。很有可能您是通过该grubx64.efi条目启动的,如该BootCurrent行所示。该grubx64.efi条目也可能是第一个上BootOrder线。要更改此设置,您必须BootOrder使用-oto 选项创建一个新的efibootmgr,如下所示:

sudo efibootmgr -o 0000,0007
Run Code Online (Sandbox Code Playgroud)

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

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