在同一磁盘上安装 2 个以上基于 Ubuntu 的发行版/版本双启动的选项

在同一磁盘上安装 2 个以上基于 Ubuntu 的发行版/版本双启动的选项

在标准 UEFI/GPT 系统上,通常情况下只有一个EFI 系统分区 (ESP)每个磁盘和操作系统安装程序都会将其引导加载程序放在那里。基于 Ubuntu 的发行版/版本(Ubuntu、Kubuntu、Xubuntu、Mint 等)往往使用相同的文件夹名称 ( EFI/ubuntu),因此最后安装的版本通常会覆盖其内容。据我所知,最后一个版本应该会检测其他版本并自动为它们配置引导菜单项,但我的经验表明并非如此。

共享 ESP 的实际意义是什么?EFI/ubuntu有哪些选项可以配置(或修复)两个或更多此类操作系统的双启动/多启动?

答案1

当我们安装操作系统时,安装程​​序会将其放入一个或多个投入的分区。但是,它还会安装引导加载程序其中一部分(“入口点”)将被写入共享EFI 系统分区 (ESP)。在 Linux 中,ESP 通常安装在/boot/efi或(您可以使用和等工具/efi在或中轻松检查)。通常大小在 100 MB 到 1 GB 之间。/etc/fstabdflsblk

如今大多数 Linux 发行版都附带GRUB引导加载程序。从技术上讲,GRUB 也是一个启动管理器(即它可以在计算机启动时向用户显示选项菜单)。

我们首先从一个设置示例开始,其中每个操作系统在 ESP 中都有自己的文件夹EFI/

在此处输入图片描述

当我们安装新的操作系统时,它可能会检测其他现有操作系统并在其配置文件中自动为它们添加额外的启动菜单条目(通常/boot/grub/grub.cnf针对 Ubuntu 或/boot/grub2/grub.cnfFedora)。

定义“外部”启动菜单条目的主要方法有两种:

  • GRUB“调用”其他操作系统的引导加载程序。这称为链式加载EFI/Microsoft/例如,当 GRUB 需要启动 Windows 时(其引导加载程序将驻留在 ESP 中),它就会这样做。
  • GRUB 直接加载相应的 (Linux) 操作系统。例如,Fedora/boot/grub2/grub.cnf可能有一个menuentry用于 Kubuntu 的,可直接运行linux /boot/vmlinuz-6.8.0-31-generic root=UUID=7d22a...,等等。

假设我们先安装 Ubuntu,然后安装 Fedora。Fedora 安装程序将“看到”Ubuntu,并可以在其/boot/grub2/grub.cnf文件中为 Ubuntu 添加菜单条目。此时 Ubuntu 的引导加载程序将不知道 Fedora,但如果我们更新 Ubuntu 的 GRUB /boot/grub/grub.cnf(通过update-grub命令或等效命令grub-mkconfig -o /boot/grub/grub.cfg),Ubuntu 将“看到”Fedora 并为 Fedora 添加条目。

但是,如果我们安装多个“ubuntu”操作系统,它们将“竞争”同一个 ESPEFI/ubuntu位置。通常,最后一个将覆盖其内容。EFI/ubuntu/grub.cfg具体来说,该文件将从以下内容更改:

search.fs_uuid 9c2e8025-89a1-476a-9d48-aad187ab96c7 root
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

像这样:

search.fs_uuid 5d262996-46d5-416e-ab7d-35a54179bf0a root
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

让我们想象一下:

在此处输入图片描述

在该示例中,“ubuntu” GRUB 将尝试查找具有指定 UUID 的设备(分区)并转到其配置文件。请注意,如果您使用 LUKS 加密设置了 LVM,则第二行中的路径可能看起来有点不同,因为您将有一个单独的小型非加密分区,它将被挂载为/boot(而不是/)。只是需要注意的一点。

