对于这个问题的其余部分,您可以假设任何带有“内部”的内容是指我的笔记本电脑的内部 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: 当 U 盘处于 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 理解您所做的操作,但如果您没有连接到它,此时更简单的事情将是是重新安装。