1. GRUB2 概述

GRUB2(GRand Unified Bootloader version 2)是当今绝大多数 Linux 发行版默认使用的引导加载程序。它负责在计算机开机后、操作系统内核运行之前,完成硬件初始化、内核选择与加载的关键任务。理解 GRUB2 的历史渊源、与旧版 GRUB Legacy 的差异,以及它在 Linux 启动流程中的确切位置,是掌握后续主题配置与内核定制的基础。

1.1 GRUB 的历史演进

GRUB 项目由 Erich Boleyn 于 1995 年发起,最初是为 GNU Hurd 操作系统设计的引导加载程序。1999 年,GRUB 被纳入 GNU 项目,成为自由软件基金会官方推荐的引导加载程序。2002 年,GRUB 0.9x 系列(即 GRUB Legacy)成为 Linux 发行版的主流选择。

然而,GRUB Legacy 存在明显的架构限制:代码难以维护、不支持动态加载模块、对非 x86 平台支持薄弱。2002 年,GRUB 2 项目启动,采用完全重写的架构。经过近十年的开发迭代,2010 年 GRUB 2 1.98 版本被 Ubuntu 10.04 采用,标志着 GRUB 2 正式成为主流。如今,GRUB 2 已发展到 2.12 版本,支持 x86、ARM、RISC-V 等多种架构,并具备强大的主题定制能力。

关键时间线:
  • 1995 — GRUB 项目启动,目标为 GNU Hurd 提供引导支持。
  • 1999 — GRUB 成为 GNU 项目官方组件,GRUB Legacy 0.9x 发布。
  • 2002 — GRUB 2 项目启动,采用模块化、可扩展架构。
  • 2010 — Ubuntu 10.04 默认使用 GRUB 2,标志其成为主流。
  • 2024 — GRUB 2 2.12 发布,支持安全启动、LUKS2、Btrfs 快照等现代特性。

1.2 GRUB Legacy 与 GRUB 2 的核心区别

GRUB Legacy 与 GRUB 2 虽然名称相似,但内部架构差异巨大。下表从多个维度对比两者的关键区别:

对比维度 GRUB Legacy GRUB 2
架构设计 单体式,所有功能编译进核心 模块化,核心 + 动态加载模块
配置文件 menu.lst,手动编辑 grub.cfg,自动生成 + 用户自定义片段
脚本支持 有限,仅支持简单命令 完整脚本语言:变量、循环、条件判断、函数
主题/图形 仅文本模式,无图形主题 支持 1024×768 及以上分辨率、背景图、字体、进度条
文件系统支持 ext2/3、FAT、FFS ext2/3/4、Btrfs、XFS、ZFS、NTFS、HFS+ 等 20+ 种
平台支持 仅 x86(BIOS) x86 BIOS/UEFI、x86_64、ARM、RISC-V、LoongArch
安全启动 不支持 支持 UEFI Secure Boot、TPM 测量
救援模式 命令行,功能有限 内置 rescue shell,支持模块加载、文件系统修复
迁移建议: 如果你仍在使用 GRUB Legacy(常见于 CentOS 5/6、Debian 5 等老旧系统),强烈建议升级到 GRUB 2。GRUB Legacy 已停止维护,且不支持现代文件系统、UEFI 和安全启动。升级路径通常为:安装 GRUB 2 包 → 运行 grub2-install → 生成 grub.cfg。

1.3 GRUB 2 在 Linux 启动流程中的位置与作用

Linux 系统的完整启动流程可分为五个阶段,GRUB 2 占据其中最关键的第二阶段。以下 SVG 图清晰展示了从按下电源键到登录提示符的完整链路:

