initramfs 缺少驱动导致根分区挂载失败的 dracut –add 补救方法

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

initramfs 缺少驱动导致根分区挂载失败的 dracut --add 补救方法

当 initramfs 中缺少必要的存储或文件系统驱动(如 NVMe、RAID、LVM、Btrfs、ZFS 等),系统启动时会卡在“dracut-initqueue timeout”或直接报错“Unable to find root device”,无法挂载根分区。此时可借助 dracut --add 在已启动的系统中重建 initramfs 并注入缺失模块。

确认缺失的驱动类型

先判断是哪类驱动未被包含:

  • NVMe/SCSI/SATA 控制器驱动:如 nvmeahcihpsampt3sas
  • 逻辑层驱动:如 dm-mod(Device Mapper)、dm-raidraid1raid10
  • LVM/Btrfs/ZFS 支持:如 lvm2btrfszfs(需对应内核模块 + userspace 工具
  • 加密模块:如 dm-cryptaesni_intelsha256_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(前提是 lvm2cryptsetup 已安装,且 /etc/dracut.conf.d/ 中未禁用 add_dracutmodules+="lvm crypt"

验证并更新引导配置

重建后检查 initramfs 是否包含目标模块:

造梦阁AI

造梦阁AI

AI小说推文一键成片,你的故事值得被看见

下载

  • 解压查看:
    mkdir /tmp/initramfs && cd /tmp/initramfs && zcat /boot/initramfs-$(uname -r).img | cpio -id
    find . -name '*nvme*.ko*' -o -name '*dm-mod*.ko*'
  • 确认 /etc/default/grubGRUB_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.sh
    sudo 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 前需确保 raid1raid10 已存在)。

https://www.php.cn/faq/2013522.html

发表回复

Your email address will not be published. Required fields are marked *