3. GRUB2 安装与修复:从基础命令到实战排障
GRUB2 的安装与修复是 Linux 系统管理员的核心技能。本章将深入剖析 grub-install 命令的完整参数、grub-mkconfig 的配置生成逻辑、MBR 与 GPT 分区表下的安装差异,以及 GRUB 损坏后的修复流程。掌握这些内容,你就能在任何 Linux 环境中自主完成引导加载程序的部署与恢复。
核心目标:理解 GRUB2 安装的底层机制,掌握不同分区表下的安装策略,并具备独立修复损坏 GRUB 的能力。
3.1 grub-install 命令详解
grub-install 是 GRUB2 安装的核心工具,负责将引导镜像写入磁盘的特定区域(MBR 或 GPT 的 BIOS 启动分区),并复制模块到 /boot/grub 目录。
3.1.1 命令语法与常用选项
grub-install [OPTION...] [INSTALL_DEVICE]
# 常用选项
--target=i386-pc # 指定目标平台(BIOS/传统模式)
--target=x86_64-efi # 指定目标平台(UEFI 模式)
--boot-directory=DIR # 指定 /boot 目录位置(默认 /boot)
--efi-directory=DIR # 指定 EFI 系统分区挂载点(UEFI 必需)
--recheck # 重新检查设备映射
--force # 强制安装(覆盖警告)
--removable # 安装为可移动介质引导(UEFI)
3.1.2 参数对比表
| 参数 | 适用场景 | 说明 |
|---|---|---|
--target=i386-pc |
传统 BIOS + MBR/GPT | 将 stage1 写入 MBR 或 BIOS 启动分区 |
--target=x86_64-efi |
UEFI 固件 + GPT | 生成 grubx64.efi 并复制到 ESP 分区 |
--efi-directory |
UEFI 安装 | 指定 ESP 挂载点,如 /boot/efi |
--removable |
UEFI 故障恢复 | 安装为 /EFI/BOOT/BOOTX64.EFI 备用引导 |
3.1.3 典型安装示例
# BIOS/MBR 模式安装到 /dev/sda
grub-install --target=i386-pc /dev/sda
# UEFI/GPT 模式安装,ESP 挂载在 /boot/efi
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
# 指定自定义 /boot 目录
grub-install --boot-directory=/mnt/boot --target=i386-pc /dev/sdb
提示:在 UEFI 系统上,务必先挂载 EFI 系统分区(ESP)到
--efi-directory 指定的路径,否则安装会失败。
3.2 grub-mkconfig 生成配置
grub-mkconfig 是 GRUB2 配置文件的自动生成器。它读取 /etc/default/grub 和 /etc/grub.d/ 目录下的脚本,生成最终的 /boot/grub/grub.cfg。
3.2.1 配置生成流程
- 读取主配置:加载
/etc/default/grub中的全局变量。 - 执行脚本链:按顺序执行
/etc/grub.d/下的脚本(00_header → 10_linux → 30_os-prober → 40_custom)。 - 检测内核:扫描
/boot目录,识别所有可用内核和 initramfs。 - 生成菜单项:为每个内核生成启动条目,包括恢复模式选项。
- 输出配置文件:将结果写入
/boot/grub/grub.cfg。
3.2.2 关键配置变量
| 变量名 | 默认值 | 作用 |
|---|---|---|
GRUB_DEFAULT |
0 | 默认启动项(数字或菜单项名称) |
GRUB_TIMEOUT |
5 | 菜单等待时间(秒) |
GRUB_CMDLINE_LINUX |
"" | 传递给所有内核的额外参数 |
GRUB_DISABLE_OS_PROBER |
false | 是否禁用其他操作系统的检测 |
GRUB_GFXMODE |
auto | 图形模式分辨率 |
3.2.3 生成配置命令
# 生成 GRUB2 配置文件
grub-mkconfig -o /boot/grub/grub.cfg
# 在 chroot 环境中使用(修复时常用)
grub-mkconfig -o /mnt/boot/grub/grub.cfg
注意:永远不要手动编辑
/boot/grub/grub.cfg。所有自定义修改应放在 /etc/default/grub 或 /etc/grub.d/40_custom 中,然后重新运行 grub-mkconfig。
3.3 MBR 与 GPT 分区表下的安装差异
分区表类型直接影响 GRUB2 的安装位置和引导方式。MBR 和 GPT 在引导加载程序的存储布局上有本质区别。
3.3.1 引导布局对比
| 特性 | MBR(传统 BIOS) | GPT(BIOS/CSM) | GPT(UEFI) |
|---|---|---|---|
| GRUB 核心位置 | MBR(前 446 字节) | BIOS 启动分区(约 1MB) | EFI 系统分区(ESP) |
| stage1.5 位置 | MBR 后扇区 | BIOS 启动分区 | 不适用 |
| 引导文件格式 | core.img(嵌入磁盘) | core.img(嵌入磁盘) | grubx64.efi(PE 格式) |
| 分区要求 | 无特殊分区 | 需要 BIOS 启动分区(无文件系统) | 需要 FAT32 格式的 ESP |
| 安装命令 | grub-install /dev/sda |
grub-install /dev/sda |
grub-install --target=x86_64-efi |
3.3.2 安装差异 SVG 架构图
3.4 修复损坏的 GRUB
GRUB 损坏是 Linux 运维中最常见的故障之一。损坏原因包括:MBR 被覆盖、配置文件丢失、内核更新后配置未刷新、分区表变更等。以下修复流程适用于绝大多数场景。
3.4.1 修复流程总览
- 准备救援介质:使用 Live CD/USB 启动系统。
- 挂载根分区:将损坏系统的根分区挂载到
/mnt。 - 挂载关键目录:挂载
/boot、/boot/efi(UEFI)、/dev、/proc、/sys。 - chroot 进入环境:使用
chroot /mnt进入损坏系统。 - 重新安装 GRUB:根据分区表类型执行
grub-install。 - 重新生成配置:运行
grub-mkconfig -o /boot/grub/grub.cfg。 - 退出并重启:退出 chroot,卸载分区,重启验证。
3.4.2 修复命令实战
# 步骤 1:从 Live CD 启动后,确认磁盘布局
lsblk
# 步骤 2:挂载根分区(假设根分区为 /dev/sda2)
mount /dev/sda2 /mnt
# 步骤 3:挂载 /boot(如果独立分区)
mount /dev/sda1 /mnt/boot
# 步骤 4:挂载 EFI 系统分区(UEFI 系统)
mount /dev/sda1 /mnt/boot/efi
# 步骤 5:绑定系统目录
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
# 步骤 6:chroot 进入系统
chroot /mnt
# 步骤 7:重新安装 GRUB(BIOS/MBR)
grub-install --target=i386-pc /dev/sda
# 步骤 7(UEFI/GPT):重新安装 GRUB
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --recheck
# 步骤 8:重新生成配置文件
grub-mkconfig -o /boot/grub/grub.cfg
# 步骤 9:退出并重启
exit
umount -R /mnt
reboot
3.4.3 修复流程 SVG 流程图
3.4.4 常见故障与解决方案
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
grub-install: error: failed to get canonical path |
/boot 目录未正确挂载 |
检查 mount 输出,确保 /boot 已挂载 |
grub-install: error: cannot find EFI directory |
ESP 未挂载或路径错误 | 使用 --efi-directory 指定正确的 ESP 挂载点 |
grub-mkconfig: warning: Failed to connect to lvmetad |
LVM 元数据守护进程未运行 | 在 chroot 中运行 lvmetad 或使用 --no-floppy |
| 启动后进入 grub rescue> 提示符 | GRUB 模块路径错误或 grub.cfg 丢失 |
手动设置 prefix 和 root,然后加载 normal 模块 |
| UEFI 系统找不到 GRUB 条目 | EFI 引导顺序错误或 NVRAM 条目丢失 | 使用 efibootmgr 创建引导条目 |
3.4.5 grub rescue 手动修复
当 GRUB 配置文件丢失或模块路径错误时,系统会进入 grub rescue> 提示符。此时可以手动引导系统:
# 1. 查看可用磁盘和分区
grub rescue> ls
(hd0) (hd0,msdos2) (hd0,msdos1)
# 2. 找到 /boot 所在分区(包含 grub 模块)
grub rescue> ls (hd0,msdos1)/boot/grub
# 3. 设置根设备和前缀路径
grub rescue> set root=(hd0,msdos1)
grub rescue> set prefix=(hd0,msdos1)/boot/grub
# 4. 加载 normal 模块进入完整 GRUB 菜单
grub rescue> insmod normal
grub rescue> normal
# 5. 进入系统后,重新安装 GRUB 并生成配置
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
提示:在 grub rescue 环境中,
ls 命令可以列出所有可用设备。分区命名格式为 (hd0,msdos1)(MBR)或 (hd0,gpt1)(GPT)。
3.5 本章小结
GRUB2 的安装与修复是 Linux 系统管理的基础技能。通过本章学习,你应掌握:
- grub-install 的核心参数及其在不同平台下的使用方式。
- grub-mkconfig 的配置生成流程和关键变量。
- MBR 与 GPT 分区表下 GRUB2 安装的布局差异和命令区别。
- GRUB 修复 的完整流程,包括 chroot 环境搭建和 grub rescue 手动修复。
实战建议:在虚拟机中反复练习 GRUB 损坏与修复流程,直到能够在不查阅文档的情况下独立完成。这是 Linux 运维面试中的高频考点。