与 Windows 10 一起安装了 Debian,但 GRUB 不显示

与 Windows 10 一起安装了 Debian,但 GRUB 不显示

我有一块安装了 Windows 10 的 SSD,还有一块最初完全以 NTFS 进行分区的硬盘 - 但我使用 Debian 安装程序缩小了 NTFS,并在新释放的空间上安装了 Debian。

奇怪的是,安装程序告诉我它没有检测到 Windows,并要求我确认将 GRUB 写入 MBR。我拒绝了,并要求将GRUB安装到刚刚安装Debian的硬盘上(与安装Windows的SSD不同)。

我在 BIOS 中禁用了安全启动,但即便如此,计算机仍会在 Windows 上自动启动而不会显示 GRUB,并且 Windows 启动管理器是我的 BIOS 在启动管理器中检测到的唯一一个。我的 BIOS 中没有任何选项来信任/选择 EFI 文件,正如我检查过的论坛中经常指出的那样。

我想在 Windows 上自动启动,除非我在 Debian 上按住 SHIFT 来启动(我知道如何在启动时显示 GRUB 后立即执行此操作...但事实并非如此)。我应该怎么办?

我的电脑是联想Legion Y520。

答案1

如果您的 BIOS 有一个启动选项,字面意思是“Windows Boot Manager”,则强烈表明您的 Windows 已经以 UEFI 方式安装。事实上,Debian 安装程序甚至提供将 GRUB 写入 MBR 的功能,这表明 Debian 安装程序已以传统 BIOS 风格启动。

16 位传统 BIOS 引导加载程序不能链式加载 UEFI 引导加载程序(无需首先转换为 32 位或 64 位模式并设置 UEFI 环境,这从一开始就违背了传统 16 位模式的目的)。

通常,用于引导操作系统安装程序的引导模式(BIOS 与 UEFI)将自动确定要安装的新操作系统将使用哪种模式。在 UEFI 模式下运行的操作系统安装程序可以从技术上讲,安装基于 BIOS 的引导加载程序而不是基于 UEFI 的引导加载程序,但相反的操作通常是不可能的,因为激活旧版 BIOS 兼容性需要禁用 UEFI 运行时服务接口,而该接口需要将引导设置写入系统 NVRAM(例如“ BIOS 设置中的“Windows 启动管理器”文本) - 这是完成 UEFI 启动加载程序安装的要求。

如果启动介质有这两个选项可用,并且 Debian 10 安装介质确实有这两个选项,那么您的笔记本电脑目前可能更喜欢在传统 BIOS 模式下启动而不是 UEFI。因此它可能以 BIOS 模式启动 Debian 安装程序,从而无法以标准方式完成 UEFI 引导加载程序的安装。在 BIOS 模式下,安装程序也不会告诉您安装 UEFI 引导加载程序需要在要安装 UEFI 引导加载程序的磁盘上有 ESP(EFI 系统分区)。如果您没有选择在 HDD 上创建一个,则没有有效的位置来安装 UEFI 引导加载程序。

还有一个问题是,某些 UEFI 固件实现存在缺陷和/或以 Windows 为中心。正如 Debian 维基所说:

不幸的是,如前所述,许多 UEFI 固件实现都存在缺陷。尽管引导条目和引导顺序的规范非常清楚地说明了事情应该如何工作,但仍有许多系统出现错误。有些系统只是忽略添加新引导条目的有效请求。其他人会接受这些请求,但会拒绝使用它们,除非他们将自己描述为“Windows”或类似的。还有许多其他类似的错误,这表明许多系统供应商除了“它是否适用于 Windows?”之外几乎没有进行任何测试。

幸运的是,系统供应商偶尔会修复固件错误。因此,第一步是查看 Lenovo 是否有适用于您的型号的更新固件(“BIOS 更新”),如果有则安装。这可能会使安装双引导配置变得更容易。

