Ubuntu 更新内核后若无法启动,最稳妥的做法是先保留进入系统的通道,而不是立即删除内核、重装驱动或不断强制关机。

本文主要处理可以正常启动的仍是旧内核的情况。先定位启动链,再按顺序核查包管理状态、失败日志、/boot 空间、Secure Boot、DKMS、GRUB 参数、根文件系统 UUID 与 initramfs。
处理原则:先用旧内核恢复可操作环境,再根据证据修复新内核。旧内核在新内核完成验证前不要删除。
以下问题是本文的解决重点:
fstab 与 root= 启动参数;Ubuntu 从开机通电到进入桌面,大致需要经过以下阶段:
| 启动阶段 | 主要工作 | 常见故障表现 |
|---|---|---|
| UEFI/BIOS | 寻找启动项并完成硬件初始化 | Ubuntu 启动项缺失或启动盘未找到 |
| GRUB | 传入启动参数并呈现内核菜单 | 选项有误、菜单损坏或 GRUB 菜单缺失 |
| Linux Kernel | 基础设备、内存与 CPU 的初始化 | Kernel Panic、选定内核即刻重启 |
| initramfs | 寻找根文件系统并装入早期驱动 | 掉进 (initramfs)、根分区挂载失败、UUID 无法找到 |
| systemd 与根文件系统 | 启动服务,同时挂载磁盘 | emergency mode、fstab 挂载失败 |
| 驱动与桌面 | 外部模块、网卡与显卡的加载 | VirtualBox/NVIDIA 模块不可用、无线网卡消失或黑屏 |
应先判断故障阶段,再选择相应工具。
(initramfs):先核验 initramfs、存储驱动、UUID 与根分区;/etc/fstab 以及 systemd 中的失败单元;nomodeset;这项判断虽然简单,却能减少后续大量无效操作。
开机时尝试按住,适用于传统 BIOS 机器 Shift,通常在 UEFI 机器上需要连续按 Esc。固件启动速度因电脑而异,因此可能要尝试数次才能把握按键时机。
进入后从 GRUB 选择:
Advanced options for Ubuntu
例如,新旧内核以及对应的 recovery mode 一般都会列出:
6.x.y-new-generic6.x.y-new-generic (recovery mode)6.x.y-old-generic6.x.y-old-generic (recovery mode)先选择以普通方式启动旧内核的选项。只要旧内核仍能进入系统,后续检查与修复就会容易许多。
系统进入后优先执行:
uname -r
不要仅依据 GRUB 菜单中的选择,uname -r 显示的才是当前实际运行版本。
列出系统内已经安装的内核包:
dpkg -l 'linux-image-*' | grep '^ii'
然后检查 /boot 中是否同时保留新旧内核文件:
ls -lh /boot
重点关注:
vmlinuz-<version>:内核镜像;initrd.img-<version>:initramfs 与之对应;config-<version>:内核配置;System.map-<version>:记录符号映射。此时的旧内核并非“占空间的旧文件”,它其实是系统最关键的恢复入口。
清理应等到至少满足这些条件:
dkms status 没有异常;/boot 根文件系统和均未报错。先检查模拟结果,再进行自动清理:
sudo apt autoremove --dry-run
只有确认唯一可用旧内核与当前运行内核都不会被删除,才能决定是否执行:
sudo apt autoremove
不要在唯一能够启动的内核上做“自动清理实验”。
切换至旧内核后执行:
journalctl --list-boots
输出将列出最近多次启动记录,当前启动一般为 0,上一次为 -1,再上一次为 -2。
调取前一次启动的内核日志:
sudo journalctl -b -1 -k
仅查看错误级别:
sudo journalctl -b -1 -p err
检索高频关键字:
sudo journalctl -b -1 -k | grep -Ei 'panic|error|fail|timeout|nvme|ata|ext4|xfs|btrfs|firmware|nvidia|dkms'
journal 可能来不及写入日志,因为故障发生过早;这种情况下,云服务器串口日志、initramfs shell 输出和屏幕报错具有同等重要性。
调取正在运行的旧内核启动信息:
sudo dmesg -T | less
固件、模块、根分区和存储是观察重点:
sudo dmesg -T | grep -Ei 'nvme|ata|root|firmware|module|secure|iommu'
旧内核可以识别而新内核无法识别的设备,通常就是重要线索。
包可能因磁盘写满、网络异常或内核升级期间断电而留下“尚未完成配置,但包已解压”的状态。
首先检查:
sudo dpkg --audit
继续完成未结束的配置:
sudo dpkg --configure -a
修复依赖:
sudo apt-get -f install
先保证软件源和网络可用,再运行需要下载软件包的命令。
/boot 新内核包可能已安装,但 initramfs 没有完整生成;内核升级失败经常源于空间不足。
df -h /boot /
inode 也需随后核查:
df -i /boot /
如果更新期间出现:
No space left on device
不要只检查 / 的可用空间,单独挂载的 /boot 可能已经没有空间。
排查到这里时,先别急着重建所有东西。先确认磁盘空间、包状态和新内核目录完整,否则后面的 update-initramfs 仍会失败。
真正的根文件系统在内核刚运行时尚未挂载。作为临时早期用户空间,initramfs 通常装有以下内容:
以下问题可能在文件系统驱动、加密卷、LVM、VirtIO、AHCI 或 NVMe 未正确进入 initramfs 时出现:
Gave up waiting for root file system deviceALERT! UUID=... does not existKernel panic - not syncing: VFS: Unable to mount root fs
查看模块目录:
ls /lib/modules
假定故障内核为 6.x.y-new-generic,可预先定义变量:
NEW_KERNEL='6.x.y-new-generic'
确认相应目录存在:
test -d "/lib/modules/$NEW_KERNEL" && echo "modules directory exists"
随后核验 initrd 与内核:
ls -lh "/boot/vmlinuz-$NEW_KERNEL" "/boot/initrd.img-$NEW_KERNEL"
对现有 initramfs 进行更新:
sudo update-initramfs -u -k "$NEW_KERNEL"
对应 initrd 若完全缺失,可执行创建:
sudo update-initramfs -c -k "$NEW_KERNEL"
-u 表示更新,-c 代表创建。不要因为“重来一次”而直接手工删除 /boot/initrd.img-*,以免实际文件和包管理状态更难对应。
完成后进行检查:
ls -lh "/boot/initrd.img-$NEW_KERNEL"
lsinitramfs "/boot/initrd.img-$NEW_KERNEL" | less
检索 LVM、加密及常见存储组件:
lsinitramfs "/boot/initrd.img-$NEW_KERNEL" | grep -Ei 'nvme|ahci|virtio|dm-crypt|cryptsetup|lvm'
这里不能只因“没搜到一个名字”便判断模块缺失并不可靠:驱动可能已直接编入内核,文件名也未必符合预期。更稳妥的是比较:
lspci -k
还要比较旧内核相应 initramfs 中的内容。
sudo update-grub
类似输出在正常情况下会出现:
Found linux image: /boot/vmlinuz-...Found initrd image: /boot/initrd.img-...
对应 initrd 若未找到,即使已有内核镜像,也应先处理 initramfs 的生成错误。
lsblk -f
或者:
sudo blkid
查看系统配置:
cat /etc/fstab
重点核对:
/;/boot;/boot/efi;resume= 对应分区;克隆磁盘、恢复快照、重建文件系统、调整 LVM、替换硬盘或手工修改分区,都可能导致 UUID 变化。
长期在 fstab 内写死应尽量避免 /dev/sdaX、/dev/nvme0n1pX。UUID 通常更加稳定,而名称可能随着设备枚举顺序的变化而改变。
grep -n "linux.*root=" /boot/grub/grub.cfg | head
grub.cfg 不宜长期直接手动修改,因为一般由工具生成。需要修正 /etc/default/grub、/etc/fstab 或相关脚本,之后再运行:
sudo update-grub
先从 GRUB 菜单选定启动项,随后按 e,找到以 linux 开头的那一行。
临时诊断可采用这些操作:
quiet splash,让详细启动日志直接显示出来;nomodeset,用来确认是否停在显卡模式设置阶段;root=UUID=... 与实际根分区是否一致;resume=、显卡参数、模块黑名单或 IOMMU。配置不会被自动写回,因为临时修改仅对当前这次启动生效。
nomodeset 它能协助进入系统并明确排查方向,但通常不能作为显卡问题的最终处理方案。
DKMS 用于 NVIDIA、ZFS、VirtualBox 以及部分网卡驱动。模块并非随内核镜像自然存在,而是必须分别针对每一个内核版本构建。
检查状态:
dkms status
可能看到:
module/version, old-kernel, installedmodule/version, new-kernel, added
added、built 和 installed 属于不同情况。目标版本通常要达到,才能让该模块在新内核下正常工作 installed 状态。
日志通常位于:
/var/lib/dkms/<module>/<version>/build/make.log
查找全部日志:
sudo find /var/lib/dkms -name make.log -type f -print
查看最近的错误:
sudo tail -n 120 /var/lib/dkms/<module>/<version>/build/make.log
常见原因:
/boot 或 /var 空间不足;核验 headers:
dpkg -l "linux-headers-$NEW_KERNEL"
缺少时进行安装:
sudo apt install "linux-headers-$NEW_KERNEL"
重新构建:
sudo dkms autoinstall -k "$NEW_KERNEL"
完成后重建 initramfs 和 GRUB:
sudo update-initramfs -u -k "$NEW_KERNEL"sudo update-grub
查看状态:
mokutil --sb-state
查看内核日志:
sudo dmesg | grep -Ei 'secure boot|verification failed|module verification'
即使模块文件已经生成,加载仍可能失败;此时原因未必是编译,而可能来自信任链和签名。
唯一的处理方式并不是关闭 Secure Boot。具体方案应根据机器安全要求、驱动来源及 MOK 签名流程确定。
旧内核仍可启动时,系统文件、日志和包管理工具都能正常使用,修复条件其实很好;此时不要急于删除新内核,也不要同时执行所有修复命令。
更稳妥的顺序是:
通过旧内核进入系统 → 保存故障日志 → 磁盘空间与包状态检查 → 重新生成 initramfs → 核对 UUID 和 GRUB 参数 → 修复 DKMS → 再次测试新内核
至少保留一个经过启动验证的旧内核,然后才算完成修复。若旧内核、桌面环境与普通模式均无法进入,则应改用 Live USB + chroot、recovery mode 或 initramfs shell;操作方法将在下篇介绍。
以上详细介绍了Linux内核升级后无法启动的解决方案,更多Linux内核升级后启动失败的相关资料请关注本站其他文章!
推荐阅读: