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/ 对应的模块名 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)需要手动注入。
- 用
--force强制重生成,避免缓存干扰:dracut --force --kver 6.8.0-rc5+ --add-drivers "nvme-core nvme-pci" - 检查固件是否存在:
ls /usr/lib/firmware/amdgpu/或/lib/firmware/nvidia/,缺失则需安装对应 firmware 包(如linux-firmware) - 某些驱动依赖
/lib/firmware/下的子目录结构,dracut 不会自动创建,需用/ --include手动挂载:--include /lib/firmware/qed qed - 生成后务必验证:
lsinitrd /boot/initramfs-6.8.0-rc5+.img | grep -E "(nvme|firmware)"
dracut 默认不扫描新内核的 modules.builtin,老驱动可能被忽略
Linux 6.3+ 启用 modules.builtin 机制,部分内置驱动(如 ahci、usb-storage)不再以 .ko 形式存在。--add-drivers 对它们无效,必须靠 --regenerate-all 或配置 dracut.conf.d/ 中的 hostonly = no 和 force_drivers += "ahci"。
- 若怀疑是 builtin 驱动问题,先查:
grep -q "ahci" /lib/modules/6.8.0-rc5+/modules.builtin && echo "builtin" - 此时
--add-drivers ahci无用,得改配置:echo 'force_drivers+=" ahci "' > /etc/dracut.conf.d/99-builtin.conf,再dracut --force --kver 6.8.0-rc5+ -
hostonly = yes(默认)会限制只打包 root 设备所需驱动,跨设备启动(如 USB root)容易漏,临时调试可设为no










