2. GRUB引导加载器

大家好,我是老李。今天我们来聊聊GRUB。说实话,GRUB这东西,平时你可能感觉不到它的存在,但一旦出问题,系统就起不来了。我遇到过不少运维新手,一看到GRUB提示符就慌了神。其实别怕,搞懂它的配置和参数传递,你就能掌控系统的启动流程。

2.1 GRUB配置文件详解

GRUB的配置文件,核心就是 /boot/grub/grub.cfg。不过要注意,这个文件是自动生成的,你千万别直接去改它。我刚开始学的时候,就犯过这个错——手动改了grub.cfg,结果下次更新内核,配置全丢了。

正确的做法是修改 /etc/default/grub,然后运行 update-grub 或 grub-mkconfig -o /boot/grub/grub.cfg。嗯,这里要记住。

2.1.1 核心配置项

我们来看看 /etc/default/grub 里最常用的几个参数:

配置项 作用 示例值
GRUB_DEFAULT 默认启动项 0(第一个)或 "Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-26-generic"
GRUB_TIMEOUT 等待用户选择的时间(秒) 5
GRUB_CMDLINE_LINUX 传递给内核的通用参数 "quiet splash"
GRUB_CMDLINE_LINUX_DEFAULT 仅默认启动项的内核参数 "quiet"
GRUB_GFXMODE GRUB图形模式分辨率 1024x768
GRUB_DISABLE_RECOVERY 是否禁用恢复模式 true

我的小技巧: 如果你有多内核,想默认启动旧版本,可以用 GRUB_DEFAULT="1>2" 这种子菜单语法。我曾经在一个生产环境里,新内核有bug,全靠这个配置回滚到旧内核,避免了停机。

2.1.2 自定义菜单项

有时候你需要添加自己的启动项,比如内存测试、救援模式。可以在 /etc/grub.d/40_custom 里添加:

#!/bin/sh
exec tail -n +3 $0
# 添加自定义菜单项
menuentry "My Custom Rescue System" {
  set root=(hd0,1)
  linux /vmlinuz-5.4.0-26-generic root=/dev/sda1 ro single
  initrd /initrd.img-5.4.0-26-generic
}

写完后记得 chmod +x /etc/grub.d/40_custom,然后 update-grub。不然它不会被执行,我踩过这个坑。

2.2 引导参数传递

引导参数,说白了就是告诉内核怎么干活。你想想看,内核启动时根本不知道你的硬盘是什么文件系统、要不要进单用户模式,这些信息全靠参数传递。

2.2.1 常用内核参数

  • root=:指定根文件系统设备,如 root=/dev/sda1 或 root=UUID=xxxx
  • ro:以只读方式挂载根文件系统(默认)
  • rw:以读写方式挂载根文件系统
  • single 或 1:进入单用户模式(救援模式)
  • quiet:减少启动时的输出信息
  • splash:显示启动画面
  • nomodeset:禁用内核模式设置(显卡驱动有问题时用)
  • acpi=off:禁用ACPI电源管理

重点: 临时修改参数,在GRUB菜单按 e 键编辑启动项,找到 linux 开头的行,在末尾添加参数。按 Ctrl+X 或 F10 启动。这个操作不会永久保存,适合调试。

2.2.2 永久修改参数

比如你想关闭图形界面,让系统启动时输出详细日志:

# 编辑配置文件
vim /etc/default/grub

# 修改这一行
GRUB_CMDLINE_LINUX_DEFAULT=""

# 或者添加调试参数
GRUB_CMDLINE_LINUX="debug ignore_loglevel"

# 更新GRUB
update-grub

我个人习惯在调试内核问题时,临时加 debug 和 ignore_loglevel,这样所有内核消息都会打印到控制台,方便定位问题。

2.3 修复引导故障

引导故障,是每个运维的噩梦。我经历过最惨的一次,是机房断电后,一台数据库服务器的GRUB坏了,整个团队盯着黑屏发呆。后来我总结了一套修复流程,分享给你。