第二步,如果可以的话,您可能应该禁用旧版 BIOS 兼容性功能。如果您发现“BIOS”设置允许强制系统仅使用 UEFI,请选择该设置;或者有一个设置提及 CSM(“兼容性支持模块”),请将其禁用。现在应该更容易让 Debian 安装程序以 UEFI 模式启动,就像现有的 Windows 安装一样。这将使它安装正确类型的引导加载程序。

第三步,请注意拥有 ESP(EFI 系统分区)的要求。它本质上是一个小的 FAT32 分区(256M 对于 Debian 10 来说已经足够了),在 Debian 中应该安装到/boot/efi.如果使用MBR分区,它应该有一个特殊的分区类型代码0xef;如果使用 GPT 分区,将分区标记为“可引导”和/或“ESP”的分区程序选项应该做正确的事情。 HDD 上有 ESP 将允许您将 HDD 移动到另一个系统并从它启动现有的 Debian 安装(如果您想稍后这样做)。

在 HDD 上为 Debian 创建单独 ESP 的替代方法是在设置分区时选择 SSD 上的 Windows ESP,选择不是对其进行格式化,但使用其现有文件系统将其挂载为/boot/efi. ESP 上的标准化目录结构旨在处理同一 ESP 上多个操作系统的引导加载程序。如果您选择此选项,Debian 10 的 UEFI 引导加载程序应该可以很好地融入标准 Windows 10 ESP,并有剩余空间。但您可能必须进入“高级/手动”分区选项才能执行此操作。

如果您在此之后仍然遇到问题,我建议您阅读Roderick W. Smith 关于 UEFI 引导加载程序挑战的文本。它是为 rEFInd 引导加载程序编写的,但其中描述的许多内容也适用于 UEFI 版本的 GRUB。


当您的两个操作系统都以 UEFI 方式启动后:

如果您的 SSD 是 NVMe 类型,那么它在 Linux 中可能显示为/dev/nvme0n1(其分区为/dev/nvme0n1pN,N = 分区号)。确保 Linux 可以识别您的 SSD,然后update-grub以 root 身份运行。

如果它没有说它检测到 Windows,请blkid以 root 身份运行:它应该报告所有文件系统和分区的 UUID。找出文件系统SSD 上 Windows ESP 的 UUID。如果 Windows ESP 使用标准 FAT32 文件系统类型,则应在表单中列出UUID="xxxx-xxxx"(它实际上是 FAT32 文件系统序列号)。

知道 UUID 后,您可以通过将以下行添加到以下内容的末尾来为 Windows 配置自定义 GRUB 菜单条目/etc/grub.d/40_custom

menuentry 'Whatever you want the Windows 10 boot menu entry to say' {
    insmod part_gpt
    insmod fat
    search --no-floppy --fs-uuid --set=root xxxx-xxxx
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

这应该是 Windows 的基本 UEFI chainloader 条目。只需替换xxxx-xxxx为实际的 Windows ESP 文件系统 UUID。编辑文件后,update-grub以 root 身份运行。然后将默认启动选项设置为debian,您应该会看到启动菜单。

Lenovo 有可能选择超越 UEFI 规范要求,在其 UEFI 固件中实现 NTFS 文件系统支持,并提供在 ESP 上使用 NTFS 的 Windows 安装。在这种情况下,替换insmod fatinsmod ntfs,文件系统 UUID 将具有不同的格式:blkid输出中将类似于UUID="A268B58668B559AD".

注意:检查efibootmgr命令。您可以使用它来操作 Linux 中的固件启动设置,而无需进入 BIOS 设置菜单。在Windows中,bcdedit可以做同样的事情,尽管我认为它的用户界面更尴尬。

答案2

它没有检测到您的窗口,因为它位于不同的磁盘上。当您在不同的磁盘上安装操作系统时,每个磁盘都会有不同的引导扇区,而不会发生任何冲突,这是一件好事,因为如果其中一个损坏,也不会影响其他磁盘。

您需要进入 BIOS 设置并将启动设备从 SSD 更改为硬盘驱动器。

相关内容