如何让 grub 独立于所有操作系统?

如何让 grub 独立于所有操作系统?

我目前有以下分区方案。

300MB    NTFS          Recovery  
100MB    FAT32         LOOKS LIKE IT IS THE EFI BOOT PARTITION  
128MB    Other         This is empty and thus I suspect it to be the padding partition
150GB    NTFS          Windows
700GB    NTFS          Data partition
80.53GB  Unallocated

我想随着时间的推移安装许多不同的 Linux 发行版(其中一些可能会在此过程中被卸载,一些可能会被覆盖),并且想要一个能够跟上并且不会中断的引导加载程序配置。

我已经阅读了有关链式加载和专用 grub2 分区的信息,以及人们安装 ubuntu 并删除 / 分区但保留 /boot 用作 grub 的方案。

我正在寻找每种方法的优缺点。

另外,我想问一下我是否可以在未分配空间的开始或结束处创建专用的 grub2 分区?我想我会使用专用的 grub 设置。我读过关于 rEFInd bootloader 的文章,它看起来是一款无需维护的工具。它能与现有的所有 Linux 发行版兼容吗?

附言:我对引导加载程序还很陌生,我最深入的操作是编辑一些 grub.cfg 文件以将 Windows 条目移至顶部并重命名这些条目。

PPS:一些背景信息:我在未分配的空间中安装了 Ubuntu 和 Ubuntu GNOME(均为 15.04),每个使用了 40GB。然后我想只保留 Ubuntu GNOME,但我在安装 Ubuntu GNOME 之后安装了 Ubuntu Unity。因此删除 Ubuntu Unity 会导致 grub 消失。我希望通过保持 GRUB2 独立于其他所有东西来避免这种情况。

答案1

多 Linux 发行版配置的问题在于,您最终会安装多个 GRUB,这既多余又令人困惑。每个发行版都会将自己的 GRUB 设置为默认 GRUB,并将其配置为链式加载其他发行版的 GRUB 或直接引导其内核(或者可能同时执行这两项操作)。这样做存在一些问题:

  • 当你启动一个 GRUB 为不是主版本并更新其内核,控制 GRUB 的配置可能不会更新。如果控制 GRUB 直接引导其他发行版的内核,并且如果内核更新发生得足够频繁,则具有更新内核的发行版可能会停止引导,因为原始内核将消失。即使发行版继续引导,也将通过可能存在安全性或其他问题的旧内核进行引导。然后,您必须转到负责 GRUB 的发行版并运行update-grub(或执行等效操作)以使其重新运行。链式加载配置对此类问题更可靠,因此如果您有选择,这就是我的设置方式。
  • 在更新自己的 GRUB 软件包后,许多发行版会尝试将自己的 GRUB 重置为默认设置。结果可能是 GRUB 首先启动的那个会时不时地发生变化。如果其中一个比其他的做得更好,那么你将不得不efibootmgr不时地使用它来重置启动优先级。
  • 如果您删除默认启动 GRUB 的发行版,则其 GRUB 可能会停止工作。(情况并非总是如此,因为这取决于 GRUB 存储其配置文件的位置,但这是大多数发行版的设置方式。)您可以使用固件的内置启动管理器来绕过此问题,但这仍然很麻烦——对于不知道如何使用固件启动管理器的用户来说,这是一个严重的问题。(第一次启动后发生这种情况时,您需要安装另一个发行版或使用efibootmgr将另一个 GRUB 设置为默认,以避免必须使用固件的启动管理器。)

这些问题并非无法克服,但确实很麻烦。设置默认使用引导管理器可以绕过这些问题,但通常需要手动配置,这可能比克服我刚刚描述的问题需要更多的努力。rEFInd(我维护的)旨在通过减少对配置文件的依赖来绕过这些问题。特别是,rEFInd 不需要每个内核的配置,而我知道的所有其他 Linux 引导加载程序都需要。相反,rEFInd 依赖于一个配置文件,该文件提供了适用于每一个给定目录中的内核。这需要在安装发行版时进行一些明确的前期配置,但只需运行 rEFInd 附带的一个脚本(mkrlconf)。此后,当您升级内核时,rEFInd 不需要重新配置;它只需采用旧选项并将其应用于新内核即可。(请注意,GRUB 在内核更新后确实需要重新配置。Ubuntu 通过运行脚本来执行重新配置作为内核更新/安装过程的一部分来隐藏这一点——但如前所述,这些脚本仅更新一个 GRUB 的配置,这可能不是需要更新的配置。)

如果您安装 rEFInd,您仍然会遇到每个发行版都尝试将自己的 GRUB 设置为默认的问题。不过,通常有办法解决这个问题。对于 Ubuntu,您不应该启动安装介质并选择直接安装选项,而应该启动到“安装前尝试”模式,打开终端窗口,然后键入ubiquity -b。这将运行安装程序并告诉它不是安装 GRUB。如果您希望其他发行版的 GRUB 处理所有事情,显然也可以使用相同的技巧。要以这种方式安装后启动,必须​​已经安装了 rEFInd;或者您可以使用 USB 闪存驱动器或 CD-R 上的 rEFInd 启动,然后安装它。

您可能想弄清楚在您计划安装的每个发行版中禁用 GRUB 有多容易。利用这些信息,结合您自己的计划和优先事项,您可以决定要安装哪些发行版以及要绕过哪些发行版。

所有这些的另一种选择是使用虚拟化,例如 VirtualBox。如果您有足够的内存,您可以在虚拟机中同时运行六个发行版,而另一个发行版则控制整个计算机。这种方法可以绕过引导加载程序冲突,使配置变得简单得多——每个操作系统都完全负责自己的“计算机”。

答案2

正如 @oldfred 和 @Wilf 在评论中指出的那样,GRUB2 已经非常成熟,可以轻松处理我提到的情况。解决方案如下:

  1. 备份您的 ESP 或 EFI 或 Boot 分区(FAT32 分区)。
  2. 安装您想要分离分区的 Linux 发行版(您可以轻松地将所有发行版安装在单个 / 分区上,而不必创建单独的 /boot)
  3. 我们最后安装的发行版将是主发行版并将使用它的 grub。
  4. 如果您愿意,您可以手动编辑 EFI 分区上的 EFI/distro 目录中的 grub.cfg 来管理所有引导加载程序。

工作原理说明:

GRUB2 将自身安装到发行版的 /boot 中,并在 EFI 分区的子目录中创建 grub.cfg,然后链式加载实际的 grub。

相关内容