云计算百科
云计算领域专业知识百科平台

【Linux】系统彻底进不去怎么办?initramfs、recovery 与 chroot 救援指南

封面

🔥个人主页:爱和冰阔乐 📚专栏传送门:《数据结构与算法》 、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。

这一篇承接上篇,但也可以单独阅读,重点处理下面三种情况:

  • 启动后停在 (initramfs);
  • 只能进入 GRUB 的 recovery mode;
  • 系统完全无法启动,需要 Live USB 挂载原系统并进入 chroot。
  • 后半部分还会整理内核包重装、旧内核默认项、恢复验收、升级前检查和常见错误操作。

    注意: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 系统。

    Live USB 进入原系统进行 chroot 修复

    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 和关键外设验证,再决定是否删除故障内核或调整默认启动项。


    参考资料

  • Ubuntu Kernel:https://ubuntu.com/kernel
  • Ubuntu GRUB 2:https://help.ubuntu.com/community/Grub2
  • Ubuntu LiveCdRecovery:https://help.ubuntu.com/community/LiveCdRecovery
  • update-initramfs 手册:https://manpages.ubuntu.com/manpages/jammy/en/man8/update-initramfs.8.html
  • DKMS:https://github.com/dell/dkms
  • Linux Kernel initrd:https://docs.kernel.org/admin-guide/initrd.html
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Linux】系统彻底进不去怎么办?initramfs、recovery 与 chroot 救援指南
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!