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 配置生成流程

  1. 读取主配置:加载 /etc/default/grub 中的全局变量。
  2. 执行脚本链:按顺序执行 /etc/grub.d/ 下的脚本(00_header → 10_linux → 30_os-prober → 40_custom)。
  3. 检测内核:扫描 /boot 目录,识别所有可用内核和 initramfs。
  4. 生成菜单项:为每个内核生成启动条目,包括恢复模式选项。
  5. 输出配置文件:将结果写入 /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 架构图

MBR 与 GPT 分区表下 GRUB2 安装布局对比 MBR 与 GPT 分区表下 GRUB2 安装布局对比 MBR(传统 BIOS) MBR 前 446 字节:stage1 引导代码 MBR 后扇区:stage1.5(core.img 嵌入区) 分区表(64 字节) 主分区 1:/boot(ext4) 主分区 2:根分区(ext4) 扩展分区 / 逻辑分区 GPT(UEFI) GPT 头部(LBA 1) EFI 系统分区(ESP):FAT32 ESP 内:/EFI/GRUB/grubx64.efi 主分区 1:/boot(ext4) 主分区 2:根分区(ext4) 主分区 3:数据分区 GPT 备份头部(磁盘末尾) 关键差异 MBR 将引导代码嵌入 MBR 扇区;GPT/UEFI 使用独立的 EFI 系统分区存放引导文件

3.4 修复损坏的 GRUB

GRUB 损坏是 Linux 运维中最常见的故障之一。损坏原因包括:MBR 被覆盖、配置文件丢失、内核更新后配置未刷新、分区表变更等。以下修复流程适用于绝大多数场景。

3.4.1 修复流程总览

  1. 准备救援介质:使用 Live CD/USB 启动系统。
  2. 挂载根分区:将损坏系统的根分区挂载到 /mnt。
  3. 挂载关键目录:挂载 /boot、/boot/efi(UEFI)、/dev、/proc、/sys。
  4. chroot 进入环境:使用 chroot /mnt 进入损坏系统。
  5. 重新安装 GRUB:根据分区表类型执行 grub-install。
  6. 重新生成配置:运行 grub-mkconfig -o /boot/grub/grub.cfg。
  7. 退出并重启:退出 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 流程图

GRUB 损坏修复流程 GRUB 损坏修复流程 系统无法启动 使用 Live CD/USB 启动 挂载根分区和关键目录 chroot 进入系统 判断分区表类型 MBR GPT/UEFI grub-install /dev/sda grub-install --target=x86_64-efi grub-mkconfig 生成配置

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 运维面试中的高频考点。