Ubuntu 24.04 系统启动故障修复记录
记录时间:2026-07-31
环境:Ubuntu 24.04.2 LTS(内核 6.8.0-134-generic),虚拟机
一、问题现象
客户的虚拟机因为装修拉闸断电好几次,里面的 Ubuntu 24.04.2 LTS 起不来了。开机直接掉进 initramfs 那个 (initramfs) 急救 shell,提示找不到根文件系统、挂不上盘,根本进不去系统。折腾了半天,最后靠 LiveCD + chroot 进去把内核模块和 grub 整个重装了一遍才救回来。
二、排查过程
2.1 确认故障范围
系统掉进 initramfs shell 后,先确认磁盘设备是否还能识别:
# 在 initramfs shell 中查看可用磁盘和分区
(initramfs) blkid
(initramfs) cat /proc/partitions
磁盘设备还在,但根分区挂载失败,初步判断 initramfs 缺少磁盘驱动模块,导致内核加载不到文件系统驱动。
2.2 外部工具判断与验证
切换到”chroot 内网络不通,没法下载 linux-image 修复内核,只能走治标路线”。这结论如果成立,就等于只能用 LiveCD 手动从 ISO 里提取模块文件,没法 apt 重装,修复会很受限。
我进 LiveCD 环境 chroot 之后实测了一下:
# 手动写 DNS (默认 resolv.conf 是空的)如果ping xxx能通,下面这个自定义dns可忽略
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
# 验证网络
ping mirrors.aliyun.com
网络是通的。只要 DNS 配上,chroot 环境里 apt 能正常用,不需要走手动提取模块的弯路。
2.3 尝试重建 initramfs(无效)
网络通了之后,先试了最直接的办法——重建 initramfs:
update-initramfs -u
结果疯狂报 cannot find module 一堆缺失警告。检查 /lib/modules/6.8.0-134-generic/,发现里面的内核模块文件本身已经损坏、缺失了。
这说明问题不在 initramfs 打包环节,而是源头——内核模块文件被断电搞坏了。update-initramfs 只是把当前模块重新打包成 initrd,补不回丢失的驱动文件。必须先把完整的模块文件装回来。
三、根因分析
内核 /lib/modules/6.8.0-134-generic 下的驱动模块文件因多次异常断电导致损坏、缺失,initrd.img 启动镜像不完整。开机时内核加载不到磁盘/文件系统驱动,根分区挂不上,于是掉进 initramfs 救援界面。
四、解决方案
4.1 修复前置环境(LiveCD 引导)
- 找一个 Ubuntu 24.04 的 ISO,挂到虚拟机光驱上;
- 改启动顺序,让光驱优先;
- 从 ISO 启动,选 Try Ubuntu(不要选安装),进 Live 桌面环境,开终端。
4.2 检查磁盘文件系统完整性
动手修复前先扫一下根分区有没有文件系统损坏(非必须,但保险):
# 检查文件系统(根据实际分区调整,未挂载状态下执行)
sudo e2fsck -f /dev/sda2
sudo e2fsck -f /dev/sda3
4.3 挂载系统分区并 chroot
下面
/dev/sda2、/dev/sda3是我这台机器的分区号,你的环境不一定一样。动手前先用lsblk或fdisk -l看清楚自己的根分区、EFI 分区分别是哪几个,别照抄分区号。
# 挂载系统根分区(我这台是 /dev/sda3)
sudo mount /dev/sda3 /mnt
# 如果你的是 EFI 引导,记得把 EFI 分区也挂上,否则后面 grub-install 会失败
# sudo mount /dev/sda1 /mnt/boot/efi
# 绑定系统运行所需的虚拟文件系统(必须执行,chroot 后命令才跑得动)
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo mount --bind /run /mnt/run
# 切换进硬盘上的系统环境
sudo chroot /mnt
提示符变成 root@ubuntu:/# 就说明 chroot 成功了。
4.4 配置 chroot 内网络
# 手动写 DNS,让 chroot 环境能联网(默认 resolv.conf 是空的)
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
# 验证网络通不通
ping mirrors.aliyun.com
配通网络是后面所有重装操作的前提,别跳过。
4.5 重装损坏的内核模块和 GRUB
apt update
# 重装 GRUB EFI 相关包
apt install --reinstall grub-efi-amd64
apt install --reinstall grub-efi-amd64 grub-efi-amd64-bin
# 重装损坏的内核镜像和 headers(模块文件就是从这里补回来的)
apt install --reinstall linux-image-6.8.0-134-generic linux-headers-6.8.0-134-generic
为什么要重装,而不是只跑 update-initramfs?
这就是这次遇到的核心问题。update-initramfs只是把当前模块重新打包成 initrd,而/lib/modules里的模块文件本身已经坏了。打包源头就是残缺的,生成的镜像自然也是残的。直接apt reinstall把整个linux-image+linux-headers重装回来,模块文件才是完整的,之后再跑 update-initramfs 才有意义。
4.6 重建 initramfs 并更新 GRUB
# 重建内核启动镜像 initramfs(补全磁盘驱动,关键步骤)
update-initramfs -u
# 重新安装 grub 引导(我这台写 /dev/sda;EFI 系统若前面挂了 /boot/efi,grub-install 会自动识别走 EFI)
grub-install /dev/sda
# 更新 grub 启动菜单,生成 /boot/grub/grub.cfg
update-grub
两条命令的区别:
–update-grub:只更新开机启动菜单(/boot/grub/grub.cfg);
–update-initramfs -u:重建内核启动镜像(/boot/initrd.img-xxx),磁盘驱动就藏在这个文件里。二者缺一不可,只更新 grub 不重建 initramfs,照样起不来。
4.7 退出 chroot 并清理挂载
# 退出 chroot
exit
# 递归卸载所有挂载目录
sudo umount -R /mnt
然后虚拟机关机,摘掉 ISO 镜像,把启动顺序改回硬盘优先。
五、验证
重启后没再进 initramfs 救援模式,正常进到了 Ubuntu 24.04.2 LTS tty1 字符终端登录界面。输账号密码能正常登录,系统内核、磁盘挂载、进程调度全部正常。内核/磁盘故障彻底解决,系统救活了。
六、注意事项
6.1 update-grub ≠ 修系统
update-grub 只负责生成开机菜单(/boot/grub/grub.cfg),跟内核能不能起来没关系。很多人习惯跑完修复就跑 update-grub,但这只更新了菜单,内核镜像本身没变。
6.2 update-initramfs -u 才是关键,但有前提
磁盘驱动靠 update-initramfs -u 打包进 initrd,缺了开机就挂。但如果 /lib/modules 里的模块文件本身已损坏,必须先 apt reinstall 重装内核镜像,把模块文件补回来,再跑 update-initramfs 才有意义。
6.3 内核模块丢失是掉进 initramfs 的常见诱因
看到 (initramfs) shell,第一反应就该查 /lib/modules。不要上来就重装系统。
6.4 chroot 里能不能联网很关键
配上 DNS 后能 apt,就能走重装内核这条路;别因为网络不通就放弃,退回到手动提取模块的办法。
6.5 LiveCD + chroot 是通用离线修复方案
记住固定流程:挂载分区 → 绑定虚拟文件系统 → chroot → 修复 → umount。这套流程适用于大部分 Linux 系统起不来的场景。