GRUB2 引导管理器完全教程 / 第 11 章:故障排除
第 11 章:故障排除
11.1 故障排除通用方法
11.1.1 排查步骤
1. 记录错误信息(截图或拍照)
2. 确认硬件状态(磁盘、内存、连接)
3. 确认引导模式(UEFI / Legacy BIOS)
4. 从 Live 系统启动检查
5. 查看日志(dmesg、journalctl)
6. 逐步排除可能原因
11.1.2 关键日志位置
| 日志 | 位置 | 说明 |
|---|---|---|
| GRUB 调试日志 | /var/log/syslog | GRUB 安装/更新日志 |
| 内核日志 | dmesg / /var/log/kern.log | 内核启动信息 |
| systemd 日志 | journalctl -b | 本次启动日志 |
| initramfs 日志 | /run/initramfs/initramfs.debug | 初始文件系统日志 |
11.2 常见错误及解决方案
11.2.1 “error: unknown filesystem”
症状:GRUB 显示 error: unknown filesystem,进入 rescue 模式。
原因:GRUB 无法识别 /boot 所在分区的文件系统。
诊断:
grub> ls
# 检查分区列表
grub> ls (hd0,gpt2)/
# 如果报错 unknown filesystem,说明 GRUB 缺少对应模块
解决方案:
# 从 Live 系统启动
$ sudo mount /dev/sda2 /mnt
$ sudo chroot /mnt
# 安装文件系统模块
$ apt install grub-pc # 重新安装 GRUB
# 或手动添加模块
$ grub-install --target=i386-pc --modules="ext2 part_gpt" /dev/sda
$ update-grub
11.2.2 “error: file ‘/boot/grub/grub.cfg’ not found”
症状:GRUB 进入命令行,提示找不到 grub.cfg。
解决方案:
# 在 GRUB Shell 中手动引导
grub> set root=(hd0,gpt2)
grub> configfile /boot/grub/grub.cfg
# 或手动引导内核
grub> linux /boot/vmlinuz-6.1.0-amd64 root=UUID=xxx ro
grub> initrd /boot/initrd.img-6.1.0-amd64
grub> boot
# 进入系统后修复
$ sudo update-grub
11.2.3 “error: no such device: xxxxxxxx”
症状:Gave up waiting for root device 或 UUID 不匹配。
诊断:
# 在 GRUB Shell 中检查
grub> search --fs-uuid xxxxxxxx
# 如果找不到,说明 UUID 变了
# 查看实际 UUID
grub> ls --fs-uuid (hd0,gpt2)
解决方案:
# 使用设备名而非 UUID 引导
grub> linux /boot/vmlinuz root=/dev/sda2 ro
grub> boot
# 进入系统后更新 fstab 和 grub.cfg
$ sudo blkid # 查看正确的 UUID
$ sudo nano /etc/fstab # 修正 UUID
$ sudo update-grub
11.2.4 GRUB Rescue 模式
症状:显示 grub rescue> 提示符。
解决方案:
grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3)
# 查找 GRUB 模块目录
grub> ls (hd0,gpt2)/boot/grub/
# 如果看到 i386-pc/ 或 x86_64-efi/ 目录
# 设置 prefix 和 root
grub> set root=(hd0,gpt2)
grub> set prefix=(hd0,gpt2)/boot/grub
# 加载 normal 模块
grub> insmod normal
grub> normal
# 应该回到正常菜单
11.2.5 启动后黑屏
症状:GRUB 菜单正常,选择内核后黑屏。
诊断:
# 在 GRUB 编辑模式中添加调试参数
linux /boot/vmlinuz root=UUID=xxx ro nomodeset debug loglevel=7
常见原因及解决:
| 原因 | 解决方案 |
|---|---|
| 显卡驱动问题 | 添加 nomodeset 参数 |
| 分辨率不兼容 | 添加 video=SVGA-1:1024x768@60 |
| ACPI 问题 | 添加 acpi=off 或 acpi=ht |
| 内核版本问题 | 从 Advanced 选择旧内核 |
| initramfs 损坏 | 从 Live 系统重建 initramfs |
11.2.6 内核恐慌(Kernel Panic)
症状:Kernel panic - not syncing: VFS: Unable to mount root fs
原因:内核无法挂载根文件系统。
常见原因:
| 原因 | 解决方案 |
|---|---|
| initramfs 缺少驱动 | 重建 initramfs,添加必要驱动 |
| 根分区 UUID 错误 | 修正 root= 参数 |
| 根分区损坏 | 从 Live 系统运行 fsck |
| LUKS 密码错误 | 检查加密配置 |
| 根分区未格式化 | 从 Live 系统检查分区 |
诊断与修复:
# 从 Live 系统启动
$ sudo mount /dev/sda2 /mnt
$ sudo chroot /mnt
# 检查 initramfs 内容
$ lsinitramfs /boot/initrd.img-6.1.0-amd64 | grep -i ext4
# 应该有 ext4 相关模块
# 重建 initramfs
$ update-initramfs -c -k 6.1.0-amd64
$ update-grub
11.2.7 直接进入 Windows / 跳过 GRUB
症状:重启后直接进入 Windows,看不到 GRUB 菜单。
原因:EFI 启动顺序中 Windows 优先。
解决方案:
# 从 Linux Live 系统启动
$ sudo efibootmgr -v
# Boot0000* Windows Boot Manager
# Boot0001* debian
# 调整启动顺序
$ sudo efibootmgr -o 0001,0000
# 将 debian 放在 Windows 前面
# 或进入 BIOS 设置调整启动顺序
11.2.8 “Minimal BASH-like editing is supported”
症状:GRUB 进入最小命令行模式。
解决方案:
# 最小模式下可用命令有限,但可以手动引导
grub> set root=(hd0,gpt2)
grub> set prefix=(hd0,gpt2)/boot/grub
grub> insmod normal
grub> normal
11.2.9 GRUB 安装后重启无变化
症状:运行了 grub-install 和 update-grub,但重启后无变化。
诊断:
# 检查 GRUB 安装位置
$ sudo grub-install --recheck /dev/sda
# 检查 EFI 启动项
$ sudo efibootmgr -v
# 检查 grub.cfg 生成时间
$ ls -la /boot/grub/grub.cfg
解决方案:
# 可能安装到了错误的磁盘
# 确认系统盘
$ sudo fdisk -l
# 重新安装到正确的磁盘
$ sudo grub-install /dev/sda
$ sudo update-grub
# UEFI 系统检查 EFI 分区
$ sudo mount /dev/sda1 /mnt
$ ls /mnt/EFI/
11.2.10 更新后 GRUB 配置丢失
症状:系统更新后引导配置错误。
解决方案:
# 检查是否有 grub-pc 或 grub-efi 的更新提示
$ sudo dpkg --configure -a
# 重新生成配置
$ sudo update-grub
# 如果提示选择安装设备,选择正确的磁盘(空格选中,回车确认)
11.3 硬件相关问题
11.3.1 磁盘检测失败
# 检查磁盘是否被识别
$ lsblk
$ sudo fdisk -l
# 检查 BIOS/UEFI 中是否看到磁盘
# 检查磁盘连接(SATA 线、电源线)
# 检查 SMART 状态
$ sudo smartctl -a /dev/sda
11.3.2 NVMe 磁盘问题
# 检查 NVMe 驱动
$ lsmod | grep nvme
# 检查 NVMe 设备
$ sudo nvme list
# GRUB NVMe 模块
$ ls /boot/grub/x86_64-efi/nvme*
11.3.3 软件 RAID 问题
# 检查 RAID 状态
$ cat /proc/mdstat
# GRUB RAID 模块
$ ls /boot/grub/*/mdraid*
# 安装到 RAID
$ sudo grub-install --target=i386-pc /dev/sda
$ sudo grub-install --target=i386-pc /dev/sdb
11.4 initramfs 问题
11.4.1 重建 initramfs
# Debian/Ubuntu
$ sudo update-initramfs -c -k $(uname -r)
# -c: 创建新的 initramfs
# -k: 指定内核版本
# 查看当前内核版本
$ uname -r
# 6.1.0-amd64
# 重建所有内核的 initramfs
$ sudo update-initramfs -u -k all
# -u: 更新已有的
# RHEL/Fedora
$ sudo dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
# Arch Linux
$ sudo mkinitcpio -P
11.4.2 检查 initramfs 内容
# 列出 initramfs 中的文件
$ lsinitramfs /boot/initrd.img-6.1.0-amd64 | head -50
# 解压 initramfs 查看内容
$ mkdir /tmp/initrd && cd /tmp/initrd
$ /usr/lib/dracut/skipcpio /boot/initrd.img-6.1.0-amd64 | \
zcat | cpio -idmv 2>/dev/null
# 或使用 unmkinitramfs
$ unmkinitramfs /boot/initrd.img-6.1.0-amd64 /tmp/initrd
11.4.3 添加驱动到 initramfs
# Debian/Ubuntu: 编辑 /etc/initramfs-tools/modules
$ sudo nano /etc/initramfs-tools/modules
# 添加需要的模块,每行一个
# ahci
# xhci_pci
# nvme
# 重建
$ sudo update-initramfs -u
# RHEL/Fedora: 编辑 /etc/dracut.conf.d/
$ echo 'add_drivers+=" ahci xhci_pci "' | \
sudo tee /etc/dracut.conf.d/custom.conf
$ sudo dracut --force
11.5 引导日志分析
11.5.1 查看本次启动日志
# 查看所有启动日志
$ journalctl -b
# 查看内核日志
$ journalctl -b -k
# 查看 GRUB 相关日志
$ journalctl -b | grep -i grub
# 查看启动过程中的错误
$ journalctl -b -p err
11.5.2 查看上次启动日志
# 查看上次启动(崩溃前)的日志
$ journalctl -b -1
# 查看上次启动的内核日志
$ journalctl -b -1 -k
11.5.3 启动性能分析
# 查看启动耗时
$ systemd-analyze
# Startup finished in 2.1s (firmware) + 500ms (loader) + 3.2s (kernel) + 8.5s (userspace)
# = 14.3s
# 查看各服务启动耗时
$ systemd-analyze blame
# 生成启动时间图表
$ systemd-analyze plot > boot.svg
11.6 高级调试
11.6.1 GRUB 调试模式
# 在 GRUB Shell 中启用调试
grub> set debug=all
# 查看加载过程
grub> insmod linux
# 会显示模块加载的详细信息
# 禁用调试
grub> set debug=
11.6.2 内核调试启动参数
# 启用内核调试
linux /boot/vmlinuz root=UUID=xxx ro debug loglevel=7
# 调试特定子系统
linux /boot/vmlinuz root=UUID=xxx ro \
debug loglevel=7 \
dyndbg="file drivers/pci/* +p" \
printk.devkmsg=on
# 启用 early printk(内核崩溃时能看到信息)
linux /boot/vmlinuz root=UUID=xxx ro \
earlyprintk=vga,keep
# 或串口
linux /boot/vmlinuz root=UUID=xxx ro \
earlyprintk=ttyS0,115200,keep
11.6.3 initramfs 调试
# 在 initramfs 中中断启动
linux /boot/vmlinuz root=UUID=xxx ro break=premount
# break= 的值可以是:
# premount: 挂载根分区前
# mount: 挂载根分区时
# bottom: initramfs 底部
# init: init 启动前
# 进入 initramfs shell 后
# 检查设备
# ls /dev/
# 手动挂载
# mount /dev/sda2 /root
# 查看日志
# cat /run/initramfs/initramfs.debug
11.7 故障排除速查表
| 症状 | 可能原因 | 快速解决方案 |
|---|---|---|
| GRUB Rescue> | grub.cfg 丢失/损坏 | 参考 8.8 节手动引导 |
| error: unknown filesystem | 模块缺失 | 从 Live 系统重装 GRUB |
| error: no such device | UUID 错误 | search 命令查找正确设备 |
| error: file not found | 内核/initrd 路径错误 | ls 命令查看正确路径 |
| 选择内核后黑屏 | 显卡驱动问题 | 添加 nomodeset |
| Kernel Panic | 根分区无法挂载 | 检查 root= 参数和 initramfs |
| 直接进入 Windows | EFI 启动顺序 | efibootmgr 调整顺序 |
| 更新后无法引导 | grub.cfg 过期 | 从旧内核启动后 update-grub |
| 启动卡住不动 | 服务挂起 | 添加 systemd.unit=multi-user.target |
| 双系统只看到一个 | os-prober 未启用 | 安装 os-prober,设 GRUB_DISABLE_OS_PROBER=false |
11.8 扩展阅读
上一章:第 10 章:网络引导 | 下一章:第 12 章:最佳实践