
🔥个人主页:爱和冰阔乐 📚专栏传送门:《数据结构与算法》 、C++ 🐶学习方向:C++方向学习爱好者 ⭐人生格言:得知坦然 ,失之淡然

🏠博主简介 
文章目录
- 前言
- 一、进入 `(initramfs)` 后怎么判断
-
- 1.1 先核对内核收到的启动参数
- 1.2 按硬件情况加载模块
- 1.3 LVM 或加密卷场景
- 1.4 文件系统检查
- 二、recovery mode 能做什么
- 三、完全不能启动:使用 Live USB + chroot
-
- 3.1 找到根分区和 EFI 分区
- 3.2 挂载原系统
- 3.3 绑定运行环境
- 3.4 进入 chroot
- 3.5 GRUB 本身损坏时
- 3.6 正确退出并卸载
- 四、什么时候需要重新安装内核包
- 五、新内核没修好时,暂时让旧内核成为默认项
- 六、恢复之后必须做的验收
-
- 6.1 确认内核版本
- 6.2 检查本次启动错误
- 6.3 检查失败单元
- 6.4 检查 DKMS
- 6.5 检查关键模块
- 6.6 检查磁盘和挂载
- 6.7 至少完成一轮连续验证
- 七、下次升级内核前,先把风险降下来
-
- 7.1 查看待升级内容
- 7.2 检查 `/boot`
- 7.3 记录当前可用内核与 DKMS
- 7.4 远程服务器必须保留带外入口
- 7.5 不要一次改变太多关键变量
- 八、最常见的错误做法
-
- 8.1 直接删除内核文件
- 8.2 在唯一可启动内核上执行自动清理
- 8.3 对已挂载根分区直接 `fsck`
- 8.4 黑屏就只重装显卡驱动
- 8.5 把 `nomodeset` 当永久方案
- 8.6 只看当前启动日志
- 九、恢复流程速查
- 总结
- 参考资料
前言
当旧内核也无法正常进入系统时,排查环境会从完整 Ubuntu 系统逐步缩小为 recovery mode、initramfs shell,甚至 Live USB。
这一篇承接上篇,但也可以单独阅读,重点处理下面三种情况:
后半部分还会整理内核包重装、旧内核默认项、恢复验收、升级前检查和常见错误操作。
注意:fsck、磁盘挂载、grub-install 和 chroot 都会直接操作系统文件或启动环境。执行前必须确认设备名、分区类型、启动模式和挂载状态。
一、进入 (initramfs) 后怎么判断
1.1 先核对内核收到的启动参数
常见提示:
ALERT! UUID=xxxx does not exist
Dropped to a shell!
(initramfs)
先执行:
cat /proc/cmdline
确认其中的 root=UUID=…。
再看系统当前识别到的设备:
cat /proc/partitions
ls /dev
ls /dev/disk/by-uuid
如果目标 UUID 根本不存在,可能是:
- 存储驱动没有加载;
- 磁盘没有被识别;
- UUID 已经变化;
- LVM 或加密卷没有激活;
- GRUB 仍然传入旧 UUID。
1.2 按硬件情况加载模块
常见示例:
modprobe nvme
modprobe ahci
modprobe virtio_blk
不要把所有模块一起乱加载,应根据实际硬件选择。加载后重新检查:
ls /dev/disk/by-uuid
如果设备随后出现,说明相关模块可能没有正确进入 initramfs。
1.3 LVM 或加密卷场景
如果根分区位于 LVM,可以尝试:
lvm pvscan
lvm vgscan
lvm vgchange -ay
如果是 LUKS 加密卷,需要先确认 initramfs 中存在 cryptsetup,再根据实际映射名称解锁。不同安装方式差异较大,不要照抄不匹配的设备名。
1.4 文件系统检查
只有在目标文件系统未挂载时,才能安全执行检查。
ext4 示例:
fsck -f /dev/nvme0n1p2
不要对正在读写挂载的根文件系统直接执行修复。
XFS、Btrfs、LUKS 和 LVM 的处理工具不同,不能把 ext4 的命令机械套用到所有环境。
二、recovery mode 能做什么
在 GRUB 中选择带有 (recovery mode) 的内核项。常见菜单包括:
- resume:继续正常启动;
- clean:尝试释放磁盘空间;
- dpkg:修复损坏的软件包;
- fsck:检查文件系统;
- network:启用网络;
- root:进入 root shell。
进入 root shell 后,根文件系统可能是只读的:
mount -o remount,rw /
如果 /boot、/boot/efi、/var 等是独立分区,可以在检查 /etc/fstab 后执行:
mount -a
随后根据实际问题运行:
dpkg –configure -a
apt-get -f install
update-initramfs -u -k all
update-grub
dkms status
如果 mount -a 失败,不要忽略报错继续操作。它往往说明 /etc/fstab 中本身就存在错误挂载项。
三、完全不能启动:使用 Live USB + chroot
当新旧内核、recovery mode 都进不去时,Live USB 是最稳妥的恢复入口。
下面这张图更容易理解 chroot 的作用:Live 系统本身不是被修复对象,它只是搭了一座桥,让我们临时进入硬盘里的原 Ubuntu 系统。

