GRUB Bootloader 依赖我的可启动闪存驱动器在内部 eMMc 驱动器上查找 Windows 10

GRUB Bootloader 依赖我的可启动闪存驱动器在内部 eMMc 驱动器上查找 Windows 10

对于这个问题的其余部分,您可以假设任何带有“内部”的内容是指我的笔记本电脑的内部 eMMc 驱动器,任何带有“USB”的内容是指我的可启动 USB 闪存驱动器,“Debian”表示 Debian Buster,“Windows”表示 Windows 10.

我将 Windows 安装在内部驱动器上,将 Debian 安装在可启动 USB 闪存驱动器上。我的引导设置是 Grub Bootloader 的优先级高于默认引导加载程序。

我的问题是,每当可启动驱动器未连接时,Grub 显然找不到任何事物并启动命令行界面。连接后,图形界面允许我在 Debian 和 Windows 之间进行选择作为标准。

我在 Stack Exchange 上寻找了一个足够类似的答案,但是请相信我,当我告诉你我还不够好,无法使用我的东西时发现可以解决问题。我引用:

这些都与我的情况无关,因为我连接 USB 记忆棒后,让两个操作系统都能正常运行,我可以ESC键在 CLI Grub 出现之前F9选择我的启动设备(Windows 是唯一可用的)。

我被困住了。理想情况下,我希望当 USB 记忆棒未连接时,我的计算机自动启动到 Windows,或者如果不可能,允许我选择我的启动方法,而不必进行狙击ESC键在 CLI Grub 启动之前。

连接 U 盘时进行 Grub: 连接 USB 记忆棒时执行 Grub 当 U 盘处于 Grub 状态时不是连接的: 未连接 USB 记忆棒时进行 Grub 我使用时的启动选项ESC键F9: 启动选项 “debian”只是再次调出 Grub CLI。

答案1

您似乎有一个基于 UEFI 的系统。 GRUB 和 Windows 引导加载程序都安装在 EFI 系统分区(简称 ESP)中,这是(hd1,1)GRUB 所看到的分区。

Debian 10 的默认 UEFI GRUB 基本上包含主可执行文件中的所有 GRUB 模块grubx64.efi,因此缺少文件系统驱动程序不应成为这里的问题。您的内部 eMMC 具有标准的 Windows 分区:

  • (hd1,1)是 ESP,具有 FAT32 文件系统,大小约为 260M(4k 块大小的磁盘上 FAT32 支持的最小大小)
  • (hd1,2)是“Microsoft Reserve”分区,根本没有格式化,大小约为128M。它的存在是为了允许轻松转换为 Windows 动态磁盘(类似于 Windows 的 Linux LVM)或其他转换。
  • (hd1,3)是您的主 Windows 系统驱动器,具有 NTFS 文件系统。
  • (hd1,4)是另一个具有 NTFS 文件系统的分区,可能是 Windows 恢复分区。

您的所有 Linux 分区都位于外部闪存驱动器上。问题是:默认情况下,Debian 10 仅将一个非常小的 GRUB 配置文件安装到 ESP 中。本质上,它仅通过 UUID 识别包含 Linux 目录的文件系统/boot,并告诉 GRUB 从那里加载其真实配置。显然,当外部闪存驱动器断开连接时,这种情况不会发生。真实的配置文件包含所有启动菜单定义,包括 Windows 的启动菜单定义。没有它们,GRUB 只能显示命令提示符。

您可以通过启动 Linux 并将真实的 GRUB 配置文件复制到 ESP 来修复此问题,如下所示:

mv /boot/efi/EFI/debian/grub.cfg /boot/efi/EFI/debian/grub.cfg.mini
cp /boot/grub/grub.cfg /boot/efi/EFI/debian/grub.cfg

但是,该update-grub命令(Debian 的内核更新包使用!)不会自动更新新位置。幸运的是,该命令只是一个脚本,因此很容易修改。

首先,创建一个导流在包管理系统中,这样任何更新都不会覆盖我们的更改:

dpkg-divert --local --rename --add /usr/sbin/update-grub

这将自动将当前重命名/usr/sbin/update-grub/usr/sbin/update-grub.distrib 并将其未来的任何更新也重定向到新位置

现在,您可以将脚本复制回原始位置,然后使用您喜欢的文本编辑器对其进行修改。

cp -a /usr/sbin/update-grub.distrib /usr/sbin/update-grub

最初,脚本如下所示:

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

您需要像这样修改第三行:

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/efi/EFI/debian/grub.cfg "$@"

在任何重大系统更新后(例如从 Debian 10“buster”到 Debian 11),您应该重新检查/usr/sbin/update-grub.distrib和修改/usr/sbin/update-grub以验证改版仍然有效并且新版本没有给update-grub脚本带来任何更改。

实际上,您可能还需要将一些其他文件复制到 ESP,例如 GRUB 字体文件(从/boot/grub/fonts/unicode.pf2/boot/efi/EFI/debian/fonts/unicode.pf2)以及可能的 GRUB 菜单背景图像或与您可能使用的 GRUB 主题相关的类似内容。

答案2

您的 USB 磁盘包含整个 Debian 卷(包括/boot目录)。如果没有它,嵌入 EFI 系统分区中的第一阶段 grub 引导加载程序将无法加载 grub 配置文件、模块vfat(因此 中明显缺少文件系统(hd1,2))或您的initramfs内核。

如果您有空间,您可以将 USB 磁盘上的分区移动到内部存储并重新生成 grub 配置,以便 grub 理解您所做的操作,但如果您没有连接到它,此时更简单的事情将是是重新安装。

相关内容