Linux 机器 GRUB2 配置简介

了解 GRUB 引导加载程序如何工作,以准备您的系统并启动您的操作系统内核。
668 位读者喜欢这篇文章。
How Linux got to be Linux: Test driving 1993-2003 distros

Internet Archive Book Images。Opensource.com 修改。CC BY-SA 4.0

在研究我上个月的文章《Linux 引导和启动过程简介》时,我对更多地了解 GRUB2 产生了兴趣。本文快速介绍了 GRUB2 的配置,为了简洁起见,我主要将其称为 GRUB。

GRUB

GRUB 代表 GRand Unified Bootloader(统一引导加载程序)。它的功能是在启动时接管 BIOS,加载自身,将 Linux 内核加载到内存中,然后将执行权交给内核。一旦内核接管,GRUB 就完成了它的工作,不再需要它。

GRUB 支持多个 Linux 内核,并允许用户在启动时使用菜单在它们之间进行选择。我发现这是一个非常有用的工具,因为我曾多次遇到应用程序或系统服务在特定内核版本下失败的问题。很多时候,引导到较旧的内核可以规避此类问题。默认情况下,当使用 yumdnf 执行升级时,会保留三个内核——最新的和之前的两个。软件包管理器在擦除内核之前要保留的内核数量可以在 /etc/dnf/dnf.conf/etc/yum.conf 文件中配置。我通常将 installonly_limit 值更改为 9,以保留总共九个内核。这在几次我不得不恢复到几个版本之前的内核时派上了用场。

GRUB 菜单

GRUB 菜单的功能是允许用户在默认内核不是所需内核的情况下,选择已安装的内核之一进行引导。使用向上和向下箭头键允许您选择所需的内核,然后按 Enter 键继续使用所选内核的引导过程。

GRUB 菜单还提供了超时设置,以便在用户未进行任何其他选择的情况下,GRUB 将继续使用默认内核进行引导,而无需用户干预。按键盘上的任意键(Enter 键除外)会终止控制台上显示的倒计时计时器。按 Enter 键会立即继续使用默认内核或可选地选择的内核进行引导过程。

GRUB 菜单还提供了一个“救援”内核,用于在进行故障排除或常规内核由于某些原因无法完成引导过程时使用。不幸的是,此救援内核不会引导到救援模式。本文稍后将详细介绍。

grub.cfg 文件

grub.cfg 文件是 GRUB 配置文件。它由 grub2-mkconfig 程序使用一组主要配置文件和 grub 默认文件作为用户配置规范的来源生成。/boot/grub2/grub.cfg 文件在 Linux 安装期间首次生成,并在安装新内核时重新生成。

grub.cfg 文件包含类似 Bash 的代码和已安装内核的列表,该列表按安装顺序排列在一个数组中。例如,如果您安装了四个内核,则最新的内核将位于索引 0,之前的内核将位于索引 1,而最旧的内核将位于索引 3。如果您可以访问 grub.cfg 文件,您应该查看它以了解它的外观。grub.cfg 文件太大,无法包含在本文中。

GRUB 配置文件

grub.cfg 的主要配置文件集位于 /etc/grub.d 目录中。该目录中的每个文件都包含 GRUB 代码,这些代码被收集到最终的 grub.cfg 文件中。这些配置文件的名称中使用的编号方案旨在提供排序,以便将最终的 grub.cfg 文件组装成正确的顺序。这些文件中的每一个都带有一个注释,以表示节的开始和结束,这些注释也是最终 grub.cfg 文件的一部分,因此可以从这些注释中看到每个节是从哪个文件生成的。分隔注释如下所示

### BEGIN /etc/grub.d/10_linux ###

### END /etc/grub.d/10_linux ###

除非您是 GRUB 专家并且了解更改将产生什么影响,否则不应修改这些文件。即使这样,您也应始终保留原始的、可工作的 grub.cfg 文件的备份副本。特定文件 40_custom41_custom 旨在用于生成用户对 GRUB 配置的修改。您仍然应该意识到对这些文件所做的任何更改的后果,并维护原始 grub.cfg 文件的备份。

您还可以将自己的文件添加到 /etc/grub.d 目录。这样做的一个原因可能是为非 Linux 操作系统添加菜单行。只需确保遵循命名约定,以确保在配置文件中的 10_linux 条目之前或之后立即添加其他菜单项。

