外部 SSD 断开连接时 GRUB 无法正确加载

外部 SSD 断开连接时 GRUB 无法正确加载

我有一个内置 SSD,上面安装了主 Windows。我还有一个外置 SSD,上面安装了辅助 Windows 和 Ubuntu 操作系统。我主要使用 Windows 操作系统,有时也使用 Ubuntu。由于我的第二个 Windows 位于外置 SSD 中,因此如果需要启动它,我需要启动到 Windows 启动管理器,然后选择其中一个操作系统(我知道默认操作系统)。这里的问题是计算机重新启动(我想这可能有明显的原因),然后启动到辅助 Windows 操作系统。我在初始启动之前找不到选择操作系统的方法,所以我决定使用 GRUB 加载程序。现在,我在初始加载之前可以选择操作系统(以及我非常喜欢的 grub 自定义),并且可以快速启动到辅助 Windows 和 Ubuntu(以前使用 Windows 启动管理器时,我必须转到 BIOS 才能启动到 ubuntu)。因此,为了使事情变得简单,我选择 Ubuntu 加载程序作为 BIOS 启动顺序中的顶级顺序。所以对我来说一切都很完美,除了当没有外部 SSD 时,我无法在不进入 BIOS 的情况下登录到我的主窗口。GRUB 加载失败,我得到的是一个空的全屏 Linux 终端。我每次都需要进入 BIOS 来加载我的窗口。(当然,我可以在顶部创建 Windows 启动管理器,但我不想返回。)

我目前所了解的事情。

  • 当我们安装 grub 时,grub 会安装到第一个 EFI 分区,但 /boot 文件存储在我的外部 SSD 上。因此,GRUB 会加载,但由于外部 SSD 不存在,因此无法加载其配置文件。
  • 如果我可以将我的 GRUB 配置文件移动到内部 SSD 上,那么我就可以使用没有外部 SSD 的 GRUB 加载器,并且可以加载我的主窗口。
  • 我读过有关在内部 EFI 分区上安装 grub 的信息,但我不能丢失内部 SSD 上的任何数据。在内部 ESP 上安装 GRUB 会删除其上的任何现有数据吗?它会影响 Windows 启动管理器吗?我不想这样。(如果它是“添加”而不是“替换”,我会选择这个)。

我的磁盘配置如图所示。顺便说一句,内置 SSD 中的所有分区都是由笔记本电脑制造商制作的。我从未碰过它。外部的所有分区都是我制作的。磁盘 0 是内置的,磁盘 1 是外部的。

从 Linux POV 来看目录结构(第一个是外部 SSD)

Model: Samsung PSSD T7 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name                          Flags
 1      17.4kB  16.8MB  16.8MB                  Microsoft reserved partition  msftres
 2      16.8MB  367GB   367GB                   Basic data partition          msftdata
 3      367GB   367GB   273MB   fat32           EFI System Partition          boot, esp
 6      367GB   734GB   367GB   ntfs            Ext Shared                    msftdata
 7      734GB   839GB   105GB   ext4            Linux system
 5      839GB   983GB   144GB   ext4            Ub-Home
 4      983GB   1000GB  16.8GB  linux-swap(v1)  Swap                          swap


Model: PM9A1 NVMe Samsung 512GB (nvme)
Disk /dev/nvme0n1: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name                          Flags
 1      1049kB  200MB  199MB   fat32        EFI system partition          boot, esp
 2      200MB   334MB  134MB                Microsoft reserved partition  msftres
 3      334MB   493GB  492GB                Basic data partition          msftdata
 4      493GB   494GB  1038MB  ntfs                                       hidden, diag
 5      494GB   511GB  16.8GB  ntfs                                       hidden, diag
 6      511GB   512GB  1488MB  ntfs  

图片链接(抱歉,我是新手,无法直接发布图片)

答案1

虽然确实可以将 grub 安装到 FAT 分区(甚至是 EFI)上的内部磁盘,但有一种更简单的方法几乎可以实现您想要的效果(当没有外部 SSD 时启动 Windows,当连接 SSD 时获取 grub 并选择操作系统)。基本问题是您的两个 Windows 安装都经过 bitlocker 加密,因此 grub 将无法启动它们。

将所有文件和目录结构从内部 EFI 复制到外部 EFI。无需更改任何内容。唯一需要检查的是 EFI/Boot/bootx64.efi 的大小是否与 EFI/ubuntu/shimx64.efi 相同(或者如果您不使用安全启动,则可能是 grubx64.efi)。bootx64.efi 是默认的设备引导程序,运行时会显示 grub 的菜单。grub 安装程序通常会用 shimx64.efi 替换现有的 bootx64.efi(Windows 引导程序的副本)。现在,检查内部磁盘的 EFI/Boot/bootx64.efi 的大小,并确保它与内部磁盘的 EFI/Microsoft/bootmgfw.efi 大小相同。如果不是,应该有一个原始的“bkp”备份,或者只需将 bootmfgw.efi 复制到 bootx64.efi 以确保它是 Windows 启动。

选择您想要的启动方式:
如果您使用机器的 UEFI 设置更改启动顺序,将外部 SSD 放在启动顺序的首位,则您的机器将启动外部 grub,并且您只能从中启动 Ubuntu。使用 EFI 菜单(开机时按某个键以允许您选择要启动的设备或操作系统)覆盖此设置以启动 Windows。从选项中选择 Windows(或甚至选择内部磁盘,因为它应该具有 bootx64.efi 作为 bootmgfw.efi 的副本)。

将 Windows 放在启动顺序的第二位,这样当外部 SSD 不存在时,Windows 将启动。

内部磁盘的 EFI/ubuntu 文件将不再使用,但如果留在那里,不会造成任何损害。


您说外部设备的引导加载程序 ERI/Boot/bootx64.efi 与 shim 大小相同 - 这很好。我喜欢将文件 grubx64.efi 放在同一目录中,但对于 23.04 来说,这似乎不是必需的。UEFI 启动顺序应该将设备放在启动顺序的顶部,而不是“ubuntu”条目。“ubuntu”条目位于非易失性内存 (nvram) 中,删除 UEFI 文件不会删除 nvram 条目(如果没有这些文件,nvram 肯定无法工作)


启用 bitlocker 后,grub 无法启动 Windows,因此请尝试将内置硬盘 Windows 放在启动列表的首位,这样无论有没有第二个磁盘,Windows 都可以启动 - 无需 grub。要启动 Ubuntu,在连接第二个磁盘时,请在开机时使用 EFI 菜单键(某些功能键或 del 或 esc...)以允许您选择要启动的设备或操作系统)。从中选择 Ubuntu(或如果 rootx64 默认为 shim/grub,则选择设备)。然后 grub 应该运行,并且应该能够启动 Ubuntu(但不能启动 Windows,即使它存在于菜单中,因为启用了 bitlocker)。


再说一遍,我认为您不能从 grub 启动带有位锁的 Windows,所以如果这确实是您想要做的,请考虑在 Windows 安装中禁用位锁。

相关内容