Linux GRUB 手动安装完全指南:从原理到实践

在 Linux 系统中,GRUB(Grand Unified Bootloader)是绝大多数发行版默认的引导加载程序(Bootloader),负责在计算机启动时加载操作系统内核并将控制权移交。无论是双系统配置、系统迁移,还是修复引导故障,手动安装 GRUB 都是一项必备技能。本文将从基础原理出发,详细讲解 GRUB 的手动安装流程、常见场景、最佳实践及故障排查,帮助读者彻底掌握这一核心操作。

目录#

  1. 什么是 GRUB?
  2. 何时需要手动安装 GRUB?
  3. 安装前的准备工作
    • 3.1 准备 Live Linux 环境
    • 3.2 识别目标磁盘与分区
    • 3.3 区分 BIOS/MBR 与 UEFI/GPT 固件
  4. GRUB 手动安装完整步骤
    • 4.1 BIOS/MBR 系统安装流程
    • 4.2 UEFI/GPT 系统安装流程
  5. 常见场景与示例操作
    • 5.1 修复 Windows 覆盖 MBR 后的引导(BIOS 场景)
    • 5.2 迁移系统到新硬盘后安装 GRUB(UEFI 场景)
    • 5.3 LVM/RAID 环境下的 GRUB 安装
  6. 最佳实践与注意事项
  7. 常见问题与故障排查
  8. 总结
  9. 参考资料

1. 什么是 GRUB?#

GRUB(Grand Unified Bootloader)是一个开源的多操作系统引导加载程序,目前广泛使用的版本是 GRUB 2(GRUB Legacy 已淘汰)。它的核心功能包括:

  • 解析磁盘分区表,识别操作系统内核(如 Linux 内核、Windows Boot Manager);
  • 提供交互式引导菜单,支持手动选择启动项;
  • 加载内核到内存并传递启动参数(如 quiet splashnomodeset 等)。

GRUB 通常安装在磁盘的 主引导记录(MBR)EFI 系统分区(ESP) 中,是计算机启动流程的关键环节(启动顺序:BIOS/UEFI → GRUB → 操作系统内核)。

2. 何时需要手动安装 GRUB?#

GRUB 通常由 Linux 安装程序自动配置,但以下场景可能需要手动安装:

  • 双系统冲突:安装 Windows 后,其引导程序会覆盖 MBR 或 ESP 中的 GRUB(Windows 仅识别自身引导项);
  • 引导故障:GRUB 配置文件损坏(如 /boot/grub/grub.cfg)、磁盘分区调整或文件系统错误导致 GRUB 无法加载;
  • 系统迁移:将 Linux 系统克隆/迁移到新硬盘后,需重新安装 GRUB 到新硬盘的引导区域;
  • 多磁盘引导:需将 GRUB 安装到非默认磁盘(如从 SSD 启动,HDD 存储数据);
  • UEFI/BIOS 模式切换:从 BIOS 升级到 UEFI 固件后,需重新安装 GRUB 以适配新引导方式。

3. 安装前的准备工作#

手动安装 GRUB 需谨慎操作,避免误操作导致数据丢失。以下是必要的准备步骤:

3.1 准备 Live Linux 环境#

需通过 Live CD/USB 启动计算机(推荐使用与目标系统相同的发行版,如 Ubuntu Live USB),确保能访问目标系统的根分区。制作方法:使用工具(如 Rufus、Etcher)将 ISO 镜像写入 U 盘,从 U 盘启动并选择“试用 Ubuntu”(不安装系统)。

3.2 识别目标磁盘与分区#

通过命令行工具识别磁盘和分区结构,核心工具包括:

  • lsblk:列出所有磁盘及分区(推荐,输出清晰);
  • fdisk -l /dev/sdX:查看指定磁盘的分区表(需替换 sdX 为目标磁盘,如 sda);
  • blkid:查看分区的文件系统类型(如 ext4vfat)和 UUID。