GRUB 默认文件

原始 GRUB 的配置相当简单明了。我只需修改 /boot/grub/grub.conf 即可。我仍然可以通过更改 /boot/grub2/grub.cfg 来修改 GRUB2,但新版本比原始 GRUB 复杂得多。此外,当安装新内核时,grub.cfg 可能会被覆盖,因此任何更改都可能会消失。但是,GNU.org GRUB 手册确实讨论了直接创建和修改 /boot/grub2/grub.cfg

一旦您真正弄清楚如何操作,更改 GRUB2 的配置就相当容易了。我只是在为之前的文章研究 GRUB2 时才发现了这一点。秘诀在于 /etc/default 目录,其中有一个文件,顾名思义,称为 grub,然后它与一个简单的终端命令结合使用。/etc/default 目录包含一些程序(如 Google Chrome、useradd 和 grub)的配置文件。

/etc/default/grub 文件非常简单。grub 默认文件已经列出了许多有效的键/值对。您可以简单地更改现有键的值或添加文件中尚不存在的其他键。下面的列表 1 显示了未修改的 /etc/default/grub 文件。

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' 
   /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora_fedora25vm/root 
   rd.lvm.lv=fedora_fedora25vm/swap 
   rd.lvm.lv=fedora_fedora25vm/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

列表 1:Fedora 25 的原始 grub 默认文件。

GRUB 手册的第 5.1 节 包含有关可以包含在 grub 文件中的所有可能键的信息。我从来没有需要做任何其他事情,除了修改 grub 默认文件中已经存在的一些键的值。让我们看看每个键的含义,以及一些在 grub 默认文件中没有出现的键。

  • GRUB_TIMEOUT 此键的值确定 GRUB 选择菜单的显示时长。GRUB 提供了同时保留多个已安装内核的功能,并允许在启动时使用 GRUB 菜单在它们之间进行选择。此键的默认值为 5 秒,但我通常将其更改为 10 秒,以便有更多时间查看选项并进行选择。
  • GRUB_DISTRIBUTOR 此键定义一个 sed 表达式,该表达式从 /etc/system-release 文件中提取发行版版本号。此信息用于生成 GRUB 菜单中显示的每个内核版本的文本名称,例如“Fedora”。由于不同发行版之间的 system-release 文件中数据的结构有所不同,因此您的系统上的 sed 表达式可能有所不同。
  • GRUB_DEFAULT 确定默认引导哪个内核。那是“已保存”的内核,即最新的内核。此处的其他选项是一个数字,该数字表示 grub.cfg 中内核列表的索引。但是,使用索引(如 3)加载列表中的第四个内核将始终加载列表中的第四个内核,即使在安装新内核之后也是如此。因此,使用索引将在安装新内核后加载不同的内核。确保引导特定内核版本的唯一方法是将 GRUB_DEFAULT 的值设置为所需内核的名称,例如 4.8.13-300.fc25.x86_64。
  • GRUB_SAVEDEFAULT 通常,此选项未在 grub 默认文件中指定。当选择不同的内核进行引导时,正常操作是该内核仅引导一次。默认内核不会更改。当设置为“true”并与 GRUB_DEFAULT=saved 一起使用时,此选项会将不同的内核另存为默认内核。当选择不同的内核进行引导时,就会发生这种情况。
  • GRUB_DISABLE_SUBMENU 有些人可能希望为 GRUB 菜单屏幕创建内核的层次结构菜单结构。此键以及 grub.cfg 中内核节的一些其他配置允许创建这样的层次结构。例如,一个可能具有带有“生产”和“测试”子菜单的主菜单,其中每个子菜单都将包含相应的内核。将此设置为“false”将启用子菜单的使用。
  • GRUB_TERMINAL_OUTPUT 在某些环境中,可能希望或必须将输出重定向到不同的显示控制台或终端。默认是将输出发送到默认终端,通常是“控制台”,它等同于 Intel 类 PC 上的标准显示器。另一个有用的选项是在数据中心或实验室环境中使用串行终端或集成灯光输出 (ILO) 终端连接时指定“serial”。
  • GRUB_TERMINAL_INPUT GRUB_TERMINAL_OUTPUT 一样,可能希望或必须从串行终端或 ILO 设备而不是标准键盘输入重定向输入。
  • GRUB_CMDLINE_LINUX 此键包含将在引导时传递给内核的命令行参数。请注意,这些参数将添加到所有已安装内核的 grub.cfg 的内核行中。这意味着所有已安装的内核在引导时都将具有相同的参数。我通常删除“rhgb”和“quiet”参数,以便我可以查看内核和 systemd 在引导和启动期间输出的所有非常有用的消息。
  • GRUB_DISABLE_RECOVERY 当此键的值设置为“false”时,将为每个已安装的内核在 GRUB 菜单中创建一个恢复条目。当设置为“true”时,不会创建恢复条目。无论此设置如何,最后一个内核条目始终是“rescue”选项。但是,我遇到了救援选项的问题,我将在下面详细介绍。