理想情况下,在最后一次“ubuntu”安装后,它/boot/grub/grub.cnf应该也包含所有其他操作系统的菜单项。但这似乎并不总是如此。此外,在某些时候,您可能希望放弃该操作系统或不依赖它来管理其他操作系统的引导加载过程。

快速切换(来自 ESP)

您可以手动修改 中的前 1 或 2 行EFI/ubuntu/grub.cfg,以便它指向另一个“ubuntu”实例。如果您很少需要在这两个操作系统之间切换,那么这样做本身就可以正常工作。如果您碰巧搞砸了,请不要担心 - 只需从另一个(非“ubuntu”)操作系统(如果存在)或从“实时 USB”启动并修改文件即可。

快速提示(评论)

这些配置文件支持评论,因此您无需每次都查找 UUID(通过blkidlsblk -f等)并复制粘贴,而是可以在文件中添加所有条目,然后通过添加/删除单个条目来注释/取消注释行#。例如:

# My main Ubuntu 24.04
search.fs_uuid 9c2e8025-89a1-476a-9d48-aad187ab96c7 root

# The Kubuntu 24.04 that I use for testing
# search.fs_uuid 5d262996-46d5-416e-ab7d-35a54179bf0a root

set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

修改操作系统的 GRUB 配置之一

您可以选择一个已安装的“ubuntu”实例并为所有 Linux 实例设置菜单项(但确保EFI/ubuntu/grub.cfg指向它)。

update-grub/工具grub-mkconfig可以配置为通过扫描其他分区自动为您执行此操作。如果您需要这样做,请添加GRUB_DISABLE_OS_PROBER=false/etc/default/grub

然而,这种方法也存在一些潜在的问题:

  1. 根据我的经验,有时它无法检测到所有操作系统。我怀疑它可能对 LVM/LUKS 加密的系统有问题。不知道为什么——这些系统有一个单独的/boot未加密分区,所以它应该能够读取其 GRUB 配置。
  2. 每当 Linux 升级其内核时,它也会调用grub-mkconfig来更新其启动菜单条目。但是,如果您使用 OS 1 进行启动但升级 OS 2,OS 1 可能不知道其“外部”菜单条目不再有效(6.8.0-29-generic例如,它们可能“指向”旧的)。当然,您可以进入 OS 1 并更新其 GRUB 配置,OS 2 的“外部”菜单条目应该会得到更新。但这并不理想。

ESP 配置中的多个菜单条目

我发现我可以直接menuentry在文件中列出多个部分EFI/ubuntu/grub.cfg,如下所示:

menuentry 'Kubuntu 23.10' - class os $menuentry_id_option 'ubu-id-1' {
    search.fs_uuid 9c2e8025-89a1-476a-9d48-aad187ab96c7 root
    set prefix=($root)'/boot/grub'
    configfile $prefix/grub.cfg
}
menuentry 'Xubuntu 24.04' - class os $menuentry_id_option 'ubu-id-2' {
    search.fs_uuid 5d262996-46d5-416e-ab7d-35a54179bf0a root
    set prefix=($root)'/boot/grub'
    configfile $prefix/grub.cfg
}

因此,每次我的 UEFI 从 启动时EFI/ubuntu,都会显示一个菜单,我可以选择我想要的任何操作系统。

在此处输入图片描述

该选项可能有其局限性,但我认为其主要优点是:

  • 流程更简单。我们不必依赖某个特定操作系统的/boot/grub/grub.cnf配置来提供启动菜单选项。
  • 没有硬编码的版本/参数。每个操作系统知道它有自己的最佳配置,并且不必跟踪其他配置的更新内容。

替代的启动管理器

重新索引是一款流行的替代启动管理器,它可以扫描您的分区、查找可用的操作系统并在启动时向您显示选项菜单。它的安装和试用都非常简单。与其他启动管理器类似,它会在 ESP 中创建自己的文件夹,名为EFI/refind

相关内容