3. 引导加载程序优化

系统启动的第二个关键阶段,就是引导加载程序。说白了,它就是操作系统内核的“搬运工”。在 Linux 世界里,GRUB 是最常见的引导加载程序。我见过不少服务器,GRUB 配置里塞满了用不上的内核、花里胡哨的菜单,启动时还得傻等几十秒让你选。这完全没必要。

今天我们就来聊聊,怎么把 GRUB 这块优化到极致。我个人习惯是,能省一秒是一秒,能少一行配置就少一行。

GRUB 配置精简:去掉没用的东西

GRUB 的配置文件通常位于 /etc/default/grub。你执行 update-grub 或 grub-mkconfig 后,它会生成最终的 /boot/grub/grub.cfg。

很多发行版默认会生成一堆花哨的菜单项,比如内存测试、救援模式、旧内核等等。这些东西,生产环境基本用不上。

核心思路:只保留当前内核和备用内核,其他全部砍掉。

怎么做?修改 /etc/default/grub 文件,加上或修改这几行:

# 隐藏高级选项子菜单
GRUB_DISABLE_SUBMENU=y

# 不生成救援模式入口
GRUB_DISABLE_RECOVERY="true"

# 只保留最近的两个内核
# 这个需要配合包管理器的自动清理策略

嗯,这里要注意。光改配置文件还不够,你得定期清理旧内核。我建议用 apt autoremove(Debian/Ubuntu)或 dnf autoremove(RHEL/CentOS)来自动清理。我曾经在一个客户的机器上发现,/boot 分区塞了十几个旧内核,GRUB 菜单长得像购物清单。清理完,启动菜单瞬间清爽了。

超时时间调整:别让用户干等

GRUB 默认的超时时间通常是 5 秒或 10 秒。对于服务器来说,这 5 秒完全是在浪费生命。你想想看,服务器重启时,谁会守在屏幕前选内核?

我个人的做法是:

  • 生产服务器:超时时间设为 0 或 1 秒。直接启动默认内核,不等待。
  • 开发/测试机:设为 2-3 秒。万一需要进救援模式,还有机会按 Shift 或 Esc 打断。

修改方式很简单:

# 在 /etc/default/grub 中
GRUB_TIMEOUT=1

如果你想让 GRUB 菜单完全隐藏,只在需要时按特定键才显示,可以这样:

GRUB_TIMEOUT=0
GRUB_TIMEOUT_STYLE=hidden

小技巧:设置 GRUB_TIMEOUT_STYLE=hidden 后,启动画面会直接跳过菜单。但如果你在启动时按住 Shift(BIOS)或 Esc(UEFI),菜单还是会弹出来。这个设计很人性化,我一直在用。

默认内核选择:锁定你想要的版本

系统更新后,新内核会变成默认启动项。这有时候会出问题。我记得有一次,客户的内核从 5.4 升级到 5.10 后,某个老旧的网卡驱动不兼容,导致网络服务起不来。还好我提前锁定了默认内核。

怎么锁定?有两种方法:

方法一:通过 GRUB_DEFAULT 指定

你可以用菜单项的名称或序号来指定默认内核。比如:

# 使用菜单项名称(推荐,更稳定)
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-26-generic"

# 或者使用序号(从 0 开始计数)
GRUB_DEFAULT=0

我个人更推荐用名称。因为内核更新后,序号可能会变。名称虽然长一点,但不会出错。

方法二:使用 saved 模式

如果你经常手动选择内核,可以用 saved 模式。GRUB 会记住你上次选的是哪个:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

这个模式适合开发机。我自己的笔记本就这么配的,方便切换内核做测试。

实战:完整的优化配置示例

下面是我给一个线上服务器做的 GRUB 配置,你可以直接参考:

# /etc/default/grub

GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-26-generic"
GRUB_TIMEOUT=1
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISABLE_SUBMENU=y
GRUB_DISABLE_RECOVERY="true"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

改完后,记得执行 update-grub 或 grub-mkconfig -o /boot/grub/grub.cfg 来生效。

警告:修改 GRUB 配置前,最好备份一下当前的 /boot/grub/grub.cfg。万一改错了导致无法启动,你还可以用 Live CD 恢复。我曾经手滑把 GRUB_TIMEOUT 写成了负数,结果 GRUB 直接卡住了。从那以后,我改配置前都会先备份。

知识体系图:GRUB 优化核心逻辑

下面这张图,帮你理清 GRUB 优化的三个核心维度:

GRUB 优化三大方向 配置精简 • 隐藏子菜单 • 禁用救援模式 • 清理旧内核 • 减少菜单项 超时调整 • 生产环境:0-1秒 • 开发环境:2-3秒 • 隐藏菜单样式 • 按键打断机制 默认内核选择 • 按名称锁定 • 按序号锁定 • saved 记忆模式 • 版本兼容性 目标:启动菜单零等待,内核选择零失误

避坑指南

最后,分享几个我踩过的坑:

  • 别把超时设成负数:GRUB 会直接卡住,不启动任何系统。我曾经犯过这个错,结果机房的人跑过去手动重启。
  • 清理内核前确认兼容性:有些应用依赖特定内核版本。我建议保留最近的两个版本,一个当前用,一个做回退。
  • UEFI 和 BIOS 的按键不同:UEFI 下通常是 Esc,BIOS 下是 Shift。别搞混了,否则你按半天菜单出不来。

GRUB 优化看似简单,但做对了,能省下不少启动时间。尤其是服务器批量重启时,每台省 5 秒,一百台就是 500 秒。积少成多,这就是效率。