内核升级后 initramfs 缺少模块的 dracut –kver –add-drivers 补救

7次阅读

dracut –kver 必须严格匹配 /lib/modules/ 下真实目录名(含所有连字符、加号及后缀),驱动模块名用短横线(如 nvme-core)、非下划线,builtin 驱动需通过 force_drivers 配置而非 –add-drivers。

内核升级后 initramfs 缺少模块的 dracut –kver –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 下被模块声明依赖的固件,而某些驱动(如 ath11kqed)需要手动注入。

  • --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 机制,部分内置驱动(如 ahciusb-storage)不再以 .ko 形式存在。--add-drivers 对它们无效,必须靠 --regenerate-all 或配置 dracut.conf.d/ 中的 hostonly = noforce_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

模块名、固件路径、builtin 状态这三项不一致,是补救失败最常见的组合原因。

text=ZqhQzanResources