还有其他一些我在这里没有介绍的键,您可能会发现它们很有用。它们的描述位于 GRUB 手册 2 的第 5.1 节中。

生成 grub.cfg

完成所需的配置后,需要生成 /boot/grub2/grub.cfg 文件。这是通过以下命令完成的。

grub2-mkconfig > /boot/grub2/grub.cfg

此命令按顺序获取 /etc/grub.d 中的配置文件以构建 grub.cfg 文件,并使用 grub 默认文件的内容来修改输出以实现最终的所需配置。grub2-mkconfig 命令尝试查找所有已安装的内核,并在 grub.cfg 文件的 10_Linux 部分中为每个内核创建一个条目。它还会创建一个“rescue”条目,以提供一种从阻止 Linux 引导的重大问题中恢复的方法。

强烈建议您不要手动编辑 grub.cfg 文件,因为下次安装新内核或手动运行 grub2-mkconfig 时,对该文件的任何直接修改都将被覆盖。

问题

我遇到了 GRUB2 的一个问题,如果您没有意识到这个问题,可能会造成严重的后果。救援内核不会引导,而是引导其他内核之一。我发现它是列表中索引 1 处的内核,即列表中的第二个内核。其他测试表明,无论使用原始 grub.cfg 配置文件还是我生成的配置文件,都会发生此问题。我已经在虚拟硬件和真实硬件上都尝试过,并且在每个硬件上问题都相同。我只在 Fedora 25 上尝试过,因此这可能不是其他 Fedora 版本的问题。

请注意,从“rescue”内核生成的“recovery”内核条目确实有效,并且引导到维护模式登录。

我建议在 grub 默认文件中将 GRUB_DISABLE_RECOVERY 更改为“false”,并生成您自己的 grub.cfg。这将在 GRUB 菜单中为每个已安装的内核生成可用的恢复条目。这些恢复配置按预期工作,并引导到运行级别 1(根据 runlevel 命令),在命令行条目处请求密码以进入维护模式。您也可以按 Ctrl-D 继续正常引导到默认运行级别。

结论

GRUB 是 BIOS 之后引导 Linux 计算机进入可用状态的事件序列中的第一步。了解如何配置 GRUB 对于能够从各种类型的问题中恢复或规避各种类型的问题非常重要。

多年来,我不得不多次引导到恢复或救援模式,以解决多种类型的问题。其中一些问题是由于 /etc/fstab 或其他配置文件中的条目不正确等原因造成的实际引导问题,另一些问题是由于应用程序或系统软件与最新内核不兼容造成的。硬件兼容性问题也可能阻止特定内核引导。

我希望这些信息能帮助您开始 GRUB 配置。

标签
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件的工作,自 1969 年以来一直从事计算机工作。他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

5 条评论

很棒而且非常有用。谢谢。

GRUB2 比 GRUB 更高效地做了什么?同时,GRUB 比 LILO 做了什么?正如作者所说,这些程序用于加载和启动 Linux,仅此而已。在哪些方面 GRUB2 比 GRUB 更好,GRUB 比 LILO 更好?

感谢您详细的见解和概述,我才刚刚开始研究和学习 Linux 引导过程。一开始,它看起来很可怕,但语言和写作语气帮助我放松了一些 :)

这非常有用,但我想问你为什么它既有用又可维护?
这是关于 GRUB2 配置的,但 GRUB 和 GRUB2 配置之间有什么区别。
感谢您分享这些知识。

非常好的文章。感谢分享。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.