首页 / 帮助文档 / centos运维dracut生成initramfs包含必要驱动

centos运维dracut生成initramfs包含必要驱动

在CentOS系统运维中,当你更换硬件、升级内核或者遇到系统无法正常引导时,最核心的操作就是用dracut工具重新生成initramfs镜像,并确保其中包含了必要的驱动模块。具体做法是:先用lspci或lsblk确认当前硬件需要哪些驱动,再通过dracut命令加上--add-drivers参数将指定驱动打入initramfs,最后验证生成的镜像文件大小和模块列表是否正常。这个过程看似简单,但实际操作中涉及驱动依赖、模块黑名单、内核版本匹配等多个细节,稍有疏忽就会导致系统启动失败。

initramfs是Linux内核启动时加载的初始根文件系统,它在真正的根分区挂载之前运行,负责加载必要的驱动(比如磁盘控制器驱动、RAID驱动、文件系统驱动等)。如果initramfs里缺少关键驱动,内核就找不到根分区,系统自然启动不了。dracut是CentOS 7及以后版本默认的initramfs生成工具,它比老旧的mkinitrd更灵活、更模块化,支持按需添加驱动和自定义配置。

一、为什么需要手动包含必要驱动

CentOS默认生成的initramfs通常会自动检测并包含大部分常用驱动,但在以下场景中,自动检测可能不够用:第一,你使用了非标准的RAID卡或HBA卡,比如LSI MegaRAID、Broadcom HBA、Intel VMD控制器;第二,你使用了特殊的文件系统,比如XFS、Btrfs或者LVM over MD;第三,你手动升级了内核但没有重新生成initramfs;第四,你在虚拟化环境中使用了virtio驱动但镜像里没包含。这些情况都需要你显式指定要加入的驱动模块。

另外一个容易被忽视的问题是驱动依赖链。比如你需要mpt3sas驱动来识别SAS硬盘,但mpt3sas又依赖scsi_mod和sg模块。如果你只加了mpt3sas而没加它的依赖,initramfs生成时虽然不报错,但启动时模块加载会失败。dracut会自动解析大部分依赖,但对于某些冷门驱动,你可能需要手动处理。

二、查看当前硬件需要哪些驱动

在动手生成之前,你必须先搞清楚当前系统用了哪些驱动。最直接的方法是查看已加载的内核模块:

lsmod | grep -E "raid|scsi|virtio|mpt|megaraid|ahci"

这条命令会列出所有与存储相关的已加载模块。如果你用的是RAID,重点关注md_mod、raid1、raid10等;如果是virtio虚拟化,关注virtio_blk、virtio_scsi、virtio_net等。

另一个方法是用lspci查看硬件设备,然后根据设备ID查找对应驱动:

lspci -nnk | grep -i -A3 "storage\|raid\|serial"

输出中会显示设备的PCI ID和正在使用的内核驱动(Kernel driver in use),这就是你需要确保包含在initramfs里的模块。如果系统用的是LVM,还需要确认dm_mod、dm_mirror、dm_snapshot等设备映射模块是否已加载。

对于使用MD RAID的系统,可以用以下命令查看RAID阵列状态和使用的模块:

cat /proc/mdstat
mdadm --detail /dev/md0

这些信息汇总起来,就是你需要打包进initramfs的驱动清单。

三、使用dracut生成包含指定驱动的initramfs

dracut的基本语法非常简单:

dracut [选项] <输出文件名> <内核版本>

最常用的场景是为当前运行的内核重新生成initramfs。假设你当前内核版本是3.10.0-1160.el7.x86_64,你需要加入mpt3sas和virtio_blk驱动,命令如下:

dracut --add-drivers "mpt3sas virtio_blk" --force /boot/initramfs-3.10.0-1160.el7.x86_64.img 3.10.0-1160.el7.x86_64

--add-drivers参数后面跟的是用空格分隔的驱动模块名,可以写多个。--force表示覆盖已有的initramfs文件。如果你不指定内核版本,dracut默认会为当前运行的内核生成。

如果你需要包含整个驱动目录下的所有模块(比如某个特定厂商的所有驱动),可以用--add-drivers指定目录:

dracut --add-drivers "/lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/scsi/mpt3sas" --force

对于更复杂的场景,比如你需要同时包含驱动和额外的二进制工具(比如mdadm、lvm、multipath等),可以用--install参数:

dracut --add-drivers "mpt3sas ahci" --install "mdadm lvm multipath" --force

这样生成的initramfs里不仅有驱动模块,还有管理工具,方便在紧急情况下进行修复。

