dracut –kver 必须严格匹配 /lib/modules/ 下真实目录名(含所有连字符、加号及后缀),驱动模块名用短横线(如 nvme-core)、非下划线,builtin 驱动需通过 force_drivers 配置而非 –add-drivers。
dracut –kver 指定的内核版本必须严格匹配 ls /lib/modules 下存在的目录名
升级内核后,dracut --kver 6.8.0-rc5+ 会失败或静默跳过,如果 /lib/modules/6.8.0-rc5+ 实际不存在(比如编译安装时用了自定义 LOCALVERSION 或未运行 make modules_install)。常见现象是生成的 initramfs 里 /lib/modules 为空,或者 lsinitrd | grep -i nvme 找不到驱动。
- 先确认真实路径:
ls /lib/modules/,注意末尾是否带-generic、-rt或构建时加的后缀(如6.8.0-rc5+-mybuild) -
--kver值必须一字不差,包括所有连字符和加号 - 若路径含空格或特殊字符(极少见),需用引号包裹,但通常应避免这类命名
–add-drivers 加载的模块名是.ko文件名(不含.ko后缀),不是模块别名或设备名
想让 NVMe 启动,不能写 --add-drivers nvme 或 --add-drivers "nvme_core nvme_pci" —— 这会报 Module 'nvme_core' not found。dracut 查找的是 /lib/modules//kernel/drivers/nvme/host/nvme-core.ko.xz 对应的模块名 nvme-core(注意是短横线而非下划线)。
- 正确写法:
dracut --kver 6.8.0-rc5+ --add-drivers "nvme-core nvme-pci" - 模块名可从
modinfo /lib/modules/6.8.0-rc5+/kernel/drivers/nvme/host/nvme-core.ko.xz | grep ^name:获取 - 依赖关系不会自动递归解决,
nvme-pci依赖nvme-core,必须显式列出两者 - 别名(如
alias nvme nvmf)或modprobe.d配置对 dracut 无效
补救生成的 initramfs 可能仍缺固件或符号链接,需配合 –force 和检查 /usr/lib/firmware
即使驱动加载成功,启动卡在 “Waiting for /dev/nvme0n1p1” 很可能是固件缺失。dracut 默认只打包 /lib/firmware 下被模块声明依赖的固件,而某些驱动(如 ath11k、qed)需要手动注入。