我需要重新安装grub
(以解决引导孔安全问题)。我不想犯错误,并且因为我不太习惯grub
,我问自己是否有办法找到grub-install
用于grub
在机器上安装当前版本的命令。
感谢您的帮助。
环境:Grub 2、Manjaro (Arch linux)、EFI 引导
答案1
以 root 身份运行efibootmgr -v
。第一行是BootCurrent: NNNN
NNNN 是一个十六进制四位数字。
找到相应的“BootNNNN”行。它看起来类似于:
BootNNNN* Manjaro HD(X,GPT,11111111-2222-3333-4444-555555555555,0x800,0x82000)/File(\...\something.efi)
NNNN
是第一行的数字,Manjaro
是人类可读的启动项描述字符串(可以是任何内容),X
是 UEFI 固件检测到的磁盘顺序的编号,11111111-2222-3333-4444-555555555555
是引导加载程序安装到的 EFI 系统分区的 PARTUUID,- 是
\...\something.efi
EFI 系统分区上的 Windows 样式路径名,用于标识要使用的引导加载程序文件。对于 GRUB + Secure Boot,它通常shimx64.efi
或类似的东西指的是 Secure Boot shim 引导加载程序,然后它将加载同一目录中shim.efi
指定的文件。grubx64.efi
EFI 系统分区可能安装为/boot/efi
、 或/boot
,或者根本不安装;不同的发行版在这里做的事情不同。如果它安装在/boot/efi
,运行ls -l /boot/efi/EFI/BOOT/BOOTX64.efi
并比较该文件的长度与由 : 标识的引导加载程序路径中的文件的长度:efibootmgr -v
如果它们匹配,您就会知道您可能也应该更新后备引导加载程序。 (记住这一点——稍后会详细介绍。)
一旦知道了 PARTUUID,您就能够使用blkid
或lsblk -o +PARTUUID
识别 EFI 系统分区(简称 ESP)对应的 Linux 设备名称。现在您将拥有重建命令所需的所有部分grub-install
。
然而,使用安全启动时,注册到系统 NVRAM 的第一个“启动加载程序”实际上是安全启动垫片,而不是 GRUB。你不想改变这个事实。
因此,您可能希望使用该--no-nvram
选项来避免更改 NVRAM 引导变量。因此,重新安装 GRUB 的命令应该是:
grub-install --no-nvram /dev/<the disk device corresponding to your ESP partition>
如果 GRUB 当前也安装到\EFI\BOOT\BOOTX64.efi
ESP 上的后备引导加载程序路径中,您需要将该--force-extra-removable
选项添加到grub-install
命令中,因此它也会更新该选项。
请注意,如果您使用安全启动 shim 引导加载程序,则更新 ESP 上的 shim 也很重要。在重新引导系统之前,请验证 GRUB 和 ESP 上的填充程序是否具有足够新的时间戳。 2020年7月28日之后的任何事情都应该是好的。如果 shim 软件包不会自动更新 ESP 上的 shim 文件,您可以在软件包安装过程放置的任何位置找到更新的 shim,并将其复制到 ESP 上的旧 shim 上。
使用安全启动和 GRUB,ESP 的典型布局将如下所示:
<ESP mountpoint>/EFI/<name of distro>/grubx64.efi
= 实际的 GRUB<ESP mountpoint>/EFI/<name of distro>/shimx64.efi
= 安全启动垫片<ESP mountpoint>/EFI/BOOT/BOOTX64.efi
= 垫片的后备启动副本<ESP mountpoint>/EFI/BOOT/grubx64.efi
= GRUB 的后备引导副本
组件的路径<name of distro>
通常被认为是主引导加载程序,但如果系统因任何原因“忘记”NVRAM 设置,例如 UEFI 固件更新重置所有固件设置(又名“BIOS”),后备副本将非常有用。设置”)恢复为出厂默认值。
答案2
您不需要重新安装 GRUB 来修复此漏洞。只需更新软件包就足够了。如果 GRUB 是唯一的引导加载程序,您可能想要更新/boot/efi/EFI/Boot/BOOTX64.EFI
- grub-install 不会这样做。
也grub-install
适用于旧式 MBR 系统,在启用 UEFI 的设备上实际上不再需要它。
为了更加确定,请检查 /boot/efi/EFI 中 grub 文件的日期。由于我不确定文件安装在哪里,请运行此命令并发布其输出
find /boot \( -iname grubx64.efi -o -iname 'shim*.efi' \) -exec ls -l '{}' \;