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

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+XF10 引导。

⚠️ 注意:菜单编辑模式中的修改是临时的,不会保存到 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 RepairUbuntu 下的一键修复工具
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