在 Linux 中自定义 GRUB2 启动菜单

CompTIABeginner
立即练习

介绍

在本实验中,你将学习如何在 Linux 环境中自定义 GRUB2 启动菜单。GRUB2(GRand Unified Bootloader)是计算机启动时运行的第一个程序,负责加载 Linux 内核。你将通过操作其主配置文件 /etc/default/grub 来获得实践经验,并根据需求调整启动体验。

你将从访问和检查默认的 GRUB2 配置开始。接着,你将修改关键参数,例如通过 GRUB_TIMEOUT 更改启动菜单的显示时长,以及通过 GRUB_DEFAULT 设置默认启动项。在实验结束时,你将学习使用 grub2-mkconfig 命令生成新的 GRUB2 配置文件来应用这些更改,并掌握验证自定义配置是否正确的方法。

注意:由于这是一个临时且可丢弃的 LabEx 虚拟环境,我们无法执行实际的系统重启来观察启动菜单的变化。相反,你将学习通过检查生成的 GRUB2 文件来验证配置更改,这对于系统管理员在重启生产系统前验证配置来说,是一项同样重要的技能。

访问 GRUB2 默认配置文件 /etc/default/grub

在这一步中,你将学习如何访问和查看 GRUB2 的主配置文件。GRUB2(第二版大一统引导加载程序)是大多数现代 Linux 发行版的默认引导加载程序。它是你启动计算机时运行的第一个程序,其任务是将 Linux 内核加载到内存中并启动操作系统。

用于自定义 GRUB2 行为的主配置文件位于 /etc/default/grub。该文件包含控制菜单超时、默认启动操作系统以及额外内核参数的键值对。

在进行任何更改之前,检查当前配置至关重要。由于 /etc/default/grub 是属于 root 用户的系统文件,你需要使用 sudo 命令来访问它。我们将使用 cat 命令在终端中显示其内容。

执行以下命令查看 GRUB2 默认配置文件的内容:

sudo cat /etc/default/grub

你将看到类似以下的输出。具体数值可能会根据你的系统配置而略有不同。

GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M rhgb quiet net.ifnames=0 console=tty0 console=ttyS0,115200n8 no_timer_check iommu=pt crash_kexec_post_notifiers=1 nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

让我们简要查看该文件中的两个重要参数:

  • GRUB_TIMEOUT:此值决定了在自动启动默认项之前,GRUB2 菜单显示的秒数。
  • GRUB_DEFAULT:此参数指定默认情况下将启动哪个操作系统或内核。

在下一步中,你将学习如何修改这些参数以更改启动菜单的行为。

修改 GRUB_TIMEOUT 和 GRUB_DEFAULT 参数

在这一步中,你将修改 GRUB2 配置文件以更改启动菜单的行为。具体来说,你将增加菜单超时时间并设置特定的默认启动项。为了编辑 /etc/default/grub 文件,你将使用 nano,这是一个简单直观的命令行文本编辑器。由于这是一个系统文件,你必须使用 sudo 来获取必要的编辑权限。

首先,使用具有 sudo 权限的 nano 打开文件。

sudo nano /etc/default/grub

nano 编辑器将打开并显示文件内容。现在,你将进行两处更改:

  1. 更改 GRUB_TIMEOUT 的值: 找到以 GRUB_TIMEOUT 开头的行。它可能被设置为 1。使用方向键将光标移动到此行,并将值从 1 更改为 15。这将使 GRUB2 菜单在自动启动前等待 15 秒。

    修改后的行应该如下所示:

    GRUB_TIMEOUT=15
    
  2. 更改 GRUB_DEFAULT 参数: 找到以 GRUB_DEFAULT 开头的行。它的值可能是 saved。将此值更改为 0。设置 GRUB_DEFAULT=0 会告诉 GRUB2 自动启动菜单列表中的第一个条目(列表索引从零开始,因此 0 代表第一个条目)。

    修改后的行应该如下所示:

    GRUB_DEFAULT=0
    

完成这些更改后,你需要保存文件并退出 nano

  • Ctrl + O(写入命令)保存更改。
  • nano 会要求你确认要写入的文件名。直接按 Enter 即可。
  • Ctrl + X 退出 nano 编辑器并返回到 Shell 提示符。

你现在已成功修改了 GRUB2 的默认设置。在下一步中,你将应用这些更改。

应用并验证 GRUB2 配置更改

在这一步中,你将应用上一步中所做的配置更改,并学习如何验证 GRUB2 是否已正确配置。你将使用 grub2-mkconfig 命令根据你的修改生成一个新的配置文件。

生成新的 GRUB2 配置

既然你已经修改了 /etc/default/grub 文件,就需要通过生成新的 GRUB2 配置文件来应用这些更改。grub2-mkconfig 命令会读取 /etc/default/grub 中的设置以及 /etc/grub.d/ 中的脚本,从而创建最终的 GRUB2 配置。

运行以下命令生成新配置:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

你应该会看到类似以下的输出:

Generating grub configuration file ...
Adding boot menu entry for UEFI Firmware Settings ...
done

此命令会扫描系统中的可用内核,读取你的配置设置,并创建最终的 GRUB2 菜单配置。

验证你的配置更改

让我们验证你的更改是否已正确应用到 GRUB2 配置中。首先,检查修改后的设置是否反映在 /etc/default/grub 文件中:

sudo grep -E "(GRUB_TIMEOUT|GRUB_DEFAULT)" /etc/default/grub

