CentOS升级内核后重启卡死,回退dracut生成initramfs
机器重启后只看见光标闪,键盘灯死活不亮,心里咯噔一下:完了,新内核栽了。别急着重装,九成是initramfs没把新驱动塞进去,系统找不到根分区,直接躺平。下面把踩坑全过程摊开,照着做,半小时内能让老系统重新蹦跶。

一、先别慌,确认卡死位置
重启按Esc或者把quiet去掉,看滚屏。如果停在Loading initial ramdisk之后无响应,十有八九initramfs缺模块。记下最后几行,比如dracut-initqueue timeout,后面要用。
二、用旧内核先爬进去
开机进GRUB,选第二行旧内核,回车。能进系统就直接跳到第三步;如果GRUB被新内核挤掉,用CentOS安装盘选Troubleshooting—Rescue,一路回车,最后选3拿到shell。
三、把新内核拉进黑名单
旧内核启动后,先保命:

dnf remove kernel-5.xx.xx或者干脆:
grub2-set-default 0让旧内核当默认,省得二次翻车。
四、回退dracut,重新打包initramfs
重点来了,别用系统默认的hostonly模式,那玩意儿只认当前硬件,换张卡就抓瞎。手动全量重建:

dracut -f -v --regenerate-all --add-drivers "mpt3sas nvme xfs" /boot/initramfs-$(uname -r).img $(uname -r)解释:
-f 强制覆盖,-v 看过程,--regenerate-all 把现存内核全扫一遍,--add-drivers 把SAS卡、NVMe、文件系统驱动硬塞进去。缺啥补啥,lsmod抄现成列表最稳。
五、GRUB配置顺手改
重建完再刷一次引导:
grub2-mkconfig -o /boot/grub2/grub.cfg如果用的是UEFI,路径换:
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg别偷懒,两条都跑一遍,省得BIOS/UEFI各唱各的调。
六、重启验证
reboot后盯着屏幕,看到/dev/mapper/centos-root挂载成功,登录界面蹦出来,才算落地。再跑一圈:
uname -r确认是旧内核,但initramfs时间戳是新的,说明回退成功。
七、想再升新内核?先留后门
下次升级前,把当前能用的initramfs备份一份:
cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak再装新内核,装完别急着重启,手动dracut跑一次,确认无error再reboot。万一翻车,GRUB里选旧条目,三十秒原地复活。
八、常见坑汇总
1. 只删kernel不删kernel-core:dnf会留尾巴,空间占满/boot,新initramfs写不进去,结果两头堵。
2. 忘记关Secure Boot:自编译驱动没签名,initramfs里就算塞了也加载失败,记得mokutil --disable-validation。
3. 用LVM+加密:缺dm-crypt模块,dracut要加--add-drivers "dm-crypt xfs",否则提示Give up waiting for root device。
4. 云主机热插拔盘:virtioblk驱动没打包,卡在dracut-initqueue timeout,--add-drivers里补virtioblk virtio_pci即可。
九、一条命令检查initramfs内容
lsinitrd /boot/initramfs-$(uname -r).img | grep ko.xz | grep -E "mpt3sas|nvme|virtio"能看到驱动才算真进去,别被体积忽悠,100 M的initramfs也可能缺关键ko。
十、生产环境建议
1. 升级内核挑周五下午,留两天缓冲;
开台虚拟机先跑一遍,脚本化dracut参数,确认OK再推到实体机;
把/boot单独分区且给1 G,防止大内核+大initramfs挤爆;
定期rpm -q --scripts kernel看postinstall钩子,别让第三方软件偷偷改grub。
照上面撸完,CentOS升级内核后重启卡死基本能原地复活。回退dracut生成initramfs这招,比重装系统省十倍时间,数据零丢失,老板也挑不出毛病。