示例输出(lsblk):

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi  # UEFI 系统的 ESP 分区(FAT32)
├─sda2   8:2    0    16G  0 part [SWAP]
└─sda3   8:3    0 449.3G  0 part /          # Linux 根分区(ext4)
sdb      8:16   0 931.5G  0 disk             # 新硬盘(待安装 GRUB)

关键信息:记录根分区(如 /dev/sda3)、ESP 分区(UEFI 场景,如 /dev/sda1)和目标磁盘(如 /dev/sda)。

3.3 区分 BIOS/MBR 与 UEFI/GPT 固件#

GRUB 的安装方式取决于计算机的固件类型(BIOS 或 UEFI)和磁盘分区表格式(MBR 或 GPT),需提前确认:

  • BIOS/MBR:传统固件,引导程序存储在 MBR(磁盘的前 512 字节),支持最大磁盘容量 2TB,分区数量有限(主分区 ≤4);
  • UEFI/GPT:现代固件,引导程序存储在 ESP(EFI 系统分区,通常为 FAT32 格式,大小 100-512MB),支持大容量磁盘和无限分区。

判断方法

  • 启动 Live 系统后,检查是否存在 /sys/firmware/efi 目录:若存在则为 UEFI 模式,否则为 BIOS 模式;
  • 或通过 fdisk -l /dev/sdX 查看分区表类型(输出中含 Disklabel type: gptdos)。

4. GRUB 手动安装完整步骤#

根据固件类型(BIOS/UEFI),GRUB 安装流程略有不同,以下分场景详解。

4.1 BIOS/MBR 系统安装流程#

步骤 1:挂载目标系统的根分区#

假设目标根分区为 /dev/sda3,挂载到 Live 系统的 /mnt 目录:

sudo mount /dev/sda3 /mnt  # 挂载根分区

若系统有独立的 /boot 分区(如 /dev/sda2),需额外挂载:

sudo mount /dev/sda2 /mnt/boot  # 挂载 /boot 分区(如有)

步骤 2:绑定系统必要目录(chroot 准备)#

为确保 chroot 环境正常运行,需挂载 Linux 内核的虚拟文件系统:

sudo mount --bind /dev /mnt/dev        # 设备文件
sudo mount --bind /proc /mnt/proc      # 进程信息
sudo mount --bind /sys /mnt/sys        # 系统信息
sudo mount --bind /run /mnt/run        # 运行时数据(可选,部分发行版需要)

步骤 3:切换到目标系统的根环境(chroot)#

通过 chroot 命令将当前目录切换为目标系统的根目录,后续操作将直接影响目标系统:

sudo chroot /mnt  # 切换到目标系统根环境

