内核升级后 dracut “Don‘t know how to handle ’root='” 的 –add-drivers 补救

4次阅读

根本原因是内核升级后initramfs缺失NVMe或SCSI等关键驱动模块,导致dracut无法解析root=参数;需配合–force-drivers显式注入驱动、正确配置rd.driver.pre及禁用rd.lvm/rd.md等干扰参数,并验证模块是否真被包含。

内核升级后 dracut “Don‘t know how to handle ’root='” 的 –add-drivers 补救

dracut 报错 “Don’t know how to handle ‘root='” 的根本原因

这不是 dracut 本身坏了,而是内核升级后 initramfs 里缺了关键驱动(比如 NVMe 或 SCSI 模块),导致 dracut 在解析 root= 参数时无法识别底层设备类型,直接 abort。错误常出现在使用 --add-drivers 手动加驱动但没配全依赖模块的场景下。

用 –regenerate-all + 显式指定 root= 设备类型绕过解析失败

单纯加驱动不够,dracut 还需要知道该用哪种总线协议去挂载 root=。常见补救方式是强制告诉它设备类别:

  • 如果是 NVMe 盘(如 root=/dev/nvme0n1p2),加 --force-drivers nvme nvme_core,并确保 rd.driver.pre=nvme 出现在内核命令行
  • 如果是 SCSI/SATA(root=/dev/sda2),需包含 sd_mod scsi_mod,且启动参数中不能缺失 rd.md=0 rd.lvm=0 rd.dm=0 等干扰项
  • 运行时加 --regenerate-all 而非单个 initramfs,避免旧缓存残留;同时用 --force 跳过校验

示例命令:dracut --regenerate-all --force --add-drivers "nvme nvme_core" --force-drivers "nvme nvme_core"

检查 initramfs 是否真包含了 root 设备驱动

生成完别急着重启,先解包验证:

  • lsinitrd /boot/initramfs-$(uname -r).img | grep -E "(nvme|sd_mod|scsi_mod)" 确认模块存在
  • 若输出为空,说明 --add-drivers 没生效——常见原因是驱动名拼写错误(如写成 nvme_pci 而非 nvme)或内核未编译为模块(zcat /proc/config.gz | grep NVME_CORE 看是否为 m
  • dracut 默认只打包“探测到需要”的模块,加 --force-drivers 才会无条件打包,--add-drivers 仅作补充,二者要配合用

内核命令行里的 rd.* 参数必须与驱动匹配

root= 解析失败往往卡在 rd.lvm/rd.md 等子系统提前抢注设备,让 NVMe/SCSI 驱动没机会初始化。必须显式禁用无关子系统:

  • 确认 /etc/default/grubGRUB_CMDLINE_linux 包含 rd.driver.pre=nvme rd.lvm=0 rd.md=0 rd.dm=0
  • 修改后运行 grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS)或 update-grub(Debian/Ubuntu)
  • 特别注意:某些新版内核要求 rd.driver.pre 必须在所有 rd.* 参数最前面,顺序错也会失效

真正麻烦的不是加驱动,而是 initramfs 构建时的模块依赖推导和内核命令行参数的协同顺序——漏掉任意一环,root= 就还是不认识。

text=ZqhQzanResources