启动时调试 Grub2 甚至无法到达 grub shell

启动时调试 Grub2 甚至无法到达 grub shell

我在 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 获取恢复控制台的步骤:

  1. 启动您的 Live 磁盘
  2. root如果尚未完成则切换到( sudo -i、 或su -
  3. 找到您的根/分区并将其挂载到/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
    
  4. 为您的系统安装任何其他分区。请记住,您现在可以通过阅读/mnt/etc/fstab来提醒您这些是什么。如果您使用 UEFI,则必须安装 EFI 分区。例如:

    mount /dev/sda6 /mnt/boot
    mount /dev/sda2 /mnt/boot/efi
    
  5. 使用内核提供的共享修补您安装的系统:

    mount --bind /proc /mnt/proc
    mount --bind /sys /mnt/sys
    mount --bind /dev /mnt/dev
    mount --bind /tmp /mnt/tmp
    
  6. chroot进入你的新环境:

    chroot /mnt /bin/bash
    

此过程将带您进入完全基于您已安装的系统的工作控制台。所以像update-grub和 这样的命令grub-install应该正常工作。您当然/etc/grub.d也可以进行编辑。

相关内容