你应该看到显示修改后数值的输出:

GRUB_TIMEOUT=15
GRUB_DEFAULT=0

接下来,验证这些设置是否已应用到生成的 GRUB2 配置文件中:

sudo grep -E "(timeout|default)" /boot/grub2/grub.cfg | head -5

这将向你展示这些设置在实际的 GRUB2 配置文件中的呈现方式。

创建配置备份

在进行更改之前,为重要的配置文件创建备份始终是一个好习惯:

sudo cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.backup

这将创建一个备份副本,以便在需要时进行恢复。

排除故障并验证 GRUB2 配置

在最后一步中,你将学习 GRUB2 配置的基本故障排除技术,并了解如何验证你的更改。这些技能对于需要确保 GRUB2 修改在重启生产系统前能正常工作的系统管理员来说至关重要。

检查 GRUB2 配置语法

使用内置的语法检查器验证你的 GRUB2 配置是否存在语法错误:

sudo grub2-script-check /boot/grub2/grub.cfg

如果没有错误,此命令将静默返回。任何语法错误都会连同行号一起显示,这有助于你识别并修复问题。

了解 GRUB2 目录结构

探索 GRUB2 配置目录结构以了解其工作原理。请注意,访问此目录需要 root 权限:

sudo ls -la /etc/grub.d/

这将显示所有用于生成 GRUB2 菜单不同部分的脚本。每个脚本都有一个数字前缀,决定了执行顺序。你会看到各种脚本,例如:

  • 00_header:设置基础 GRUB2 配置
  • 00_tuned:针对 Tuned 服务的特定配置
  • 01_users:用户配置
  • 10_linux:查找并添加 Linux 内核
  • 20_linux_xen:Xen 管理程序支持
  • 30_os-prober:搜索其他操作系统
  • 40_custom:包含用户自定义的菜单项

实际的脚本可能会根据你的系统配置和安装的软件包而有所不同。

查看可用启动项

让我们检查生成的配置中有哪些可用的启动项:

sudo grep "menuentry" /boot/grub2/grub.cfg | head -10

此命令将显示菜单项引用和实际的菜单项。输出可能包括配置变量(如 menuentry_id_option)和实际的启动菜单项。请寻找包含完整菜单项定义的行。

验证超时和默认设置

检查你的超时和默认设置是否已正确配置:

sudo grep -E "set timeout|set default" /boot/grub2/grub.cfg

你会在配置文件中看到多个超时和默认设置。这是正常的,因为 GRUB2 在不同场景下会使用不同的超时值:

  • 主超时(通常是你配置的 15 秒)
  • 特殊情况下的条件超时
  • 不同的超时样式(菜单模式、隐藏模式)

需要验证的关键设置是:

  • set default="0" - 将第一个菜单项设置为默认
  • set timeout=15 - 将主菜单超时设置为 15 秒

了解 GRUB2 恢复

了解 GRUB2 恢复对于排除启动问题至关重要。在紧急情况下,你可以:

  1. 访问 GRUB2 命令行:在 GRUB2 菜单界面按 c 进入命令行模式
  2. 编辑启动项:在启动前按 e 编辑启动项
  3. 使用救援模式:如果 GRUB2 找不到其配置,它会进入救援模式(rescue mode)

常见的恢复命令包括:

  • ls:列出可用的分区和文件
  • set root=(hd0,1):设置根分区
  • linux /boot/vmlinuz root=/dev/sda1:加载内核
  • boot:开始启动过程

最终配置验证

让我们对完整的 GRUB2 配置进行最后检查:

sudo cat /etc/default/grub | grep -E "(TIMEOUT|DEFAULT)"

这确认了你的基础设置已正确保存在源配置文件中。

你已完成的任务:

  • 修改了 GRUB2 超时和默认启动设置
  • 使用 grub2-mkconfig 应用了配置更改
  • 学习了如何验证和排除 GRUB2 配置故障
  • 建立了关键启动文件的备份流程
  • 了解了 GRUB2 目录结构和恢复选项
  • 掌握了在系统重启前验证配置的技能

你的 GRUB2 配置现在已成功自定义,设置了 15 秒超时并将第一个菜单项作为默认项。在生产环境中,这些更改将在下次系统重启时生效,提供更友好的启动体验。

总结

在这个全面的实验中,你获得了关于 GRUB2 引导加载程序自定义和故障排除技术的实践经验。你从检查默认 GRUB2 配置开始,随后修改了包括 GRUB_TIMEOUTGRUB_DEFAULT 在内的关键参数,以自定义启动菜单的行为。你学习了如何使用 grub2-mkconfig 命令应用这些更改,并验证了修改是否已正确实施。

你掌握的核心技能包括:理解 GRUB2 配置结构、安全地修改 /etc/default/grub 文件、正确应用配置更改,以及执行规范的验证和备份流程。你还学习了基本的故障排除技术,包括语法检查、配置验证以及对系统管理员至关重要的 GRUB2 恢复选项。

本实验强调了系统管理员在现实场景中所需的实用技能,特别是在将配置应用于生产系统之前验证 GRUB2 配置的能力。你学习了使用 grub2-script-check 等命令进行语法验证,并使用各种 grep 命令来确认更改已正确应用到生成的配置文件中。

这些技能使你能够自信地处理启动配置场景,并在企业级 Linux 环境中有效地排除启动相关问题。你所练习的验证技术对于确保在重启生产系统前 GRUB2 配置的正确性尤为宝贵。