【经验分享】Ubuntu 服务器突然断电后出现 Kernel Panic:使用旧内核启动并修复 initramfs

关键词:Ubuntu、Kernel Panic、GRUB、initramfs、unknown-block(0,0)、断电恢复、旧内核启动

一、问题背景

服务器突然断电后,再次开机时无法正常进入 Ubuntu,屏幕显示如下错误:

KERNEL PANIC!

Please reboot your computer.

VFS: Unable to mount root fs on unknown-block(0,0)

在这里插入图片描述

这类错误表示 Linux 内核在启动过程中无法找到或挂载根文件系统。

常见原因包括:

  • 当前内核对应的 initramfs 文件损坏或生成不完整;
  • /boot 分区空间不足;
  • GRUB 启动参数中的根分区 UUID 错误;
  • 系统盘没有被 BIOS 或磁盘控制器识别;
  • 突然断电导致文件系统或软件 RAID 状态异常;
  • 新安装的内核本身存在启动问题。

本次故障中,旧版本内核可以正常启动,因此最终判断为:最新内核对应的 initramfs 很可能在断电后出现异常,而系统盘和根文件系统本身没有严重损坏。


二、进入 GRUB 启动菜单

开机时需要进入 GRUB 菜单。

如果一直按 Esc 进入了 BIOS,说明按键时间过早。可以退出 BIOS,等待主板 Logo 出现或刚消失时,再快速连续按几次 Esc。

进入 GRUB 后,选择:

Advanced options for Ubuntu

系统中显示了以下内核:

Ubuntu, with Linux 7.0.0-28-generic
Ubuntu, with Linux 7.0.0-28-generic (recovery mode)
Ubuntu, with Linux 6.17.0-40-generic
Ubuntu, with Linux 6.17.0-40-generic (recovery mode)

在这里插入图片描述

由于最新的 7.0.0-28-generic 无法启动,因此选择旧内核:

Ubuntu, with Linux 6.17.0-40-generic

先选择普通启动项,不选择 recovery mode。

旧内核成功进入系统,说明:

  • BIOS 可以识别系统盘;
  • GRUB 基本正常;
  • 根分区大概率没有严重损坏;
  • 问题主要集中在新内核或其 initramfs 文件。

三、确认当前运行的内核

进入系统后执行:

uname -r

输出如下:

6.17.0-40-generic

说明当前确实是通过旧内核启动的。


四、检查 /boot 分区空间

在修复 initramfs 之前,先检查 /boot 是否还有足够空间:

df -h /boot

同时查看现有的内核和 initramfs 文件:

ls -lh /boot/vmlinuz-* /boot/initrd.img-*

如果 /boot 已经达到 100%,需要先清理旧内核,否则新的 initramfs 可能无法正常生成。

本次恢复过程中 /boot 空间正常,因此可以直接重建新内核的 initramfs。


五、重建新内核的 initramfs

切换到 root 用户:

sudo -i

针对无法启动的内核重新生成 initramfs:

update-initramfs -u -k 7.0.0-28-generic

然后重新生成 GRUB 配置:

update-grub

正常情况下会看到类似输出:

Found linux image: /boot/vmlinuz-7.0.0-28-generic
Found initrd image: /boot/initrd.img-7.0.0-28-generic
Found linux image: /boot/vmlinuz-6.17.0-40-generic
Found initrd image: /boot/initrd.img-6.17.0-40-generic

这说明 GRUB 已经重新识别到对应的内核和 initramfs 文件。

完成后重启服务器:

reboot

本次重启不再手动选择旧内核,而是让 GRUB 默认启动最新的:

Ubuntu, with Linux 7.0.0-28-generic

系统成功进入 Ubuntu,故障恢复。


六、验证修复结果

系统启动后再次检查当前内核:

uname -r

如果输出:

7.0.0-28-generic

说明新内核已经恢复正常。

进一步验证 initramfs 是否可以被正常解析:

sudo lsinitramfs /boot/initrd.img-7.0.0-28-generic >/dev/null \
  && echo "initramfs 检查通过"