Linux 启动流程与 GRUB 2 的位置 BIOS / UEFI 硬件自检 (POST) 选择启动设备 GRUB 2 引导加载 加载 boot.img / core.img 解析 grub.cfg → 显示菜单 Linux 内核 解压并初始化 挂载 initramfs init / systemd PID 1 启动 执行默认 target 用户空间服务 网络、显示管理器 登录提示符 GRUB 2 内部阶段详解 boot.img (512B) core.img (模块) grub.cfg → 菜单显示 → 内核加载 GRUB 2 是硬件与操作系统内核之间的桥梁,负责内核选择、参数传递与早期硬件初始化

GRUB 2 在启动流程中承担以下核心作用:

  1. 硬件抽象层 — 通过自身驱动访问磁盘、文件系统,不依赖 BIOS/UEFI 的磁盘服务。
  2. 内核选择器 — 读取 grub.cfg 配置文件,向用户展示可用的内核版本列表。
  3. 参数传递器 — 将用户选择的启动参数(如 quiet、single、nomodeset)传递给内核。
  4. initramfs 加载器 — 将初始内存文件系统(initramfs)加载到内存,供内核挂载根文件系统前使用。
  5. 链式加载器 — 支持加载其他操作系统引导程序(如 Windows Boot Manager、其他 Linux 发行版)。
常见误区: 很多初学者认为 GRUB 2 是“操作系统的一部分”。实际上,GRUB 2 是独立于操作系统的引导加载程序,它位于磁盘的引导扇区(MBR 或 EFI 系统分区),在操作系统运行之前就已经开始执行。即使 Linux 内核损坏,GRUB 2 仍然可以启动并提供救援模式。

1.4 GRUB 2 的模块化架构

GRUB 2 采用模块化设计,核心镜像 core.img 仅包含最小必要模块,其他功能(如文件系统驱动、视频驱动、网络支持)以独立 .mod 文件形式存储在 /boot/grub/ 目录下,按需加载。这种设计带来以下优势:

  • 镜像体积小 — core.img 通常只有 25~50KB,适合嵌入 MBR 或 EFI 引导分区。
  • 功能可扩展 — 无需重新编译核心,只需添加模块文件即可支持新文件系统或硬件。
  • 按需加载 — 仅在需要时加载对应模块,减少内存占用和启动时间。
  • 易于调试 — 模块独立,单个模块故障不会导致整个引导程序崩溃。

以下 SVG 图展示 GRUB 2 的模块化架构:

GRUB 2 模块化架构 core.img 内核 + 最小模块 文件系统模块 视频/终端模块 网络模块 安全/加密模块 grub.cfg 配置文件 主题资源:背景图 / 字体 / 图标 / 进度条

模块化架构使得 GRUB 2 能够灵活适应不同硬件环境。例如,在 UEFI 系统上,GRUB 2 会加载 efi_netboot 模块支持网络引导;在需要解密 LUKS 加密根分区时,加载 cryptodisk 和 luks2 模块。这种按需加载机制是 GRUB 2 相比 GRUB Legacy 最显著的架构改进。

1.5 本章小结

GRUB 2 作为现代 Linux 系统的标准引导加载程序,经历了从 GRUB Legacy 到模块化架构的重大演进。它位于 BIOS/UEFI 与 Linux 内核之间,承担硬件抽象、内核选择、参数传递和 initramfs 加载等关键职责。理解 GRUB 2 的历史背景、架构差异和启动流程位置,为后续章节的主题配置、菜单定制和故障排查奠定了坚实基础。

核心要点回顾:
  • GRUB 2 是 GRUB Legacy 的完全重写版本,采用模块化架构。
  • GRUB 2 支持 UEFI、安全启动、20+ 文件系统、图形主题等现代特性。
  • 在启动流程中,GRUB 2 位于 BIOS/UEFI 之后、Linux 内核之前。
  • 模块化设计使 core.img 保持小巧,功能通过 .mod 文件按需扩展。
  • 配置文件 grub.cfg 通常由 grub-mkconfig 自动生成,用户可通过 /etc/default/grub 和 /etc/grub.d/ 自定义。