强曰为道

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

第 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 安装目标
UEFIGPT需要(FAT32,通常 100-512MB)EFI 系统分区
UEFIMBR需要(少见,兼容模式)EFI 系统分区
Legacy BIOSMBR不需要MBR + 间隙
Legacy BIOSGPT不需要(需 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-amd64Debian/UbuntuUEFI 模式 GRUB
grub-pcDebian/UbuntuBIOS 模式 GRUB
grub2-efi-x64RHEL/FedoraUEFI 模式 GRUB
grub2-pcRHEL/FedoraBIOS 模式 GRUB
grubArch LinuxGRUB 主包(含 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-efii386-pci386-efi
--efi-directory=EFI 分区挂载点/boot/efi
--bootloader-id=EFI 目录中的启动项名称debianGRUB
--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 章:配置文件详解