36人参与 • 2026-07-27 • Linux
当旧内核也无法正常进入系统时,排查环境会从完整 ubuntu 系统逐步缩小为 recovery mode、initramfs shell,甚至 live usb。
重点处理下面三种情况:
(initramfs);chroot。后半部分还会整理内核包重装、旧内核默认项、恢复验收、升级前检查和常见错误操作。
注意:fsck、磁盘挂载、grub-install 和 chroot 都会直接操作系统文件或启动环境。执行前必须确认设备名、分区类型、启动模式和挂载状态。
常见提示:
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 根本不存在,可能是:
常见示例:
modprobe nvme modprobe ahci modprobe virtio_blk
不要把所有模块一起乱加载,应根据实际硬件选择。加载后重新检查:
ls /dev/disk/by-uuid
如果设备随后出现,说明相关模块可能没有正确进入 initramfs。
如果根分区位于 lvm,可以尝试:
lvm pvscan lvm vgscan lvm vgchange -ay
如果是 luks 加密卷,需要先确认 initramfs 中存在 cryptsetup,再根据实际映射名称解锁。不同安装方式差异较大,不要照抄不匹配的设备名。
只有在目标文件系统未挂载时,才能安全执行检查。
ext4 示例:
fsck -f /dev/nvme0n1p2
不要对正在读写挂载的根文件系统直接执行修复。
xfs、btrfs、luks 和 lvm 的处理工具不同,不能把 ext4 的命令机械套用到所有环境。
在 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 中本身就存在错误挂载项。
当新旧内核、recovery mode 都进不去时,live usb 是最稳妥的恢复入口。
下面这张图更容易理解 chroot 的作用:live 系统本身不是被修复对象,它只是搭了一座桥,让我们临时进入硬盘里的原 ubuntu 系统。

从 ubuntu live 环境启动后:
lsblk -f
假设:
/dev/nvme0n1p2 根分区 /dev/nvme0n1p1 efi 分区
实际机器可能使用 lvm、luks、raid 或独立 /boot,应以 lsblk -f 的真实结果为准。
挂载根分区:
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
推荐使用递归绑定,避免遗漏 /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 管理该文件,不要无条件覆盖原有符号链接。
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
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 挂载点。把命令复制到错误磁盘上,可能影响其他系统的引导。
退出 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
菜单标题因机器而异,不要直接复制别人电脑上的版本字符串。
一次启动成功,只能说明“这次碰巧进来了”,还不能证明修复完成。
uname -r
sudo journalctl -b -p err sudo journalctl -b -k -p err
systemctl --failed
dkms status
lsmod | head lspci -k
单独检查模块信息:
modinfo <module-name>
findmnt lsblk -f df -h
建议验证:
确认一切正常前,继续保留旧内核。
apt list --upgradable
模拟升级:
sudo apt-get -s upgrade
df -h /boot ls -lh /boot
uname -r dpkg -l 'linux-image-*' | grep '^ii' dkms status
升级远程服务器内核前,至少确认一种不依赖 ssh 的恢复通道:
只有 ssh、没有控制台时,一旦内核启动失败,远程操作会直接中断。
不要在同一个维护窗口同时做:
每次只改变一类关键内容,失败后才能快速定位和回滚。
手工删除 /boot/vmlinuz-*、/boot/initrd.img-* 或 /lib/modules/*,会让包管理器记录与实际磁盘文件不一致。
内核应该通过包管理器安装和卸载。
先检查当前内核和模拟删除列表:
uname -r sudo apt autoremove --dry-run
文件系统修复应在未挂载状态、recovery mode 或 live 环境中进行。
黑屏可能与显卡有关,但 (initramfs)、根 uuid 不存在和 vfs panic 显然是不同层的问题。
它适合临时进入系统和缩小问题范围。长期方案仍然是正确的驱动、模块签名和启动参数。
使用旧内核成功启动后:
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 和关键外设验证,再决定是否删除故障内核或调整默认启动项。
以上就是linux系统彻底进不去的救援指南(initramfs、recovery与chroot)的详细内容,更多关于linux系统彻底进不去的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论