GRUB2 引导管理器完全教程 / 第 1 章:GRUB2 概述
第 1 章:GRUB2 概述
1.1 什么是 GRUB2
GRUB2(GRand Unified Bootloader version 2)是 GNU 项目开发的多引导规范(Multiboot Specification)引导加载程序。它是 GRUB Legacy(0.9x)的完全重写版本,从 2002 年开始开发,2012 年发布 GRUB 2.00 正式版。
GRUB2 的核心职责是在系统加电后、操作系统内核接管之前,负责加载和移交控制权。它是连接硬件固件(BIOS/UEFI)与操作系统内核之间的桥梁。
GRUB2 vs GRUB Legacy
| 特性 | GRUB Legacy (0.9x) | GRUB2 (1.9x+) |
|---|---|---|
| 配置文件 | /boot/grub/menu.lst | /boot/grub/grub.cfg |
| 配置语言 | 简单命令集 | 完整脚本语言(支持变量、条件、循环) |
| 文件系统支持 | 有限 | ext2/3/4、XFS、Btrfs、ZFS、NTFS、FAT 等 |
| UEFI 支持 | 不支持 | 完整支持 |
| Secure Boot | 不支持 | 通过 shim 支持 |
| 图形界面 | 有限 | GfxMenu 主题系统 |
| 模块化 | 静态编译 | 运行时加载模块 |
| 网络引导 | 有限 | PXE、TFTP、HTTP、NFS |
| 动态配置 | 不支持 | 环境变量、脚本 |
主要特性
- 多架构支持:x86、x86_64、ARM、ARM64、MIPS、PowerPC、SPARC、RISC-V
- 多文件系统:原生支持主流文件系统,无需单独编译模块
- 链式加载(Chainloading):可引导其他引导加载程序(如 Windows Boot Manager)
- 脚本语言:支持变量赋值、条件判断、循环、函数定义
- 救援模式:内置命令行 Shell,可在配置损坏时手动引导
- 网络引导:支持 PXE、TFTP、HTTP、NFS 等网络引导协议
- 加密支持:支持 LUKS 加密分区的解密引导
- 国际化:支持多种语言和字符集
1.2 与其他引导加载程序的对比
1.2.1 GRUB2 vs systemd-boot
systemd-boot(原名 gummiboot)是 systemd 项目附带的轻量级引导加载程序,仅支持 UEFI 模式。
| 特性 | GRUB2 | systemd-boot |
|---|---|---|
| BIOS 支持 | ✅ 完整支持 | ❌ 仅 UEFI |
| 配置复杂度 | 较高 | 极低 |
| 文件系统支持 | 广泛 | 仅 FAT(EFI 分区) |
| 主题/图形 | ✅ GfxMenu | ❌ 纯文本 |
| 脚本能力 | 完整脚本语言 | 无 |
| 链式加载 | ✅ | 有限 |
| 加密引导 | ✅ LUKS | 有限(需 unified kernel image) |
| 自动检测 OS | ✅ os-prober | ❌ 手动配置 |
| 安全启动 | ✅ shim | ✅ shim |
| 启动速度 | 稍慢 | 更快 |
| 维护难度 | 中等 | 低 |
| 适用场景 | 多系统、复杂需求 | 单系统、简单需求 |
1.2.2 GRUB2 vs EFISTUB
EFISTUB 不是一个独立的引导加载程序,而是直接利用 UEFI 固件能力从 EFI 分区加载内核。
| 特性 | GRUB2 | EFISTUB |
|---|---|---|
| 额外软件 | 需要 GRUB | 不需要 |
| 配置 | grub.cfg | efibootmgr |
| 内核位置 | /boot(任意分区) | EFI 系统分区(FAT32) |
| 启动参数 | grub.cfg 中灵活配置 | EFI 变量或自动加载 |
| 多内核管理 | 方便(menuentry) | 需手动配置每个 |
| initramfs 位置 | 任意位置 | 必须在 EFI 分区 |
| 调试能力 | GRUB Shell | 有限 |
| Secure Boot | shim | 直接签名 |
1.2.3 GRUB2 vs rEFInd
rEFInd 是一个 UEFI 引导管理器,以图形化界面和自动检测著称。
| 特性 | GRUB2 | rEFInd |
|---|---|---|
| BIOS 支持 | ✅ | ❌ |
| 图形界面 | 需主题配置 | 开箱即用 |
| 自动检测 | os-prober | 自动扫描 EFI 分区 |
| 配置复杂度 | 中等 | 低 |
| 主题生态 | 丰富 | 丰富 |
| 脚本能力 | 完整 | 有限 |
| 多系统引导 | 优秀 | 优秀 |
| 安全启动 | shim | shim 或 PreLoader |
1.3 引导流程详解
1.3.1 Legacy BIOS + MBR 引导流程
┌─────────────┐
│ 电源开启 │
└──────┬──────┘
▼
┌─────────────┐
│ POST 自检 │ ← 硬件初始化
└──────┬──────┘
▼
┌─────────────┐
│ BIOS 固件 │ ← 读取启动顺序
└──────┬──────┘
▼
┌─────────────────────────────┐
│ 读取 MBR (第一扇区 512字节) │ ← 引导扇区
└──────┬──────────────────────┘
▼
┌─────────────────────────────┐
│ 执行 GRUB2 Stage 1 │ ← 嵌入 MBR 中的引导代码
│ (boot.img - 446 字节) │
└──────┬──────────────────────┘
▼
┌─────────────────────────────┐
│ 加载 GRUB2 Stage 1.5 │ ← 位于 MBR 后的间隙
│ (core.img) │ 或分区头部
└──────┬──────────────────────┘
▼
┌─────────────────────────────┐
│ 加载 GRUB2 Stage 2 │ ← /boot/grub/ 下的模块
│ (grub.cfg + 模块) │
└──────┬──────────────────────┘
▼
┌─────────────────────────────┐
│ 显示引导菜单 │ ← 读取 grub.cfg
└──────┬──────────────────────┘
▼
┌─────────────────────────────┐
│ 加载内核 (vmlinuz) │ ← 解压并加载到内存
│ 加载 initramfs │ ← 初始内存文件系统
└──────┬──────────────────────┘
▼
┌─────────────────────────────┐
│ 内核接管,执行 init/systemd │
└─────────────────────────────┘
1.3.2 UEFI + GPT 引导流程
┌─────────────┐
│ 电源开启 │
└──────┬──────┘
▼
┌─────────────┐
│ UEFI 固件 │ ← 安全启动验证(可选)
└──────┬──────┘
▼
┌──────────────────────────────┐
│ 读取 EFI 启动变量 │
│ (BootOrder / BootXXXX) │
└──────┬───────────────────────┘
▼
┌──────────────────────────────┐
│ 加载 EFI 应用 │
│ /EFI/<distro>/grubx64.efi │ ← 或 shimx64.efi (Secure Boot)
└──────┬───────────────────────┘
▼
┌──────────────────────────────┐
│ GRUB2 加载模块 │
│ 读取 grub.cfg │
└──────┬───────────────────────┘
▼
┌──────────────────────────────┐
│ 显示引导菜单 │
└──────┬───────────────────────┘
▼
┌──────────────────────────────┐
│ 加载内核 + initramfs │
└──────┬───────────────────────┘
▼
┌──────────────────────────────┐
│ 内核接管 │
└──────────────────────────────┘
1.3.3 关键区别总结
| 阶段 | Legacy BIOS | UEFI |
|---|---|---|
| 固件 | BIOS(16 位实模式) | UEFI(32/64 位保护模式) |
| 引导代码位置 | MBR(磁盘第一扇区) | EFI 系统分区(FAT32) |
| 引导代码大小限制 | 446 字节 | 无限制 |
| 分区表 | MBR(最多 4 主分区) | GPT(几乎无限分区) |
| 安全启动 | 不支持 | Secure Boot 支持 |
| 磁盘大小限制 | 2 TB | 无限制 |
| 启动模式 | 16 位 | 32/64 位 |
1.4 适用场景
1.4.1 适合使用 GRUB2 的场景
🏢 场景 1:多系统桌面 同时安装 Windows 和多个 Linux 发行版,需要一个统一的引导界面来选择启动哪个系统。GRUB2 的 os-prober 可以自动检测已安装的操作系统,链式加载(Chainload)能力可以正确引导 Windows Boot Manager。
🏢 场景 2:服务器环境 生产服务器需要可靠的引导管理。GRUB2 支持串口控制台输出,可以在无显示器的服务器上通过串口管理引导过程。救援模式可以在系统损坏时提供手动引导能力。
🏢 场景 3:需要加密引导 使用 LUKS 加密根分区时,GRUB2 可以在引导阶段解密加密分区,配合 initramfs 实现完整的加密启动链。
🏢 场景 4:网络引导/PXE 在大规模部署环境中,通过 PXE 网络引导安装操作系统。GRUB2 原生支持 TFTP、HTTP、NFS 等网络协议。
🏢 场景 5:BIOS 系统 仍在使用 Legacy BIOS 的旧硬件,GRUB2 是为数不多的现代引导加载程序选择。
1.4.2 可以考虑其他方案的场景
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 单 Linux 系统 + UEFI | systemd-boot 或 EFISTUB | 更简单、更快 |
| 需要精美图形界面 | rEFInd | 开箱即用的图形化 |
| Arch Linux 最小化 | systemd-boot | 官方推荐 |
| ChromeOS 风格 | depthcharge | 专用引导程序 |
| 嵌入式设备 | U-Boot | 硬件级支持 |
1.5 GRUB2 的组成
1.5.1 核心组件
| 组件 | 路径 | 说明 |
|---|---|---|
| boot.img | BIOS: MBR | Stage 1 引导代码,446 字节 |
| core.img | BIOS: MBR 后间隙 | Stage 1.5,包含文件系统驱动 |
| grubx64.efi | EFI 分区 | UEFI 模式的 GRUB 主程序 |
| grub.cfg | /boot/grub/ | 主配置文件 |
| grubenv | /boot/grub/ | 环境变量存储(如默认启动项) |
| 模块 | /boot/grub/x86_64-efi/ 或 /boot/grub/i386-pc/ | 可加载模块 |
| 字体 | /boot/grub/fonts/ | 引导界面字体 |
| 主题 | /boot/grub/themes/ | 主题资源 |
1.5.2 用户空间工具
| 工具 | 功能 |
|---|---|
| grub-install | 安装 GRUB 到磁盘或 EFI 分区 |
| grub-mkconfig | 生成 grub.cfg 配置文件 |
| update-grub | grub-mkconfig 的发行版封装(Debian/Ubuntu) |
| grub-mkimage | 创建自定义 GRUB 镜像 |
| grub-mkrescue | 创建可引导的救援镜像 |
| grub-editenv | 编辑 GRUB 环境变量 |
| grub-probe | 探测设备信息 |
| grub-mount | 挂载 GRUB 支持的文件系统(调试用) |
1.6 GRUB2 命名约定
1.6.1 设备命名
GRUB2 使用自己的设备命名体系,与 Linux 设备文件不同:
| GRUB 设备 | Linux 设备 | 说明 |
|---|---|---|
| (hd0) | /dev/sda | 第一块磁盘 |
| (hd1) | /dev/sdb | 第二块磁盘 |
| (hd0,msdos1) | /dev/sda1 | MBR 磁盘第一分区 |
| (hd0,gpt1) | /dev/sda1 | GPT 磁盘第一分区 |
| (hd0,gpt2) | /dev/sda2 | GPT 磁盘第二分区 |
⚠️ 注意:GRUB2 的设备编号从 0 开始,分区编号也从 0 开始(MBR)或 1 开始(GPT)。这与 Linux 的从 1 开始不同。
1.6.2 文件路径
GRUB2 中引用文件的格式为 (设备)/路径:
(hd0,gpt2)/boot/vmlinuz-6.1.0-amd64
(hd0,gpt1)/EFI/debian/grubx64.efi
如果指定了 root 可以省略设备:
set root=(hd0,gpt2)
linux /boot/vmlinuz-6.1.0-amd64 root=/dev/sda2
1.7 版本历史
| 版本 | 发布时间 | 主要变化 |
|---|---|---|
| 1.90 | 2008 | 首个 GRUB2 测试版 |
| 1.99 | 2011 | 大量功能完善 |
| 2.00 | 2012 | 首个正式版 |
| 2.02 | 2017 | 引入 Btrfs 子卷支持、改进 Secure Boot |
| 2.04 | 2019 | 安全修复、NVMe 支持改进 |
| 2.06 | 2021 | 安全加固、改进 LUKS2 支持 |
| 2.12 | 2023 | 性能优化、新文件系统支持 |
1.8 扩展阅读
下一章:第 2 章:安装与部署