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

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/syslogGRUB 安装/更新日志
内核日志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=offacpi=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-installupdate-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 deviceUUID 错误search 命令查找正确设备
error: file not found内核/initrd 路径错误ls 命令查看正确路径
选择内核后黑屏显卡驱动问题添加 nomodeset
Kernel Panic根分区无法挂载检查 root= 参数和 initramfs
直接进入 WindowsEFI 启动顺序efibootmgr 调整顺序
更新后无法引导grub.cfg 过期从旧内核启动后 update-grub
启动卡住不动服务挂起添加 systemd.unit=multi-user.target
双系统只看到一个os-prober 未启用安装 os-prober,设 GRUB_DISABLE_OS_PROBER=false

11.8 扩展阅读


上一章:第 10 章:网络引导 | 下一章:第 12 章:最佳实践