当initramfs缺少存储或文件系统驱动时,系统会卡在“dracut-initqueue timeout”或报“Unable to find root device”,需用dracut -f --force-drivers注入缺失模块(如nvme、dm-mod、btrfs等),并更新GRUB配置。

当 initramfs 中缺少必要的存储或文件系统驱动(如 NVMe、RAID、LVM、Btrfs、ZFS 等),系统启动时会卡在“dracut-initqueue timeout”或直接报错“Unable to find root device”,无法挂载根分区。此时可借助 dracut --add 在已启动的系统中重建 initramfs 并注入缺失模块。
确认缺失的驱动类型
先判断是哪类驱动未被包含:
-
NVMe/SCSI/SATA 控制器驱动:如
nvme、ahci、hpsa、mpt3sas -
逻辑层驱动:如
dm-mod(Device Mapper)、dm-raid、raid1、raid10 -
LVM/Btrfs/ZFS 支持:如
lvm2、btrfs、zfs(需对应内核模块 + userspace 工具) -
加密模块:如
dm-crypt、aesni_intel、sha256_generic
可通过 lsmod | grep -E 'nvme|raid|dm|btrfs|zfs|crypt' 和 find /lib/modules/$(uname -r) -name '*.ko*' | grep -i 'nvme\|raid\|btrfs' 辅助定位。
使用 dracut --add 手动添加驱动模块
--add 本身不直接加内核模块,而是用于添加自定义 dracut 模块目录(含 module-setup.sh)。但更常用且直接的方式是用 --force-drivers 或 --include 注入驱动:
- 强制包含内核模块(推荐):
dracut -f --force-drivers "nvme ahci dm-mod dm-raid btrfs" - 若模块名不明确,可先查路径再 include:
modinfo nvme | grep ^filename→ 得到/lib/modules/5.15.0-xx-generic/kernel/drivers/nvme/host/nvme.ko.xz,然后:dracut -f --include /lib/modules/$(uname -r)/kernel/drivers/nvme/host/nvme.ko.xz lib/modules/nvme.ko.xz - 确保 LVM/加密支持启用:
dracut -f --regenerate-all --force(前提是lvm2和cryptsetup已安装,且/etc/dracut.conf.d/中未禁用add_dracutmodules+="lvm crypt")
验证并更新引导配置
重建后检查 initramfs 是否包含目标模块:
-
解压查看:
mkdir /tmp/initramfs && cd /tmp/initramfs && zcat /boot/initramfs-$(uname -r).img | cpio -idfind . -name '*nvme*.ko*' -o -name '*dm-mod*.ko*' - 确认
/etc/default/grub中GRUB_CMDLINE_LINUX包含必要参数,例如:rd.md=1 rd.lvm=1 rd.luks=1 rd.dm=1(对应 RAID/LVM/LUKS/DeviceMapper) - 更新 grub:
sudo update-grub(Debian/Ubuntu)或sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS/Fedora)
进阶:制作自定义 dracut 模块(适用于特殊硬件或补丁驱动)
若需加载第三方或编译的 ko 文件(如某款新 RAID 卡的 out-of-tree 驱动):
- 创建模块目录:
sudo mkdir -p /usr/lib/dracut/modules.d/99myraid - 写入
module-setup.sh:echo -e '#!/bin/bash\ncheck() { return 0; }\ndepends() { return 0; }\ninstall() { inst /path/to/myraid.ko; }' | sudo tee /usr/lib/dracut/modules.d/99myraid/module-setup.shsudo chmod +x /usr/lib/dracut/modules.d/99myraid/module-setup.sh - 启用该模块:
dracut -f --regenerate-all --force --modules "99myraid"
注意:模块名前缀数字影响加载顺序,99 表示较晚加载,适合依赖其他基础模块的场景。
实际修复中,多数情况只需 dracut -f --force-drivers 加上对应模块名并更新 grub 即可恢复启动。关键是准确定位缺失驱动,避免遗漏依赖链中的中间模块(如启用 dm-raid 前需确保 raid1 或 raid10 已存在)。