此时命令行提示符会变为目标系统的用户(如 root@ubuntu:/#)。

步骤 4:安装 GRUB 到 MBR#

执行 grub-install 命令,将 GRUB 核心文件安装到磁盘的 MBR(注意:目标是磁盘而非分区,如 /dev/sda,不带数字):

grub-install /dev/sda  # 将 GRUB 安装到 /dev/sda 的 MBR

成功提示:输出 Installation finished. No error reported. 表示安装成功。

步骤 5:生成 GRUB 配置文件#

GRUB 配置文件(/boot/grub/grub.cfg)需根据当前系统内核和启动项自动生成:

update-grub  # 扫描系统内核和其他 OS,生成配置文件

补充:若需识别 Windows 等其他系统,需先安装 os-prober(部分发行版默认不安装):

apt install os-prober  # Debian/Ubuntu 系
# 或 dnf install os-prober  # RHEL/CentOS/Fedora 系
update-grub  # 重新生成配置

步骤 6:退出 chroot 并重启#

exit  # 退出 chroot 环境
sudo umount -R /mnt  # 卸载所有挂载的分区
sudo reboot  # 重启计算机,测试 GRUB 是否正常加载

4.2 UEFI/GPT 系统安装流程#

UEFI 场景需额外关注 EFI 系统分区(ESP),其作用是存储 GRUB 的 EFI 可执行文件(如 grubx64.efi)。

步骤 1:挂载根分区与 ESP 分区#

假设根分区为 /dev/sda3,ESP 分区为 /dev/sda1(FAT32 格式,挂载点通常为 /boot/efi):

sudo mount /dev/sda3 /mnt  # 挂载根分区
sudo mount /dev/sda1 /mnt/boot/efi  # 挂载 ESP 分区到 /boot/efi

若有独立 /boot 分区,需先挂载 /boot,再挂载 ESP 到 /boot/efi

sudo mount /dev/sda2 /mnt/boot  # 挂载 /boot 分区(如有)
sudo mount /dev/sda1 /mnt/boot/efi  # 再挂载 ESP 分区

步骤 2:绑定系统必要目录(同 BIOS 步骤 2)#

sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo mount --bind /run /mnt/run

步骤 3:chroot 到目标系统#

sudo chroot /mnt

步骤 4:安装 GRUB 到 ESP 分区#

UEFI 场景需指定目标架构(如 x86_64-efi)和 ESP 目录:

grub-install \
  --target=x86_64-efi \          # 目标架构(64位 UEFI)
  --efi-directory=/boot/efi \    # ESP 分区挂载点
  --bootloader-id=ubuntu \       # 引导项名称(可自定义,如 "debian")
  --recheck \                    # 强制重新检查设备(避免缓存问题)
  /dev/sda                       # 目标磁盘(可选,部分场景需指定)

参数说明

  • --target=x86_64-efi:适用于 64 位 UEFI 系统(32 位为 i386-efi);
  • --bootloader-id:在 UEFI 固件的启动项列表中显示的名称(如“ubuntu”);
  • --recheck:防止因磁盘分区变化导致的安装错误。

步骤 5:生成 GRUB 配置文件(同 BIOS 步骤 5)#

update-grub  # 扫描内核和其他 OS,生成 /boot/grub/grub.cfg

步骤 6:退出 chroot 并重启#

exit
sudo umount -R /mnt  # 卸载分区
sudo reboot

5. 常见场景与示例操作#

5.1 修复 Windows 覆盖 MBR 后的引导(BIOS 场景)#

问题描述:安装 Windows 后,GRUB 引导菜单消失,直接进入 Windows。
原因:Windows 安装程序会覆盖磁盘 MBR 中的 GRUB。

解决步骤

  1. 用 Live USB 启动,通过 lsblk 确认 Linux 根分区(如 /dev/sda5)和磁盘(/dev/sda);
  2. 挂载根分区并 chroot:
    sudo mount /dev/sda5 /mnt
    sudo mount --bind /dev /mnt/dev && sudo mount --bind /proc /mnt/proc && sudo mount --bind /sys /mnt/sys
    sudo chroot /mnt
  3. 重新安装 GRUB 到 MBR:
    grub-install /dev/sda
    update-grub  # 确保 Windows 被识别(需安装 os-prober)
  4. 重启后即可看到 GRUB 菜单。

5.2 迁移系统到新硬盘后安装 GRUB(UEFI 场景)#

问题描述:将 Linux 系统克隆到新 SSD(/dev/sdb)后,启动时提示“无操作系统”。
原因:新硬盘未安装 GRUB,UEFI 固件无法找到引导程序。

解决步骤

  1. 用 Live USB 启动,确认新硬盘的 ESP 分区(如 /dev/sdb1,需提前格式化为 FAT32)和根分区(/dev/sdb3);
  2. 挂载新硬盘的根分区和 ESP:
    sudo mount /dev/sdb3 /mnt
    sudo mount /dev/sdb1 /mnt/boot/efi  # ESP 挂载到 /boot/efi
  3. 绑定系统目录并 chroot:
    sudo mount --bind /dev /mnt/dev && sudo mount --bind /proc /mnt/proc && sudo mount --bind /sys /mnt/sys
    sudo chroot /mnt
  4. 安装 GRUB 到新硬盘的 ESP:
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=linux-new --recheck /dev/sdb
    update-grub
  5. 重启后进入 UEFI 固件设置,将新硬盘的引导项(linux-new)设为首选启动项。

5.3 LVM/RAID 环境下的 GRUB 安装#

问题描述:系统根分区位于 LVM 卷或 RAID 阵列,直接挂载根分区会失败。

解决步骤:需先激活 LVM/RAID 设备:

  • LVM 场景
    sudo vgscan  # 扫描卷组
    sudo vgchange -ay  # 激活所有卷组(输出如 "2 logical volume(s) in volume group "ubuntu-vg" now active")
    sudo mount /dev/ubuntu-vg/root /mnt  # 挂载 LVM 根卷(路径通过 lvdisplay 查看)
  • RAID 场景
    sudo mdadm --assemble --scan  # 激活 RAID 阵列
    sudo mount /dev/md0 /mnt  # 挂载 RAID 根分区

后续步骤(chroot、安装 GRUB)与常规场景一致。

6. 最佳实践与注意事项#

  1. 备份引导区域:操作前备份 MBR 或 ESP 分区,避免误操作导致无法恢复:

    # 备份 MBR(前 512 字节)
    sudo dd if=/dev/sda of=mbr_backup.img bs=512 count=1
    # 备份 ESP 分区(假设 ESP 为 /dev/sda1)
    sudo dd if=/dev/sda1 of=esp_backup.img
  2. 避免直接操作错误磁盘:通过 lsblk 反复确认目标磁盘(如 /dev/sda 而非 /dev/sdb),避免将 GRUB 安装到 U 盘等临时设备。

  3. UEFI 场景下 ESP 分区要求

    • 格式化为 FAT32(mkfs.fat -F32 /dev/sdX1);
    • 大小建议 200-512MB(过小可能导致更新 GRUB 失败);
    • 分区类型需设置为“EFI 系统分区”(通过 gdisk 标记为 EF00 类型)。
  4. 安装后验证配置文件:检查 /boot/grub/grub.cfg 中是否包含目标系统内核和其他 OS 启动项。

  5. 多发行版共存时的 GRUB 管理:建议由一个系统(如 Ubuntu)管理 GRUB,其他系统更新内核后需在该系统中执行 update-grub

7. 常见问题与故障排查#

问题 1:grub-install: error: cannot find EFI directory#

原因:UEFI 场景下未挂载 ESP 分区或挂载路径错误。
解决:确认 ESP 分区已挂载到 /boot/efi,可通过 df -h | grep /boot/efi 检查。

问题 2:GRUB 菜单中无 Windows 选项#

原因:未安装 os-prober 或 Windows 分区未被识别。
解决

# 安装 os-prober
sudo apt install os-prober  # Debian/Ubuntu
# 重新扫描并生成配置
sudo update-grub

问题 3:启动时进入 GRUB 救援模式(grub rescue>#

原因:GRUB 核心文件损坏或配置文件丢失。
解决:通过 Live 系统重新安装 GRUB(完整执行第 4 节步骤)。

问题 4:grub-install: error: disk hostdisk//dev/sda' not found`#

原因:chroot 环境中磁盘设备未正确绑定。
解决:确保执行了 mount --bind /dev /mnt/dev 等绑定命令,或重新进入 chroot。

问题 5:UEFI 启动后提示“Secure Boot Violation”#

原因:UEFI 安全启动(Secure Boot)未关闭,阻止未签名的 GRUB 加载。
解决:进入 UEFI 固件设置,关闭“Secure Boot”选项。

8. 总结#

GRUB 手动安装是 Linux 系统维护的核心技能,无论是修复引导故障还是配置多系统启动,都需要清晰理解 BIOS/UEFI 固件差异、磁盘分区结构及 GRUB 工具链的使用。本文通过分场景步骤、示例操作和故障排查,希望能帮助读者掌握这一操作。记住:谨慎操作、做好备份、理解每一步的原理,是避免风险的关键。

9. 参考资料#