我在 uefi grub2 启动时遇到问题,这意味着系统甚至无法访问 grub 控制台,更不用说 Linux 了。
相反,它会循环执行引导过程。
虽然我通过从类似操作系统复制 uefi 分区并修改 grub.cfg 设法“修复”了该问题,但我仍然想知道如何调试此类问题。
当您甚至无法到达控制台时,我没有看到任何有关调试 grub 的信息,也找不到有关除 grub.cfg 文件之外的任何文件中的内容的任何信息。
我看过很多描述存在哪些文件的信息,但没有看到有关文件内容在 grub 安装之间是否有所不同的信息。
我是否应该认为这是一个 grub 调试问题?这更多的是uefi调试问题吗?
需要明确的是,这个问题是关于诊断分析问题的方法,而不是尝试一系列候选解决方案。该网站上有丰富的信息。
答案1
不同的 Linux 发行版以不同的方式使用 GRUB2 和 UEFI:Debian/Ubuntu 似乎在 EFI 系统分区(简称 ESP)中设置了一个 mini,grub.cfg
它只是将 GRUB2 指向/boot
不同文件系统上 ie 中的实际配置文件。 RedHat 似乎将实际的 GRUB 配置放入了 ESP 中。
实际文件的内容grubx64.efi
也可能因发行版而异,因为它是使用grub-mkimage
.这包括:
- GRUB 核心映像
- 许多 GRUB 模块:至少是访问存储其他 GRUB 模块的文件系统(通常
/boot/grub/x86_64-efi
在 Debian 上)所需的模块,但在 UEFI 系统上,可以将所有模块包含到grubx64.efi
文件中。 - 有关初始 GRUB 根文件系统的信息
prefix
(即 GRUB 查找 GRUB 模块目录和配置文件的位置)。在 UEFI GRUB 上,这通常是/EFI/<name of distribution>
指 ESP GRUB 安装到的目录。 - 可选的嵌入式 GRUB 配置文件
- 可选,memdisk 映像文件
- 可选的,用于检查 GRUB 模块和其他文件上的签名的公钥/证书文件(用于在没有可用安全引导功能的系统上实施类似安全引导的检查)
GRUB 的模块化是其起源于具有 MBR 式引导的 PC 的结果,这要求 GRUB 适合 MBR 和第一个分区开头之间未使用的空间。根据分区的不同,该空间可能会非常小。在 UEFI 中,大小限制远没有那么严格,但如果需要,模块机制仍然可用。
安全启动将阻止 GRUB 从未正确签名并使用 Windows PE32 二进制格式的文件加载可执行代码。 GRUB模块使用Unix风格的ELF二进制格式,因此当使用Secure Boot时,所有需要的模块都需要打包到主文件中,grubx64.efi
这样就不需要加载单独的可执行模块。 Linux 内核可以有一个内置的 EFI 存根,使其实际上成为一个 PE32 二进制文件,因此在正确签名时不会出现此问题。
安全启动 shim 引导加载程序shimx64.efi
由 Microsoft 签名,因此默认情况下基本上所有安全启动实现都可以接受它,并且在加载时,它将向安全启动允许列表中添加一两个以上的公钥:发行版的密钥,以及可选的为系统所有者生成的 MOK 密钥。这将允许使用 Linux 和定制内核,即使系统供应商不会将 Linux 发行版的公钥包含到其安全启动实现中,并且固件不允许用户编辑基于固件的允许安全启动密钥列表。
(填充程序不得接受完全未签名的二进制文件来执行,否则它将成为“安全启动规避设备”,并且 Microsoft 和任何其他安全启动签名者应拒绝对其进行签名。)
如果您尝试使用没有有效安全启动签名的引导加载程序,某些安全启动系统将停止启动过程并显示警告消息。其他人只会忽略无效的引导加载程序并继续执行下一个引导选项。如果您的系统启用了安全启动并且没有其他有效的启动源,则这可能是您所看到的循环的原因:您可能正在尝试加载适用于禁用了安全启动的 UEFI 的 GRUB 版本。
如果不知道您正在使用的 Linux 发行版的名称和版本,以及您的系统或主板的品牌和型号,就很难给出更详细的答案。
答案2
这个问题询问了一整类问题,您无法启动系统来修复它。如何修复甚至无法访问控制台的系统的问题始终是相同的: 使用其他系统。
这可能意味着将您的硬盘插入另一台机器,但我不建议这样做。首先,这可能意味着用螺丝刀使您的保修失效,但其次,它可能不起作用;它可能隐藏了问题的根本原因。
那么您的选择是在同一硬件上启动不同的操作系统。这可以通过 Live CD 或 Live USB 来完成。
您使用哪种发行版并不重要,但实际的操作系统(内核)和体系结构必须至少来自同一系列。例如:不要尝试用 Linux 系统修复 BSD 系统,或者用 x86 系统修复 x86_64 系统。
不过,您使用哪种发行版通常并不重要。例如:如果您正在尝试修复 Centos 机器,而您只有一个 Ubuntu USB,那么没关系。
对于 Linux,Ubuntu 实际上是一个不错的选择,因为您只需使用它的安装磁盘并选择“尝试 Ubuntu”选项即可。它为大多数机器提供了足够的驱动程序。但还有其他选择。
通过 Linux 获取恢复控制台的步骤:
- 启动您的 Live 磁盘
root
如果尚未完成则切换到(sudo -i
、 或su -
)找到您的根
/
分区并将其挂载到/mnt
.该blkid
命令可以帮助您确定要安装的内容。例如:blkid /dev/sda7: LABEL="Ubuntu_Boot" UUID="737d31ca-d399-4baa-a9e4-ec907b95f5ca" TYPE="ext4" PARTUUID="c3af19e0-e7d2-4867-b750-2b723208c535" /dev/sda2: UUID="F6C4-4D7F" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="8663827c-80b4-4653-9df8-7ff56eebe6e2" /dev/sda6: LABEL="Ubuntu_Boot" UUID="3f91876b-7b58-428d-9249-756a62f8f839" TYPE="ext4" PARTLABEL="Ubuntu_Boot" PARTUUID="2ae7eab6-e068-4bc8-a4a3-fbd386fc8099" mount /dev/sda7 /mnt
为您的系统安装任何其他分区。请记住,您现在可以通过阅读
/mnt/etc/fstab
来提醒您这些是什么。如果您使用 UEFI,则必须安装 EFI 分区。例如:mount /dev/sda6 /mnt/boot mount /dev/sda2 /mnt/boot/efi
使用内核提供的共享修补您安装的系统:
mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys mount --bind /dev /mnt/dev mount --bind /tmp /mnt/tmp
chroot
进入你的新环境:chroot /mnt /bin/bash
此过程将带您进入完全基于您已安装的系统的工作控制台。所以像update-grub
和 这样的命令grub-install
应该正常工作。您当然/etc/grub.d
也可以进行编辑。