GRUB2 引导管理器完全教程 / 第 8 章:恢复模式
第 8 章:恢复模式
8.1 何时需要恢复模式
系统引导失败时,GRUB2 的恢复能力是运维人员的重要工具。常见需要恢复的场景:
| 场景 | 症状 |
|---|---|
| grub.cfg 损坏 | GRUB 命令行,无菜单 |
| 内核被误删 | error: file not found |
| initramfs 缺失 | 内核恐慌(Kernel Panic) |
| 文件系统损坏 | error: unknown filesystem |
| 引导扇区损坏 | 直接进入 BIOS 或无引导 |
| 新内核不兼容 | 系统启动后黑屏/卡死 |
| UUID 变更 | Gave up waiting for root device |
| 误更新 GRUB | 引导循环 |
8.2 GRUB 命令行模式
8.2.1 进入 GRUB Shell
方式一:在 GRUB 菜单界面按 c 键
方式二:如果 grub.cfg 不存在或损坏,GRUB 自动进入 Shell
方式三:在菜单项编辑模式(按 e)中修改引导参数
8.2.2 GRUB Shell 基础命令
# 列出磁盘和分区
grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3)
# 查看分区详情
grub> ls (hd0,gpt2)/
# 列出 / 根目录下的文件和目录
# 查看分区文件系统
grub> ls -l (hd0,gpt2)
# Partition hd0,gpt2: Filesystem type ext2 - Label `root`
# 查看分区 UUID
grub> ls --fs-uuid (hd0,gpt2)
# Partition hd0,gpt2: UUID xxxx-xxxx-xxxx Filesystem type ext2
# 查看可用命令
grub> help
grub> help linux
grub> help chainloader
# 设置变量
grub> set root=(hd0,gpt2)
grub> set
# 清屏
grub> clear
# 加载模块
grub> insmod ext2
grub> insmod part_gpt
grub> insmod linux
8.2.3 GRUB Shell 设备表示
| GRUB 设备 | 说明 |
|---|---|
(hd0) | 第一块磁盘 |
(hd0,gpt1) | GPT 分区 1 |
(hd0,msdos1) | MBR 分区 1 |
(hd1,gpt3) | 第二块磁盘 GPT 分区 3 |
(hd0,gpt2)/boot/vmlinuz | 分区内的文件路径 |
8.3 手动引导 Linux
8.3.1 完整的手动引导步骤
当 grub.cfg 损坏或丢失时,可以在 GRUB Shell 中手动引导 Linux 系统:
# 第 1 步:确定根分区
grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3)
# 第 2 步:查找包含 /boot 的分区
grub> ls (hd0,gpt2)/boot/
# 看到 vmlinuz-* 和 initrd.img-* 就是正确的分区
# 第 3 步:设置根设备
grub> set root=(hd0,gpt2)
# 第 4 步:加载内核
grub> linux /boot/vmlinuz-6.1.0-amd64 root=/dev/sda2 ro
# 注意:root= 参数使用 Linux 设备名或 UUID
# 使用 UUID 更可靠:
# grub> linux /boot/vmlinuz-6.1.0-amd64 root=UUID=xxxx-xxxx ro
# 第 5 步:加载 initramfs
grub> initrd /boot/initrd.img-6.1.0-amd64
# 第 6 步:引导
grub> boot
8.3.2 使用 search 命令自动查找分区
# 通过文件系统 UUID 查找
grub> search --no-floppy --fs-uuid --set=root xxxx-xxxx-xxxx-xxxx
# 通过标签查找
grub> search --no-floppy --label --set=root "root"
# 通过文件查找
grub> search --no-floppy --file --set=root /boot/vmlinuz
8.3.3 快捷引导模板
在 GRUB Shell 中,可以使用 configfile 加载一个 grub.cfg:
# 直接加载另一个分区的 grub.cfg
grub> set root=(hd0,gpt2)
grub> configfile /boot/grub/grub.cfg
8.4 临时修改引导参数
8.4.1 编辑菜单项
在 GRUB 菜单界面,选中要编辑的菜单项,按 e 键进入编辑模式。
常见临时修改:
# 在 linux 行末尾添加参数
# 1. 进入单用户/救援模式
linux /boot/vmlinuz root=UUID=xxx ro single
# 或 systemd 方式
linux /boot/vmlinuz root=UUID=xxx ro systemd.unit=rescue.target
# 2. 使用文本模式(解决显卡问题)
linux /boot/vmlinuz root=UUID=xxx ro nomodeset
# 3. 禁用特定驱动
linux /boot/vmlinuz root=UUID=xxx ro modprobe.blacklist=nouveau
# 4. 直接进入 shell(最极端的恢复)
linux /boot/vmlinuz root=UUID=xxx ro init=/bin/bash
# 5. 启用详细日志
linux /boot/vmlinuz root=UUID=xxx ro debug loglevel=7
# 6. 修改根设备(如果 UUID 变了)
linux /boot/vmlinuz root=/dev/sda2 ro
# 7. 使用旧内核
# 按 Esc 返回菜单,选择 "Advanced options" 选择旧内核
修改完成后,按 Ctrl+X 或 F10 引导。
⚠️ 注意:菜单编辑模式中的修改是临时的,不会保存到 grub.cfg。
8.5 引导到不同目标
8.5.1 systemd 目标
| 目标 | 说明 | 用途 |
|---|---|---|
rescue.target | 救援模式(单用户) | 文件系统修复 |
emergency.target | 紧急模式 | 最小系统 |
multi-user.target | 多用户(无图形) | 服务器/调试 |
graphical.target | 图形模式 | 正常使用 |
reboot.target | 重启 | 重启系统 |
poweroff.target | 关机 | 关闭系统 |
# 在 GRUB 编辑模式中
linux /boot/vmlinuz root=UUID=xxx ro systemd.unit=rescue.target
8.5.2 init 系统目标(传统)
# 单用户模式
linux /boot/vmlinuz root=UUID=xxx ro single
# 或
linux /boot/vmlinuz root=UUID=xxx ro 1
# 或
linux /boot/vmlinuz root=UUID=xxx ro init=/bin/bash
8.6 使用 Live 系统修复
8.6.1 从 Live USB 修复 GRUB
当 GRUB 完全损坏时,需要从 Live USB/CD 启动并修复:
# 1. 从 Live 系统启动
# 2. 打开终端
# 3. 识别目标系统分区
$ lsblk -f
# NAME FSTYPE LABEL MOUNTPOINT
# sda
# ├─sda1 vfat EFI
# ├─sda2 ext4 boot
# └─sda3 ext4 root
# 4. 挂载目标系统
$ sudo mount /dev/sda3 /mnt
$ sudo mount /dev/sda2 /mnt/boot
$ sudo mount /dev/sda1 /mnt/boot/efi # UEFI 模式
# 5. 挂载必要的虚拟文件系统
$ 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
# UEFI 系统还需要
$ sudo mount -t efivarfs efivarfs /mnt/sys/firmware/efi/efivars
# 6. chroot 进入目标系统
$ sudo chroot /mnt
# 7. 重新安装 GRUB
# UEFI:
$ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
# BIOS:
$ grub-install /dev/sda
# 8. 重新生成配置
$ update-grub
# 9. 退出并卸载
$ exit
$ sudo umount -R /mnt
# 10. 重启
$ sudo reboot
8.6.2 修复 initramfs
如果 initramfs 损坏或丢失:
# 在 chroot 环境中
# Debian/Ubuntu
$ update-initramfs -c -k 6.1.0-amd64
# RHEL/Fedora
$ dracut --force /boot/initramfs-6.1.0.img 6.1.0
# Arch Linux
$ mkinitcpio -P
8.6.3 修复文件系统
# 卸载目标分区后进行文件系统检查
$ sudo umount /mnt/boot/efi
$ sudo umount /mnt/boot
$ sudo umount /mnt
# 检查并修复 ext4
$ sudo fsck.ext4 -f /dev/sda3
# 检查并修复 FAT32(EFI 分区)
$ sudo fsck.vfat -a /dev/sda1
# 只读检查(不修改)
$ sudo fsck.ext4 -n /dev/sda3
8.7 恢复已删除的内核
8.7.1 场景:内核被误删
# 如果还能进入 GRUB Shell
# 1. 检查还有哪些可用内核
grub> ls (hd0,gpt2)/boot/vmlinuz*
# 如果没有任何内核,需要从外部恢复
# 2. 从 Live 系统安装内核
$ sudo mount /dev/sda3 /mnt
$ sudo mount /dev/sda2 /mnt/boot
$ sudo chroot /mnt
# Debian/Ubuntu
$ apt install linux-image-amd64
$ update-grub
# RHEL/Fedora
$ dnf install kernel
$ grub2-mkconfig -o /boot/grub2/grub.cfg
8.7.2 使用旧内核引导
# 在 GRUB 菜单中选择 "Advanced options"
# 选择一个旧版本的内核启动
# 或在 GRUB Shell 中手动指定
grub> set root=(hd0,gpt2)
grub> linux /boot/vmlinuz-5.10.0-amd64 root=UUID=xxx ro
grub> initrd /boot/initrd.img-5.10.0-amd64
grub> boot
8.8 GRUB Rescue 模式
8.8.1 什么是 Rescue 模式
当 GRUB 的 normal 模块无法加载时(如 grub.cfg 丢失、模块损坏),GRUB 进入 Rescue 模式,提示符为:
grub rescue>
Rescue 模式下只有最基础的命令可用。
8.8.2 Rescue 模式下的可用命令
grub rescue> help
grub rescue> ls
grub rescue> set
grub rescue> insmod
8.8.3 从 Rescue 模式恢复到 Normal 模式
# 1. 找到 GRUB 模块所在的分区
grub rescue> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3)
grub rescue> ls (hd0,gpt2)/boot/grub/x86_64-efi/
# 如果列出 .mod 文件,说明找到了正确的分区
# 2. 设置 prefix 和 root
grub rescue> set root=(hd0,gpt2)
grub rescue> set prefix=(hd0,gpt2)/boot/grub
# 3. 加载 normal 模块
grub rescue> insmod normal
# 4. 进入 normal 模式
grub rescue> normal
# 此时应该显示正常的 GRUB 菜单
8.8.4 Rescue 模式直接引导
如果无法加载 normal 模块,可以直接在 rescue 模式下引导:
grub rescue> set root=(hd0,gpt2)
grub rescue> insmod linux
grub rescue> linux /boot/vmlinuz-6.1.0-amd64 root=/dev/sda2 ro
grub rescue> initrd /boot/initrd.img-6.1.0-amd64
grub rescue> boot
8.9 Super GRUB2 Disk
Super GRUB2 Disk 是一个专门的救援工具,可以自动检测并引导系统。
8.9.1 下载和使用
# 下载 Super GRUB2 Disk
# https://www.supergrubdisk.org/super-grub2-disk/
# 写入 USB
$ sudo dd if=super_grub2_disk_hybrid_2.06s4.iso of=/dev/sdb bs=4M status=progress
# 使用:
# 1. 从 USB 引导
# 2. 选择 "Detect any GRUB2 installation"
# 3. 或选择 "Detect any Operating System"
# 4. Super GRUB2 会自动找到可引导的系统
8.9.2 其他救援工具
| 工具 | 说明 |
|---|---|
| Super GRUB2 Disk | 自动检测并引导系统 |
| Rescatux | 系统修复工具,含 GRUB 修复向导 |
| Boot Repair | Ubuntu 下的一键修复工具 |
| SystemRescue | 完整的救援 Linux 系统 |
8.10 Boot Repair 工具
8.10.1 安装和使用
# 从 Ubuntu Live 系统
$ sudo add-apt-repository ppa:yannubuntu/boot-repair
$ sudo apt update
$ sudo apt install boot-repair
# 启动
$ boot-repair
# 选择 "Recommended repair" 进行自动修复
# 工具会自动执行:
# 1. 重新安装 GRUB
# 2. 检测其他操作系统
# 3. 重新生成 grub.cfg
# 4. 修复 MBR/EFI 引导
8.11 引导恢复决策树
系统无法引导
│
├── 能看到 GRUB 菜单?
│ ├── 是 → 选择菜单项能引导吗?
│ │ ├── 是 → 问题在特定内核/系统
│ │ └── 否 → 按 e 编辑参数,尝试添加 nomodeset 等
│ └── 否 → 进入了什么界面?
│ ├── grub> 命令行 → 手动引导(8.3 节)
│ ├── grub rescue> → Rescue 模式恢复(8.8 节)
│ ├── 黑屏/无输出 → 硬件问题或 UEFI 引导损坏
│ └── 直接进入 Windows → EFI 启动顺序问题
│
└── 完全无法启动(连 GRUB 都没有)
├── 使用 Live USB 启动
├── 检查硬件(磁盘、内存)
├── 检查分区表是否完整
└── 从 Live 系统重新安装 GRUB(8.6 节)
8.12 扩展阅读
上一章:第 7 章:加密与认证 | 下一章:第 9 章:Secure Boot