CentOS 7 启动菜单第一行(默认内核)起不来、第二行(旧内核)能进,最常见的原因是内核升级后引导配置、驱动或系统文件没跟上。这种情况在 CentOS 7 上很典型,排查方向也比较固定。
可以先确认一下:第一行和第二行是不是不同的内核版本。如果是,问题基本就锁定在新内核的引导或驱动上;如果是同一个内核,那大概率是
grub.cfg配置有问题。
🔍 常见原因
- 新内核的 initramfs 缺失或损坏:内核升级后
dracut没重新生成对应的initramfs镜像,启动时找不到根文件系统,直接卡死或报错。 - 内核模块与硬件不兼容:新内核缺少你机器需要的驱动(比如网卡、磁盘控制器、显卡),启动到一半就挂掉。旧内核因为驱动匹配,所以能正常进系统。
-
/boot分区空间不足:内核升级时vmlinuz和initramfs没写全,文件不完整导致无法启动。 - SELinux 策略损坏:
/etc/selinux/config配置异常或安全上下文错乱,新内核在启动早期卡在starting switch root,换旧内核反而能绕过。 - GRUB 菜单顺序错乱:第一行指向的其实不是你想用的新内核,或者
GRUB_DEFAULT的数字索引和实际菜单对不上。
🛠 排查步骤
- 先确认内核版本差异:在第二行(能启动的那个)进入系统后,执行
uname -r查看当前内核。再对比第一行菜单项显示的内核版本号,确认是不是不同内核。 - 重建 initramfs:这是最常见的修复手段,针对当前内核重新生成启动镜像。
dracut -f /boot/initramfs-$(uname -r).img $(uname -r) - 重新生成 GRUB 配置:让菜单项和实际文件对应上。
grub2-mkconfig -o /boot/grub2/grub.cfg - 检查
/boot空间:df -h /boot,如果使用率接近 100%,先清理旧内核或扩大分区,再重复第 2、3 步。 - 临时禁用 SELinux 验证:如果怀疑是 SELinux 问题,可以编辑第一行菜单项(按
e),在linux16那行末尾加上selinux=0,启动成功后再永久修复/etc/selinux/config。 - 不行就卸载新内核:如果新内核反复修不好,直接在旧内核下卸载它,让系统回到稳定状态。
yum remove kernel-新内核版本号 grub2-mkconfig -o /boot/grub2/grub.cfg ```:ml-citation{ref="15,1" appearance="aggregated" data="citationList"}
⚠️ 需要留意的坑
如果第一行和第二行是同一个内核版本,那问题不在内核本身,而是
grub.cfg文件损坏或/boot分区有问题。这种情况直接重建 GRUB 配置大概率能解决。
内核升级属于高风险操作,修不好就先用旧内核顶着,不要在生产环境反复试错。动手前最好先备份数据或拍个虚拟机快照。