强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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
动态配置不支持环境变量、脚本

主要特性

  1. 多架构支持:x86、x86_64、ARM、ARM64、MIPS、PowerPC、SPARC、RISC-V
  2. 多文件系统:原生支持主流文件系统,无需单独编译模块
  3. 链式加载(Chainloading):可引导其他引导加载程序(如 Windows Boot Manager)
  4. 脚本语言:支持变量赋值、条件判断、循环、函数定义
  5. 救援模式:内置命令行 Shell,可在配置损坏时手动引导
  6. 网络引导:支持 PXE、TFTP、HTTP、NFS 等网络引导协议
  7. 加密支持:支持 LUKS 加密分区的解密引导
  8. 国际化:支持多种语言和字符集

1.2 与其他引导加载程序的对比

1.2.1 GRUB2 vs systemd-boot

systemd-boot(原名 gummiboot)是 systemd 项目附带的轻量级引导加载程序,仅支持 UEFI 模式。

特性GRUB2systemd-boot
BIOS 支持✅ 完整支持❌ 仅 UEFI
配置复杂度较高极低
文件系统支持广泛仅 FAT(EFI 分区)
主题/图形✅ GfxMenu❌ 纯文本
脚本能力完整脚本语言
链式加载有限
加密引导✅ LUKS有限(需 unified kernel image)
自动检测 OS✅ os-prober❌ 手动配置
安全启动✅ shim✅ shim
启动速度稍慢更快
维护难度中等
适用场景多系统、复杂需求单系统、简单需求

1.2.2 GRUB2 vs EFISTUB

EFISTUB 不是一个独立的引导加载程序,而是直接利用 UEFI 固件能力从 EFI 分区加载内核。

特性GRUB2EFISTUB
额外软件需要 GRUB不需要
配置grub.cfgefibootmgr
内核位置/boot(任意分区)EFI 系统分区(FAT32)
启动参数grub.cfg 中灵活配置EFI 变量或自动加载
多内核管理方便(menuentry)需手动配置每个
initramfs 位置任意位置必须在 EFI 分区
调试能力GRUB Shell有限
Secure Bootshim直接签名

1.2.3 GRUB2 vs rEFInd

rEFInd 是一个 UEFI 引导管理器,以图形化界面和自动检测著称。

特性GRUB2rEFInd
BIOS 支持
图形界面需主题配置开箱即用
自动检测os-prober自动扫描 EFI 分区
配置复杂度中等
主题生态丰富丰富
脚本能力完整有限
多系统引导优秀优秀
安全启动shimshim 或 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 BIOSUEFI
固件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 系统 + UEFIsystemd-boot 或 EFISTUB更简单、更快
需要精美图形界面rEFInd开箱即用的图形化
Arch Linux 最小化systemd-boot官方推荐
ChromeOS 风格depthcharge专用引导程序
嵌入式设备U-Boot硬件级支持

1.5 GRUB2 的组成

1.5.1 核心组件

组件路径说明
boot.imgBIOS: MBRStage 1 引导代码,446 字节
core.imgBIOS: MBR 后间隙Stage 1.5,包含文件系统驱动
grubx64.efiEFI 分区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-grubgrub-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/sda1MBR 磁盘第一分区
(hd0,gpt1)/dev/sda1GPT 磁盘第一分区
(hd0,gpt2)/dev/sda2GPT 磁盘第二分区

⚠️ 注意: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.902008首个 GRUB2 测试版
1.992011大量功能完善
2.002012首个正式版
2.022017引入 Btrfs 子卷支持、改进 Secure Boot
2.042019安全修复、NVMe 支持改进
2.062021安全加固、改进 LUKS2 支持
2.122023性能优化、新文件系统支持

1.8 扩展阅读


下一章:第 2 章:安装与部署