2.3.1 常见故障现象

  • GRUB Rescue 提示符:显示 grub rescue>,找不到引导文件
  • 黑屏无反应:GRUB加载后卡住
  • 文件未找到错误:error: file '/boot/grub/i386-pc/normal.mod' not found
  • 无效签名:Secure Boot 导致GRUB无法加载

2.3.2 使用Live CD修复

这是最通用的方法。拿一张Ubuntu Live CD(或U盘),启动到试用模式:

# 1. 查看分区情况
sudo fdisk -l

# 2. 挂载根分区(假设是 /dev/sda1)
sudo mount /dev/sda1 /mnt

# 3. 挂载必要的系统目录
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

# 4. chroot 到目标系统
sudo chroot /mnt

# 5. 重新安装GRUB
grub-install /dev/sda
update-grub

# 6. 退出并重启
exit
sudo umount /mnt/dev /mnt/proc /mnt/sys /mnt
sudo reboot

注意: 如果你用的是UEFI引导,还需要挂载EFI分区。我曾经帮一个同事排查了半天,才发现他忘了挂载 /boot/efi,结果GRUB装到了错误的位置。

2.3.3 GRUB Rescue 手动引导

如果系统还能进GRUB Rescue,可以手动引导:

# 查看可用分区
ls

# 假设找到 (hd0,msdos1) 是根分区
set root=(hd0,msdos1)
set prefix=(hd0,msdos1)/boot/grub

# 加载正常模块
insmod normal
normal

# 或者直接引导内核
linux /boot/vmlinuz-5.4.0-26-generic root=/dev/sda1
initrd /boot/initrd.img-5.4.0-26-generic
boot

嗯,这里要注意,不同系统的内核文件名可能不同。你可以用 ls (hd0,msdos1)/boot 先看看有哪些文件。

2.3.4 避坑指南:GRUB配置文件损坏

我曾经遇到一个情况:grub.cfg 文件被误删了,但GRUB还能启动到菜单。为什么?因为GRUB有备份机制。它会尝试加载 /boot/grub/grub.cfg,如果找不到,就回退到 /boot/grub/grub.cfg.old。如果两个都没有,才会进Rescue模式。

所以,如果你不小心删了配置文件,可以这样恢复:

# 从备份恢复
cp /boot/grub/grub.cfg.old /boot/grub/grub.cfg

# 或者重新生成
grub-mkconfig -o /boot/grub/grub.cfg

2.4 本章知识体系

下面这张图,是我梳理的GRUB核心知识结构。你可以把它当作一个速查地图:

GRUB引导加载器知识体系 配置文件 • /etc/default/grub • GRUB_DEFAULT • GRUB_TIMEOUT • GRUB_CMDLINE_LINUX • 40_custom自定义菜单 • update-grub生成 引导参数传递 • root= 指定根设备 • ro/rw 读写模式 • single 单用户模式 • quiet/splash 显示控制 • nomodeset 显卡兼容 • 临时/永久修改方法 故障修复 • GRUB Rescue 提示符 • 黑屏无反应 • 文件未找到错误 • Live CD 修复流程 • 手动引导命令 • 配置文件恢复 核心原则:配置文件是源头,参数传递是手段,故障修复是底线 修改配置 → update-grub → 测试验证 → 备份grub.cfg 提示:遇到GRUB问题,先别慌。从Live CD启动,chroot进去,重装GRUB是万能解法。 💡 我的经验总结 1. 每次更新内核后,手动检查grub.cfg是否生成正确 2. 备份 /boot 目录,尤其是grub.cfg和内核文件

GRUB这块内容,说白了就是三板斧:配好文件、传对参数、会修故障。你只要把这三点吃透了,系统启动这块就稳了。我见过太多人,平时不重视GRUB,一出问题就抓瞎。别做那样的人。

可可精品资料库