第二章: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这块内容,说白了就是三板斧:配好文件、传对参数、会修故障。你只要把这三点吃透了,系统启动这块就稳了。我见过太多人,平时不重视GRUB,一出问题就抓瞎。别做那样的人。
可可精品资料库