如果看到:

initramfs 检查通过

说明生成的 initramfs 文件结构基本正常。


七、检查断电是否留下其他问题

虽然服务器已经能够启动,但突然断电还可能导致软件包、文件系统、RAID 或磁盘状态异常,因此建议继续完成以下检查。

1. 检查软件包状态

sudo dpkg --configure -a
sudo apt -f install
sudo dpkg --audit

如果 dpkg --audit 没有输出,通常表示没有处于异常状态的软件包。

更新软件源索引:

sudo apt update

2. 检查分区空间和 inode

df -hT / /boot /boot/efi 2>/dev/null
df -i / /boot 2>/dev/null

重点确认:

  • 根分区没有达到 100%;
  • /boot 分区没有达到 100%;
  • inode 使用率没有达到 100%。

3. 检查启动错误日志

查看本次启动中的严重错误:

sudo journalctl -b -p err..alert --no-pager

筛选磁盘、NVMe 和文件系统错误:

sudo journalctl -k -b --no-pager | \
grep -Ei 'I/O error|Buffer I/O|EXT4-fs error|XFS.*corrupt|nvme.*(error|timeout|reset)|blk_update_request'

如果第二条命令没有输出,通常是好现象。

如果出现以下关键词,则需要进一步排查:

I/O error
EXT4-fs error
Buffer I/O error
nvme timeout
controller reset
filesystem corruption

需要注意:不要在根分区处于挂载状态时直接运行 fsck。


八、检查软件 RAID 状态

如果服务器使用了 Linux 软件 RAID,例如 /dev/md0,断电后应检查阵列是否降级或正在同步:

cat /proc/mdstat

正常阵列可能显示:

[UUUU]

如果显示:

[UU_U]

说明有一块成员盘缺失。

如果输出中出现:

recovery
resync
reshape
check

说明阵列正在恢复或同步。此时应保持服务器持续供电,不要频繁重启。

查看详细状态:

sudo mdadm --detail /dev/md0

正常情况下可以看到:

State : clean

如果正在同步,则可能显示:

State : clean, resyncing

九、检查 NVMe 硬盘健康状态

先查看磁盘设备名:

lsblk -o NAME,SIZE,MODEL,FSTYPE,MOUNTPOINTS

安装检查工具:

sudo apt install nvme-cli smartmontools

查看 NVMe 列表:

sudo nvme list

假设系统盘是 /dev/nvme0,检查 SMART 信息:

sudo nvme smart-log /dev/nvme0

重点关注:

critical_warning
media_errors
num_err_log_entries
percentage_used

比较理想的状态是:

critical_warning : 0
media_errors     : 0

也可以使用:

sudo smartctl -a /dev/nvme0

实际设备名应以 nvme list 或 lsblk 的输出为准。


十、不要立即删除旧内核

虽然最新内核已经恢复,但暂时不要删除能够正常启动的:

6.17.0-40-generic

它可以作为备用内核。

建议至少满足以下条件后,再考虑清理旧版本:

  1. 最新内核能够正常启动;
  2. 连续重启两次均无异常;
  3. 日志中没有磁盘或文件系统错误;
  4. 软件 RAID 没有降级;
  5. NVMe SMART 状态正常。

恢复后暂时不要急着执行:

sudo apt autoremove --purge

避免系统自动删除已验证可用的备用内核。


十一、最终恢复流程总结

本次故障的核心恢复流程如下:

服务器突然断电
    ↓
新内核启动时出现 Kernel Panic
    ↓
进入 GRUB 的 Advanced options for Ubuntu
    ↓
选择旧内核 6.17.0-40-generic
    ↓
成功进入系统
    ↓
重建 7.0.0-28-generic 的 initramfs
    ↓
更新 GRUB
    ↓
重新启动
    ↓
新内核恢复正常

对应的核心命令只有几条:

uname -r

sudo -i

df -h /boot

update-initramfs -u -k 7.0.0-28-generic

update-grub

reboot

更多推荐