四、dracut配置文件的使用

除了命令行参数,dracut还支持通过配置文件来定制生成行为。配置文件位于/etc/dracut.conf.d/目录下,你可以创建自定义的.conf文件。例如创建一个文件/etc/dracut.conf.d/custom.conf:

add_drivers+=" mpt3sas virtio_blk ahci "
install_items+=" mdadm lvm "
omit_drivers+=" firewire "

add_drivers是追加驱动,install_items是追加要安装到initramfs里的文件或命令,omit_drivers是排除不需要的驱动(减小镜像体积)。这样每次执行dracut时都会自动应用这些配置,不用每次手动敲参数。

需要注意的是,如果你的系统用了kmod(动态模块加载),dracut默认会启用它,这意味着initramfs里只需要包含最核心的模块,其他模块可以在启动后动态加载。但如果你的根文件系统依赖某些模块才能挂载(比如RAID或LVM),那这些模块必须静态包含在initramfs中,不能依赖kmod。

五、验证生成的initramfs是否正确

生成完成后,不要急着重启,先验证一下。第一步,检查文件是否存在且大小合理:

ls -lh /boot/initramfs-*.img

正常的initramfs文件通常在30MB到100MB之间,如果只有几MB,很可能驱动没加进去。第二步,查看镜像里包含的模块:

lsinitrd /boot/initramfs-3.10.0-1160.el7.x86_64.img | grep -E "mpt3sas|virtio"

lsinitrd是dracut自带的工具,可以列出initramfs里的所有文件和模块。如果你指定的驱动出现在列表中,说明打包成功。第三步,你可以用cpio解压查看详细内容:

cpio -t < /boot/initramfs-3.10.0-1160.el7.x86_64.img | grep "\.ko$" | head -20

这会列出所有.ko内核模块文件,你可以确认关键驱动是否都在。

六、常见问题和避坑指南

第一个坑:内核版本不匹配。你生成initramfs时指定的内核版本必须和实际运行的内核一致。如果你升级了内核但忘记重新生成initramfs,新内核就没有对应的启动镜像。查看当前内核版本用uname -r,查看/boot下所有initramfs文件确认覆盖了所有内核。

第二个坑:模块黑名单冲突。有些驱动在/etc/modprobe.d/里被加入了黑名单(blacklist),dracut生成时可能会跳过这些模块。如果你确实需要某个被黑名单的驱动,需要在dracut命令中用--no-blacklist或者修改黑名单配置。

第三个坑:dracut版本问题。CentOS 7用的dracut版本较老,某些新特性不支持。如果你需要更高级的功能(比如统一的配置格式),可以考虑升级dracut,但要注意兼容性。

第四个坑:忘记更新GRUB。生成新的initramfs后,GRUB配置通常不需要手动更新,因为GRUB会自动读取/boot下的initramfs文件。但如果你修改了GRUB配置或者用了自定义的grub.cfg,还是建议运行一次grub2-mkconfig确认。

七、实战案例:RAID服务器重建initramfs

假设你有一台CentOS 7服务器,使用LSI MegaRAID SAS 9361-8i RAID卡,做了RAID 5,文件系统是XFS over LVM。系统内核升级后无法启动,报错找不到根分区。排查步骤如下:

首先进入救援模式或者用安装光盘启动,挂载原系统的/boot分区。然后查看当前加载的模块:

lsmod | grep -E "mpt3sas|megaraid|xfs|dm"

确认mpt3sas(或megaraid_sas)、xfs、dm_mod等模块是关键驱动。然后执行:

dracut --add-drivers "mpt3sas xfs dm_mod dm_mirror" --install "mdadm lvm" --force /boot/initramfs-$(uname -r).img $(uname -r)

生成完毕后用lsinitrd验证mpt3sas和xfs模块都在里面,然后重启。如果一切正常,系统应该能顺利找到RAID阵列并挂载LVM和XFS文件系统。

这个案例涵盖了RAID驱动、文件系统驱动、设备映射驱动三大类,是生产环境中最典型的initramfs驱动缺失场景。

八、总结与建议

dracut生成initramfs并包含必要驱动,本质上就是告诉内核"启动时你需要带上这些工具才能找到根分区"。核心流程就是:确认硬件驱动、用--add-drivers指定模块、生成镜像、验证内容。在日常运维中,建议养成每次内核升级后立即重新生成initramfs的习惯,同时保留至少一个旧版本的initramfs作为回退手段。对于关键生产服务器,可以把dracut命令写成脚本,配合自动化工具定期检查和更新,避免因驱动缺失导致的非计划停机。