资讯动态

Ubuntu开机卡在initramfs?一文详解原因与修复方法

发布时间:2026/10/27 6:19:42 来源:尧图企业网站定制
1. 开机卡在 initramfs 到底是怎么回事如果你用 Ubuntu 有一段时间了大概率见过这个画面开机自检走完GRUB 菜单一闪而过然后屏幕上刷出一行行文字最后停在一个孤零零的提示符上——(initramfs)。键盘还能敲但敲什么命令都像是石沉大海重启几次还是老样子。这个场景我遇到过不止一次有在自己机器上折腾分区搞出来的也有帮同事处理服务器异常断电后留下的烂摊子。先把结论说清楚initramfs 是内核启动早期加载的一个临时根文件系统它的职责是在真正的根分区挂载之前把必要的驱动、挂载工具、文件系统检查程序先装进内存里跑起来。当它找不到、或者挂不上你真正的根分区时就会把你丢进这个应急 shell 里等你手动修复。所以卡在 initramfs 不是系统坏了而是系统在等你告诉它根分区在哪、或者帮你把根分区修好。这个问题的适用人群其实很广日常用 Ubuntu 桌面版的普通用户可能因为一次强制关机、一次分区调整就中招跑 Ubuntu Server 的运维同学可能因为磁盘阵列掉线、UUID 变化遇到同样的问题还有一类是玩双系统、经常用 Live USB 调整分区的人更是高频踩坑。不管你是哪一类只要理解了 initramfs 的加载逻辑绝大多数情况都能在十分钟内定位并解决根本不需要重装系统。我写这篇东西的目的就是把这套排查逻辑完整摊开从看懂屏幕上的报错到用几条命令验证根分区状态再到针对不同成因给出对应的修复动作。全程不需要图形界面纯命令行操作你照着做就行。下面我会先讲清楚它为什么会发生再讲怎么一步步排查最后给出可以直接抄的修复方案和一堆踩坑经验。2. 先搞懂原理initramfs 的加载链路与失败点2.1 从 GRUB 到根分区挂载的完整链路要修问题先得知道正常流程长什么样。Ubuntu 的启动链路大致是这样走的固件自检完成后引导程序GRUB读取配置把内核镜像和 initramfs 镜像一起加载进内存然后把控制权交给内核。内核启动后先解压 initramfs 到内存里形成一个临时的根文件系统接着执行里面的/init脚本。这个脚本会做几件事加载根分区所需的存储驱动比如 SATA、NVMe、RAID 控制器驱动按内核命令行里root参数指定的设备去查找根分区必要时先跑一遍文件系统检查最后把真正的根分区挂载到/root目录再切换过去switch_root临时文件系统功成身退。失败点就藏在这条链路的每一环里。root参数指向的设备找不到会失败设备找到了但驱动没加载会失败设备在但文件系统有错误挂不上会失败用了 LVM 或加密卷但激活失败也会失败。而 initramfs 的应急 shell 之所以有用就是因为它在这个阶段已经把基础工具都装进内存了你可以手动执行blkid、fsck、mount这些命令去验证和修复修好之后输入exit就能继续启动流程。理解这条链路的意义在于你看到的报错信息基本能直接对应到链路上的某个具体环节。比如提示ALERT! UUIDxxx does not exist那就是查找设备这一步失败了提示root filesystem requires a manual fsck那就是文件系统检查这一步没过。对症下药比盲目敲命令高效得多。2.2 为什么偏偏是重启之后出问题很多人会疑惑昨天还好好的怎么重启一下就进不去了这恰恰是这类问题的典型特征。initramfs 阶段依赖的信息很多是在上一次正常关机时固化下来的一旦这些信息和你当前的磁盘实际状态对不上重启就会暴露出来。常见的触发场景有这么几类。第一类是非正常关机比如断电、长按电源键强制关机、系统崩溃导致文件系统处于脏状态日志没写完下次启动时 initramfs 里的检查程序发现不一致就会拦下来要求手动修复。第二类是分区或磁盘变动你用工具调整了分区大小、删了又建、克隆了磁盘、换了硬盘接口分区的 UUID 变了但/etc/fstab和 initramfs 里记录的还是旧的自然找不到。第三类是内核或 initramfs 镜像更新不完整比如更新过程中断电导致镜像损坏或者缺少新硬件的驱动。第四类是LVM、软 RAID、加密卷的元数据异常激活逻辑没跑通。我个人的经验是桌面用户遇到最多的是第一类和第二类服务器上第三类和第四类更常见。搞清楚你属于哪一类后面的排查会快很多。这里有个小技巧如果你最近刚做过分区操作或者强制关机基本可以锁定方向直接跳到对应的修复章节。2.3 应急 shell 里那些命令为什么能用有人会问根分区都没挂上为什么blkid、fsck还能跑这正是 initramfs 设计的精妙之处。initramfs 镜像里打包了一套精简的 busybox 工具集常用的磁盘探测、文件系统检查、挂载命令都在里面。它跑在内存里不依赖硬盘上的任何东西所以哪怕你的根分区彻底挂不上这套工具依然可用。这也解释了为什么修复操作是安全的你在应急 shell 里做的检查、修复都是针对磁盘上的数据操作完exit让系统重新走一遍挂载流程即可。唯一需要注意的是在应急 shell 里不要乱挂载、乱写数据尤其是不要在没有确认设备身份的情况下执行格式化类命令那是唯一可能造成不可逆损失的操作。只要守住这条底线剩下的排查都是可逆的。3. 第一步永远是读报错把屏幕信息翻译成人话3.1 常见报错信息对照表进到 initramfs 之后别急着敲命令先把屏幕上滚动的信息往回翻一翻有些系统会保留在终端里用 ShiftPageUp 可以回看。报错信息是排查的起点我整理了一张对照表把最常见的几种提示和它们的真实含义列出来屏幕提示关键词真实含义优先排查方向UUIDxxx does not exist按 UUID 找不到根分区设备UUID 是否变化、设备是否被识别Unable to find root device同上设备查找失败硬盘连接、驱动、分区表root filesystem requires a manual fsck文件系统有错误需手动检查直接跑 fsck 修复Gave up waiting for root device等待根设备超时慢速磁盘、USB 设备、驱动缺失Volume group xxx not foundLVM 卷组未激活检查 LVM 元数据、激活卷组cryptsetup: device not found加密卷未解锁或映射失败检查加密配置No init found根分区挂上了但找不到 init 程序根分区挂错、系统文件损坏这张表建议你截图存着下次再遇到直接对号入座。需要强调的是报错信息有时会连续刷好几屏真正有用的往往是最后几行因为前面的多是驱动加载的常规输出。找到那个带ALERT、Gave up、requires字样的行基本就锁定问题了。3.2 用 blkid 确认设备到底在不在不管报错是什么进到应急 shell 后的第一个动作我建议统一是执行blkid。这条命令会列出当前系统能识别到的所有块设备及其 UUID、文件系统类型。它的价值在于先确认你的根分区设备到底有没有被内核认出来。blkid正常输出大概长这样设备名和 UUID 是示意/dev/sda1: UUIDa1b2c3d4-... TYPEext4 PARTUUID... /dev/sda2: UUIDe5f6g7h8-... TYPEswap PARTUUID... /dev/nvme0n1p1: UUIDi9j0k1l2-... TYPEext4 PARTUUID...拿到输出后做两件事。第一找到你印象中应该是根分区的那个设备通常是最大的 ext4 分区或者带/标记的那个记下它的 UUID。第二把这个 UUID 和报错信息里提到的 UUID 对比。如果两者不一致那问题就明确了——系统在找一个已经不存在的 UUID多半是分区变动导致的。如果blkid的输出里压根没有你的根分区那问题更严重说明设备没被识别得往硬件连接、驱动、分区表方向查。提示如果blkid输出为空或者设备列表明显不全先别急着下结论试试ls /dev/sd*和ls /dev/nvme*看看设备节点在不在。设备节点在但 blkid 读不出文件系统可能是分区表损坏设备节点都不在那就是驱动或硬件层面的问题了。3.3 核对 fstab 与内核命令行里的 root 参数确认了设备状态之后下一步是核对系统期望的根分区和实际存在的根分区是否一致。这里有两个信息源要看一个是内核命令行里的root参数另一个是/etc/fstab里的根分区条目。不过在应急 shell 里根分区还没挂上/etc/fstab是读不到的所以先看内核命令行cat /proc/cmdline输出里会有一段rootUUIDxxxx或者root/dev/sda1这样的内容这就是系统当前期望挂载的根分区。把它和blkid里查到的实际 UUID 一对比问题往往就水落石出了。如果root指向的 UUID 在blkid里找不到那修复方向就是更新引导配置里的 root 参数让它指向正确的设备。这里补充一个背景知识Ubuntu 默认用 UUID 而不是/dev/sdaX这种设备名来标识根分区原因是设备名会随硬件插拔顺序变化而 UUID 是分区创建时生成的、相对稳定的标识。这个设计本身是好的但代价就是一旦分区被重建、克隆或调整UUID 变了而配置没跟着更新就会出问题。理解了这一点你就明白为什么改个分区就开不了机是这么常见的事了。4. 对症下药四类高频成因的修复实操4.1 文件系统损坏手动 fsck 的标准流程这是最常见的一类报错通常是root filesystem requires a manual fsck或者类似提示。成因多半是非正常关机导致文件系统日志不完整。修复动作很直接就是手动跑一遍文件系统检查。先确认根分区的设备名假设blkid显示根分区是/dev/sda2文件系统是 ext4那么执行fsck -y /dev/sda2-y参数的意思是所有询问都自动回答 yes适合无人值守的修复场景。如果你想更谨慎一点可以先不加-y跑一遍看看它报什么问题再决定是否让它自动修复。对于 ext4 文件系统fsck实际上是调用e2fsck修复过程会输出大量信息耐心等它跑完。跑完之后如果提示修复成功直接输入exit退出应急 shell系统会重新尝试挂载根分区并继续启动。如果fsck报出大量错误、甚至提示无法修复那就要警惕了可能是磁盘出现了物理坏道这时候建议先用smartctl之类的工具检查磁盘健康状态别急着反复修复。注意fsck一定要针对未挂载的分区执行。在 initramfs 阶段根分区本来就没挂上所以是安全的。但如果你在正常系统里对已挂载的根分区跑 fsck那是有风险的这一点要分清楚场景。我踩过的一个坑是有些时候fsck跑完提示修复成功但exit之后还是回到 initramfs。这种情况多半是修复不彻底或者有多个分区都有问题。我的做法是再跑一次fsck确认它输出clean字样同时检查一下/etc/fstab里挂载的其他分区比如单独的/home或/boot是否也需要检查。别只盯着根分区其他分区出问题同样会卡住启动。4.2 UUID 变化更新引导参数与 fstab 的完整操作如果排查发现是 UUID 对不上修复就分两步先让系统这次能启动起来再把配置永久改对。临时启动的办法是在应急 shell 里手动挂载正确的根分区然后切换过去。假设blkid显示正确的根分区是/dev/sda2mount /dev/sda2 /root exit有些 initramfs 实现里exit会重新走挂载流程但如果root参数还是错的它可能又失败。更稳妥的做法是直接在 GRUB 里临时改参数重启进 GRUB 菜单按e编辑启动项找到rootUUIDxxx那一行把 UUID 改成正确的然后按CtrlX或F10启动。这样能确保这次一定进得去系统。进系统之后第一件事是更新/etc/fstab。用编辑器打开把根分区那一行的 UUID 改成新的sudo nano /etc/fstab改完之后还要更新 GRUB 配置和 initramfs 镜像让新的 UUID 固化进去sudo update-grub sudo update-initramfs -u这两条命令缺一不可。update-grub重新生成 GRUB 配置确保内核命令行里的root是新 UUIDupdate-initramfs重新打包 initramfs 镜像确保里面的挂载脚本用的是新信息。我见过有人只跑了其中一条结果重启后问题依旧白白折腾一轮。4.3 LVM 与加密卷激活失败的处理思路如果你的根分区在 LVM 逻辑卷上报错可能是Volume group xxx not found。这时候先确认物理卷和卷组的状态lvm vgscan lvm vgchange -ayvgscan扫描所有卷组vgchange -ay激活所有卷组。如果激活成功再用blkid看看逻辑卷设备通常是/dev/mapper/xxx或/dev/卷组名/逻辑卷名是否出现然后exit继续启动。如果vgscan都扫不到卷组那可能是 LVM 元数据损坏需要用pvck、vgcfgrestore这类工具从备份恢复这就属于比较深的操作了建议先备份数据再动手。加密卷的情况类似报错通常是cryptsetup相关。应急 shell 里可以手动解锁cryptsetup luksOpen /dev/sda3 cryptroot解锁后设备会映射到/dev/mapper/cryptroot再exit让系统继续。如果解锁失败先确认密码没错再检查 LUKS 头部是否损坏。这类场景我建议平时就把 LUKS 头部的备份做好真出问题时能省很多事。4.4 驱动缺失为什么换了硬件就进不去还有一类容易被忽略的成因是存储驱动没打进 initramfs。典型场景是把系统盘从一台机器挪到另一台、或者主板换了存储控制器模式比如从 IDE 兼容模式切到 AHCI、从 SATA 切到 NVMe。这时候内核在 initramfs 阶段加载不到对应的驱动自然找不到根分区。判断方法blkid输出里完全没有你的根分区设备ls /dev/sd*也看不到。修复思路是进 Live 环境chroot 到原系统把对应驱动加进 initramfs 配置。具体做法是在/etc/initramfs-tools/modules里加上驱动模块名然后update-initramfs -u。不过说实话这类问题定位成本较高如果你不确定是驱动问题建议先排除前面三类更常见的原因。5. 预防胜于修复让 initramfs 少来找麻烦5.1 日常习惯里最值得做的几件事与其每次出问题再手忙脚乱不如把几个习惯养起来能挡掉大部分 initramfs 故障。第一条尽量避免强制关机。文件系统损坏绝大多数源于非正常断电能正常关机就正常关机服务器上配个 UPS 更是基本操作。第二条动分区之前先备份 fstab 和引导配置。你永远不知道一次分区调整会带来什么连锁反应提前备份/etc/fstab、/boot/grub/grub.cfg这些文件出问题时能快速对照。第三条分区操作后立刻更新引导和 initramfs。前面讲过UUID 变化后必须跑update-grub和update-initramfs -u养成操作完就执行的习惯别等重启才发现问题。第四条定期检查磁盘健康。用smartctl -a /dev/sda看看 SMART 信息提前发现即将故障的磁盘比事后抢救数据划算得多。5.2 备份 initramfs 与引导配置的实操备份这件事说起来简单做起来要有章法。我通常会把关键配置和镜像一起备份到一个独立位置比如外接盘或者另一块硬盘。需要备份的东西包括/boot目录下的内核和 initramfs 镜像、/etc/fstab、/etc/default/grub、/boot/grub/grub.cfg。一条命令搞定sudo tar czf /backup/boot-config-$(date %F).tar.gz /boot /etc/fstab /etc/default/grub这样打包出来的归档在系统起不来的时候可以从 Live 环境里解压回去对照。别小看这个动作我有一次就是因为留了旧版 initramfs 镜像在新镜像出问题时直接换回去就恢复了省了大量排查时间。5.3 双系统与频繁调分区用户的额外提醒如果你玩双系统或者经常用 Live USB 调整分区有几个额外的坑要留意。第一Windows 的快速启动和休眠功能会锁定分区导致 Linux 侧看到的分区状态异常建议在 Windows 里关掉快速启动。第二调整分区顺序或大小后务必重新确认所有分区的 UUID别假设只有被调整的那个变了。第三GRUB 的 os-prober 有时会漏掉系统双系统环境下更新 GRUB 后记得检查菜单项是否完整。还有一点用 Live USB 做修复时chroot 进去操作是最稳的方式。挂载原系统的根分区到/mnt再挂载/dev、/proc、/sys然后chroot /mnt这样你执行的update-grub、update-initramfs都是针对原系统的不会误操作到 Live 环境。这个流程我建议你提前演练一遍真出问题时能从容应对。6. 常见问题速查与我的踩坑记录6.1 高频问题速查表现象可能原因快速验证处理动作反复回到 initramfsfsck 未彻底修复再跑一次 fsck 看是否 clean彻底修复或检查其他分区exit 后无反应根分区仍挂不上手动 mount 测试检查 UUID、驱动、文件系统blkid 无输出设备未识别ls /dev/sd*查硬件连接、驱动、分区表修复后重启又坏配置未固化检查是否跑了 update 命令补跑 update-grub 和 initramfs加密卷解锁失败密码错或头部损坏确认密码、查 LUKS 状态从备份恢复头部这张表是我这些年遇到问题后随手记下来的基本覆盖了九成以上的场景。遇到没见过的报错先别慌回到第 3 章的方法论读报错、跑 blkid、对 UUID三步走下来方向基本就清楚了。6.2 几个让我印象深刻的坑说几个真实踩过的坑都是文档里不会写的。第一个坑有一次fsck跑完提示修复成功我exit之后系统正常启动结果第二天又卡 initramfs。后来发现是磁盘有坏道fsck只是把坏块标记了但坏道还在扩散。教训是修复完要查 SMART别把症状当病因。第二个坑改完 fstab 里的 UUID忘了改 GRUB 里的root参数结果重启还是进不去。这两个地方是独立的fstab 管的是系统启动后挂载其他分区GRUB 的root管的是内核找根分区必须都改。第三个坑在 Live 环境里直接对原系统分区跑update-initramfs没 chroot结果更新的是 Live 环境的镜像原系统纹丝不动。这个错误很隐蔽因为命令执行没报错但重启后问题依旧。第四个坑比较有意思一台机器换了主板存储控制器从 SATA 模式切到了 RAID 模式结果 initramfs 里没有对应的驱动死活找不到盘。最后是进 BIOS 把模式改回去才解决。这个案例说明硬件层面的变动同样会引发 initramfs 问题排查时别只盯着软件配置。6.3 给不同基础读者的上手建议如果你是刚接触 Ubuntu 的新手遇到 initramfs 别慌先按第 3 章的步骤读报错、跑blkid大概率是文件系统损坏跑个fsck -y就能解决。记住一条铁律在应急 shell 里只做检查和修复不做格式化、不删分区这样最坏情况也只是没修好不会丢数据。如果你有一定基础建议把第 4 章的四类成因都过一遍理解每类问题的判断依据和修复逻辑这样遇到变种问题时能举一反三。同时把第 5 章的预防措施落实到位尤其是备份和分区操作后的更新习惯。如果你是运维或重度用户重点放在 LVM、加密卷、驱动缺失这几类复杂场景上把 chroot 修复流程练熟把备份策略做扎实。这类问题一旦发生在生产环境时间就是金钱提前演练过的流程能帮你把恢复时间压到最短。我个人在实际操作中的体会是initramfs 问题看着吓人其实逻辑非常清晰它就是一个系统找不到家的应急状态你要做的就是帮它把回家的路指对。绝大多数情况下几条命令就能解决真正需要重装系统的概率极低。把报错读懂、把 UUID 对上、把配置固化这三件事做到位这类问题基本就翻篇了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