3.1 找到根分区和 EFI 分区
从 Ubuntu Live 环境启动后:
lsblk -f
假设:
/dev/nvme0n1p2 根分区
/dev/nvme0n1p1 EFI 分区
实际机器可能使用 LVM、LUKS、RAID 或独立 /boot,应以 lsblk -f 的真实结果为准。
3.2 挂载原系统
挂载根分区:
sudo mount /dev/nvme0n1p2 /mnt
UEFI 机器挂载 EFI 分区:
sudo mkdir -p /mnt/boot/efi
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
如果有独立 /boot:
sudo mount /dev/<boot-partition> /mnt/boot
3.3 绑定运行环境
推荐使用递归绑定,避免遗漏 /dev 下的子挂载:
sudo mount –rbind /dev /mnt/dev
sudo mount –make-rslave /mnt/dev
sudo mount -t proc /proc /mnt/proc
sudo mount –rbind /sys /mnt/sys
sudo mount –make-rslave /mnt/sys
sudo mount –rbind /run /mnt/run
sudo mount –make-rslave /mnt/run
确认 DNS:
cat /mnt/etc/resolv.conf
现代 Ubuntu 往往使用 systemd-resolved 管理该文件,不要无条件覆盖原有符号链接。
3.4 进入 chroot
sudo chroot /mnt /bin/bash
进入后先确认你操作的是原系统:
ls /boot
ls /lib/modules
dpkg –audit
dkms status
再按需修复:
dpkg –configure -a
apt-get -f install
update-initramfs -u -k all
update-grub
3.5 GRUB 本身损坏时
UEFI 示例:
grub-install \\
–target=x86_64-efi \\
–efi-directory=/boot/efi \\
–bootloader-id=ubuntu
update-grub
Legacy BIOS 示例通常是把 GRUB 安装到整块磁盘,而不是某个分区:
grub-install /dev/sda
update-grub
执行 grub-install 前必须确认启动模式、目标磁盘和 EFI 挂载点。把命令复制到错误磁盘上,可能影响其他系统的引导。
3.6 正确退出并卸载
退出 chroot:
exit
按相反顺序卸载:
sudo umount -R /mnt/run 2>/dev/null || true
sudo umount -R /mnt/sys 2>/dev/null || true
sudo umount /mnt/proc 2>/dev/null || true
sudo umount -R /mnt/dev 2>/dev/null || true
sudo umount /mnt/boot/efi 2>/dev/null || true
sudo umount /mnt/boot 2>/dev/null || true
sudo umount /mnt
如果提示 busy:
sudo fuser -vm /mnt
检查是否仍有终端或进程停留在 /mnt 中。
四、什么时候需要重新安装内核包
如果确认新内核文件不完整,可以重新安装对应包。
先查询:
dpkg -l | grep "$NEW_KERNEL"
常见包包括:
- linux-image-<version>;
- linux-modules-<version>;
- linux-modules-extra-<version>;
- linux-headers-<version>。
重新安装内核和基础模块:
sudo apt install –reinstall \\
"linux-image-$NEW_KERNEL" \\
"linux-modules-$NEW_KERNEL"
部分通用内核还需要额外模块包:
sudo apt install –reinstall \\
"linux-modules-extra-$NEW_KERNEL"
随后重新生成:
sudo update-initramfs -u -k "$NEW_KERNEL"
sudo update-grub
包名要以当前系统仓库和安装状态为准,可以先核对:
apt-cache policy "linux-image-$NEW_KERNEL"
五、新内核没修好时,暂时让旧内核成为默认项
最安全的临时方案,是每次开机从 GRUB 手动选择旧内核。
需要长期暂时固定时,先备份:
sudo cp /etc/default/grub \\
/etc/default/grub.backup
查看真实菜单路径:
grep -E "^menuentry|^submenu" \\
/boot/grub/grub.cfg
可以使用 GRUB saved entry 机制:
sudo grub-set-default \\
'Advanced options for Ubuntu>Ubuntu, with Linux <old-version>-generic'
并确保 /etc/default/grub 中设置:
GRUB_DEFAULT=saved
然后:
sudo update-grub
菜单标题因机器而异,不要直接复制别人电脑上的版本字符串。
六、恢复之后必须做的验收
一次启动成功,只能说明“这次碰巧进来了”,还不能证明修复完成。
6.1 确认内核版本
uname -r
6.2 检查本次启动错误
sudo journalctl -b -p err
sudo journalctl -b -k -p err
6.3 检查失败单元
systemctl –failed
6.4 检查 DKMS
dkms status
6.5 检查关键模块
lsmod | head
lspci -k
单独检查模块信息:
modinfo <module-name>
6.6 检查磁盘和挂载
findmnt
lsblk -f
df -h
6.7 至少完成一轮连续验证
建议验证:
- 新内核冷启动;
- 新内核正常重启;
- 旧内核仍能从 GRUB 进入;
- 网络、声音、显卡正常;
- 关键磁盘和外设正常;
- VirtualBox、NVIDIA、ZFS 等外部模块可用。
确认一切正常前,继续保留旧内核。
七、下次升级内核前,先把风险降下来
7.1 查看待升级内容
apt list –upgradable
模拟升级:
sudo apt-get -s upgrade
7.2 检查 /boot
df -h /boot
ls -lh /boot
7.3 记录当前可用内核与 DKMS
uname -r
dpkg -l 'linux-image-*' | grep '^ii'
dkms status
7.4 远程服务器必须保留带外入口
升级远程服务器内核前,至少确认一种不依赖 SSH 的恢复通道:
- 云厂商串口控制台;
- IPMI、iDRAC、iLO;
- 虚拟机控制台;
- 救援模式;
- 能把系统盘挂到另一台机器的能力。
只有 SSH、没有控制台时,一旦内核启动失败,远程操作会直接中断。
7.5 不要一次改变太多关键变量
不要在同一个维护窗口同时做:
- 升级内核;
- 删除全部旧内核;
- 修改 GRUB 参数;
- 更新显卡驱动;
- 调整磁盘分区。
每次只改变一类关键内容,失败后才能快速定位和回滚。
八、最常见的错误做法
8.1 直接删除内核文件
手工删除 /boot/vmlinuz-*、/boot/initrd.img-* 或 /lib/modules/*,会让包管理器记录与实际磁盘文件不一致。
内核应该通过包管理器安装和卸载。
8.2 在唯一可启动内核上执行自动清理
先检查当前内核和模拟删除列表:
uname -r
sudo apt autoremove –dry-run
8.3 对已挂载根分区直接 fsck
文件系统修复应在未挂载状态、recovery mode 或 Live 环境中进行。
8.4 黑屏就只重装显卡驱动
黑屏可能与显卡有关,但 (initramfs)、根 UUID 不存在和 VFS panic 显然是不同层的问题。
8.5 把 nomodeset 当永久方案
它适合临时进入系统和缩小问题范围。长期方案仍然是正确的驱动、模块签名和启动参数。
8.6 只看当前启动日志
使用旧内核成功启动后:
journalctl -b
看到的是当前正常启动。要看上一轮失败记录,应使用:
journalctl -b -1
九、恢复流程速查
| 1 | 先找可启动路径 | GRUB 旧内核、recovery、Live USB |
| 2 | 确认失败阶段 | 屏幕报错、journalctl -b -1 -k |
| 3 | 检查基础状态 | df -h、dpkg –audit、lsblk -f |
| 4 | 检查驱动和模块 | dkms status、lspci -k、DKMS 日志 |
| 5 | 修复启动文件 | update-initramfs、update-grub |
| 6 | 无法进入系统 | Live USB 挂载并 chroot |
| 7 | 完成验收 | 新旧内核、网络、显卡、磁盘、模块 |
可以把整个思路记成一句话:
先保住旧内核,再判断故障层;先修包、模块和 initramfs,最后再动 GRUB 和默认启动项。
总结
当旧内核无法提供完整操作环境时,恢复路线应该逐级推进:
initramfs shell 检查根设备 → recovery mode 修复包和启动文件 → Live USB 挂载原系统 → chroot 重建 initramfs 与 GRUB
整个过程中,最容易出错的不是命令本身,而是对设备名、UUID、EFI 分区、LVM、加密卷和挂载状态判断错误。
恢复成功后不要立刻清理旧内核。先完成冷启动、重启、网络、显卡、磁盘、DKMS 和关键外设验证,再决定是否删除故障内核或调整默认启动项。
网硕互联帮助中心





评论前必须登录!
注册