GRUB2 引导管理器完全教程 / 第 2 章:安装与部署
第 2 章:安装与部署
2.1 安装准备
2.1.1 确认当前引导模式
在安装 GRUB2 之前,首先要确认系统是 UEFI 模式还是 Legacy BIOS 模式。
方法一:检查 EFI 目录
# 如果存在 efivars,说明系统以 UEFI 模式引导
$ ls /sys/firmware/efi/efivars/
方法二:检查 efi 模块
$ [ -d /sys/firmware/efi ] && echo "UEFI 模式" || echo "BIOS 模式"
方法三:查看内核日志
$ dmesg | grep -i efi
# UEFI 模式输出示例:
# [ 0.000000] efi: EFI v2.70 by American Megatrends
# BIOS 模式无相关输出
2.1.2 确认分区表类型
# 查看磁盘分区表类型
$ sudo fdisk -l /dev/sda
# GPT 示例:
# Disklabel type: gpt
# MBR 示例:
# Disklabel type: dos
# 或使用 parted
$ sudo parted /dev/sda print | grep "Partition Table"
# Partition Table: gpt
# Partition Table: msdos
2.1.3 确认磁盘分区布局
# 查看分区布局
$ lsblk -f
# NAME FSTYPE LABEL MOUNTPOINT
# sda
# ├─sda1 vfat EFI /boot/efi
# ├─sda2 ext4 boot /boot
# └─sda3 ext4 root /
# 查看详细分区信息
$ sudo blkid
2.1.4 引导模式与分区表对应关系
| 引导模式 | 分区表 | EFI 分区 | GRUB 安装目标 |
|---|---|---|---|
| UEFI | GPT | 需要(FAT32,通常 100-512MB) | EFI 系统分区 |
| UEFI | MBR | 需要(少见,兼容模式) | EFI 系统分区 |
| Legacy BIOS | MBR | 不需要 | MBR + 间隙 |
| Legacy BIOS | GPT | 不需要(需 BIOS Boot 分区) | BIOS Boot 分区 |
⚠️ 注意:Legacy BIOS + GPT 的组合需要一个特殊的 BIOS Boot 分区(1MB,无文件系统),用于存放 core.img。这是 GPT 磁盘没有 MBR 间隙(MBR gap)的替代方案。
2.2 安装 GRUB2 软件包
2.2.1 Debian/Ubuntu
# UEFI 系统
$ sudo apt update
$ sudo apt install grub-efi-amd64
# BIOS 系统
$ sudo apt install grub-pc
# 公共包(通常已依赖安装)
$ sudo apt install grub-common grub2-common os-prober
2.2.2 RHEL/CentOS/Fedora
# UEFI 和 BIOS 统一包
$ sudo dnf install grub2-efi-x64 grub2-tools grub2-tools-extra
# 或 BIOS
$ sudo dnf install grub2-pc grub2-tools
# os-prober(用于检测其他系统)
$ sudo dnf install os-prober
2.2.3 Arch Linux
$ sudo pacman -S grub efibootmgr os-prober
2.2.4 openSUSE
# UEFI
$ sudo zypper install grub2-x86_64-efi
# BIOS
$ sudo zypper install grub2-i386-pc
软件包对照表
| 包名 | 发行版 | 说明 |
|---|---|---|
| grub-efi-amd64 | Debian/Ubuntu | UEFI 模式 GRUB |
| grub-pc | Debian/Ubuntu | BIOS 模式 GRUB |
| grub2-efi-x64 | RHEL/Fedora | UEFI 模式 GRUB |
| grub2-pc | RHEL/Fedora | BIOS 模式 GRUB |
| grub | Arch Linux | GRUB 主包(含 BIOS 和 UEFI) |
| efibootmgr | 通用 | EFI 启动管理工具 |
| os-prober | 通用 | 检测其他已安装系统 |
2.3 UEFI 模式安装
2.3.1 确认 EFI 系统分区
EFI 系统分区(ESP, EFI System Partition)是 UEFI 引导所必需的。
# 检查是否已有 EFI 分区
$ sudo blkid | grep -i efi
/dev/sda1: LABEL="EFI" UUID="XXXX-XXXX" TYPE="vfat" PARTLABEL="EFI" PARTUUID="xxxx-xxxx"
# 如果没有,需要创建(假设在 /dev/sda 上)
# 1. 使用 gdisk 或 parted 创建分区
$ sudo gdisk /dev/sda
# 创建 512MB 分区,类型 EF00 (EFI System)
# 2. 格式化为 FAT32
$ sudo mkfs.vfat -F 32 -n EFI /dev/sda1
# 3. 挂载
$ sudo mkdir -p /boot/efi
$ sudo mount /dev/sda1 /boot/efi
2.3.2 安装 GRUB 到 EFI 分区
# Debian/Ubuntu
$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
# RHEL/CentOS/Fedora
$ sudo grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=fedora
# Arch Linux
$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
2.3.3 grub-install 参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
--target= | 安装目标平台 | x86_64-efi、i386-pc、i386-efi |
--efi-directory= | EFI 分区挂载点 | /boot/efi |
--bootloader-id= | EFI 目录中的启动项名称 | debian、GRUB |
--root-directory= | 根目录(默认 /) | /mnt/sysimage |
--recheck | 重新检查设备映射 | — |
--no-nvram | 不更新 NVRAM 启动项 | 恢复环境使用 |
--force | 强制安装 | 特殊情况使用 |
--modules= | 预加载模块列表 | part_gpt part_msdos |
--removable | 安装为可移动介质引导 | USB/救援盘 |
2.3.4 安装后的文件结构
UEFI 模式安装后,EFI 分区上会生成以下文件:
/boot/efi/
└── EFI/
└── debian/ # --bootloader-id 指定的名称
├── grubx64.efi # GRUB 主程序
├── grub.cfg # 可选:初始配置(指向 /boot/grub/grub.cfg)
└── fonts/ # 可选:字体
系统 /boot 分区(或根分区)上:
/boot/grub/
├── grub.cfg # 主配置文件
├── grubenv # 环境变量
├── x86_64-efi/ # UEFI 模块目录
│ ├── normal.mod
│ ├── linux.mod
│ ├── chain.mod
│ └── ...(数百个 .mod 文件)
├── fonts/
│ └── unicode.pf2
└── themes/ # 主题目录
2.3.5 验证安装
# 检查 GRUB EFI 文件
$ ls -la /boot/efi/EFI/debian/
# -rwx------ 1 root root 134144 May 10 10:00 grubx64.efi
# 检查 EFI 启动项
$ sudo efibootmgr -v
# Boot0001* debian HD(1,GPT,xxxx-xxxx)/File(\EFI\debian\grubx64.efi)
# 检查 GRUB 模块
$ ls /boot/grub/x86_64-efi/ | head -10
# 检查 grub.cfg
$ head -20 /boot/grub/grub.cfg
2.4 Legacy BIOS 模式安装
2.4.1 MBR 磁盘安装
# 安装到 MBR
$ sudo grub-install --target=i386-pc /dev/sda
# Debian/Ubuntu 使用 update-grub 生成配置
$ sudo update-grub
⚠️ 注意:
grub-install的目标是磁盘(如/dev/sda),不是分区(如/dev/sda1)。
2.4.2 GPT 磁盘 + BIOS 模式安装
当使用 GPT 分区表但以 BIOS 模式引导时,需要一个 BIOS Boot 分区:
# 1. 创建 BIOS Boot 分区(如果还没有)
$ sudo gdisk /dev/sda
# 新建分区,大小 1MB,类型 EF02 (BIOS boot partition)
# 2. 安装 GRUB(自动检测 BIOS Boot 分区)
$ sudo grub-install --target=i386-pc /dev/sda
# 输出:Installing for i386-pc platform.
# Installation finished. No error reported.
2.4.3 BIOS 模式安装后的磁盘结构
MBR 磁盘布局:
┌──────────────────────────────────────────────────┐
│ 扇区 0: MBR (512 字节) │
│ ┌────────────────────────────────────────────┐ │
│ │ 引导代码 (446字节) │ 分区表 (64字节) │ 0x55AA│ │
│ │ boot.img 在这里 │ 4个分区条目 │ │ │
│ └────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────┤
│ 扇区 1 ~ 2047: core.img 位于此间隙 │
│ (MBR 后、第一个分区前的未分配空间) │
├──────────────────────────────────────────────────┤
│ 分区 1: /boot (ext4) │
│ ├── grub/ │
│ │ ├── grub.cfg │
│ │ ├── i386-pc/ ← BIOS 模块目录 │
│ │ └── ... │
│ └── vmlinuz, initramfs │
└──────────────────────────────────────────────────┘
2.5 安装目标设备
2.5.1 安装到磁盘(常规)
# 安装到第一块磁盘的 MBR
$ sudo grub-install /dev/sda
# 安装到第二块磁盘的 MBR(双盘冗余场景)
$ sudo grub-install /dev/sdb
2.5.2 安装到分区(不推荐)
# 安装到分区的引导扇区(仅特殊场景)
$ sudo grub-install --force /dev/sda1
⚠️ 注意:将 GRUB 安装到分区(而非磁盘)是不推荐的做法,该分区的文件系统可能会覆盖引导代码。仅在链式加载(Chainloading)等特殊场景下使用。
2.5.3 安装到可移动介质(USB)
# 创建可引导 USB 盘
$ sudo grub-install --target=x86_64-efi --efi-directory=/mnt/usb/boot/efi --removable
# 创建 BIOS 模式可引导 USB
$ sudo grub-install --target=i386-pc --boot-directory=/mnt/usb/boot /dev/sdb
使用 --removable 参数时,GRUB 会安装为默认引导路径 EFI/BOOT/BOOTX64.EFI,这是 UEFI 规范中可移动介质的默认引导文件。
2.5.4 在 chroot 环境中安装
当从 Live 系统修复已安装系统时:
# 1. 挂载目标系统
$ sudo mount /dev/sda2 /mnt
$ sudo mount /dev/sda1 /mnt/boot/efi
# 2. 挂载必要虚拟文件系统
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /dev/pts /mnt/dev/pts
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys
# 3. 对于 UEFI,还需挂载 efivars
$ sudo mount -t efivarfs efivarfs /mnt/sys/firmware/efi/efivars
# 4. chroot 进入目标系统
$ sudo chroot /mnt
# 5. 在 chroot 环境中安装 GRUB
# UEFI:
$ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
# BIOS:
$ grub-install /dev/sda
# 6. 生成配置
$ update-grub
# 7. 退出并卸载
$ exit
$ sudo umount -R /mnt
2.6 安装验证清单
安装完成后,按以下清单逐项检查:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| GRUB 文件存在 | ls /boot/grub/ | 有 grub.cfg、grubenv 等 |
| 模块已安装 | ls /boot/grub/<平台>/ | 列出 .mod 文件 |
| EFI 文件存在 | ls /boot/efi/EFI/<id>/grubx64.efi | 文件存在 |
| EFI 启动项注册 | efibootmgr -v | 有对应启动项 |
| grub.cfg 有效 | head -20 /boot/grub/grub.cfg | 内容正确 |
| 内核条目存在 | grep menuentry /boot/grub/grub.cfg | 有内核条目 |
2.7 Secure Boot 注意事项
在启用 Secure Boot 的系统上,直接安装 grubx64.efi 将无法引导,因为固件会拒绝未签名的 EFI 程序。需要通过 shim 进行引导:
UEFI 固件 → shimx64.efi (已签名) → grubx64.efi (由发行版签名) → 内核
# 安装 shim(通常随 GRUB 一起安装)
$ sudo apt install shim-signed grub-efi-amd64-signed # Debian/Ubuntu
$ sudo dnf install shim-x64 grub2-efi-x64 # RHEL/Fedora
# 安装 GRUB(使用 shim 作为引导入口)
$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
Secure Boot 的详细内容将在第 9 章中深入讨论。
2.8 常见安装问题
问题 1:grub-install: error: cannot find EFI directory
# 原因:EFI 分区未挂载或路径错误
$ sudo mount /dev/sda1 /boot/efi
$ sudo grub-install --efi-directory=/boot/efi --target=x86_64-efi
问题 2:grub-install: error: will not proceed with blocklists
# 原因:尝试安装到分区而非磁盘,且未使用 --force
# 解决:安装到磁盘
$ sudo grub-install /dev/sda
问题 3:安装后重启直接进入 Windows
# 原因:EFI 启动顺序中 Windows 优先
# 解决:调整启动顺序
$ sudo efibootmgr -o 0001,0000 # 将 debian (0001) 放在 Windows 前面
问题 4:error: unknown filesystem
# 原因:GRUB 缺少对应文件系统的模块
# 解决:重新安装并指定模块
$ sudo grub-install --target=i386-pc --modules="part_gpt part_msdos ext2 fat" /dev/sda
2.9 扩展阅读
上一章:第 1 章:GRUB2 概述 | 下一章:第 3 章:配置文件详解