Linux驱动 | modprobe加载oot驱动与重启系统后自动加载oot驱动分析总结
内容提要
本文介绍了在Linux驱动开发和调试中使用modprobe命令加载out-of-tree(OOT)驱动的三种方法:拷贝法、软链接法和配置external路径法。同时解释了系统重启后自动加载OOT驱动的规律,包括未执行dracut --force指令可能导致OOT驱动被in-tree驱动替代,initramfs中包含相关驱动且系统硬盘驱动库中存在同名驱动时会加载initramfs中的驱动,initramfs中包含多个同名驱动时会选择优先级最高的驱动加载,以及如果initramfs中不包含相关驱动但系统硬盘驱动库中存在同名驱动时会加载系统硬盘驱动库中的驱动。
延伸解读
三种 modprobe 加载 OOT 驱动方法的适用场景
拷贝法将驱动文件复制到 extra 目录,适合驱动文件不常更新的场景;软链接法通过链接指向编译目录,便于频繁修改后直接生效;配置 external 路径法则无需移动文件,直接指定编译输出目录,适合开发调试阶段。三种方法均依赖 /etc/depmod.d/ 下的 override 或 external 配置来调整模块优先级,确保 modprobe 加载的是 OOT 驱动而非内核自带的同名 in-tree 驱动。
重启后 OOT 驱动失效的关键:initramfs 更新
系统重启后 OOT 驱动被 in-tree 驱动替代,根本原因在于 initramfs 镜像中未包含 OOT 驱动。无论使用 insmod 还是 modprobe 加载,若未执行 dracut --force 更新 initramfs,重启时系统会从 initramfs 或硬盘驱动库中加载默认驱动。要持久化 OOT 驱动,需将其放入 /lib/modules/$(uname -r)/extra/ 等硬盘驱动库目录,执行 depmod -a 更新依赖,再执行 dracut -f 将驱动写入 initramfs。
initramfs 与硬盘驱动库的加载优先级规则
系统启动时驱动加载遵循明确优先级:若 initramfs 中包含所需驱动,则优先加载 initramfs 中的版本,即使硬盘驱动库存在同名驱动也不会覆盖;若 initramfs 中有多个同名驱动,则根据 /etc/depmod.d/dist.conf 中 search 顺序决定优先级,选择最高者加载;若 initramfs 中不包含,则从硬盘驱动库加载,但前提是模块依赖列表中存在该驱动的记录,否则即使文件存在也不会加载。
调试 OOT 驱动的风险与操作建议
直接替换 /lib/modules/$(uname -r)/kernel/drivers/... 下的 in-tree 驱动文件风险极高:一旦 OOT 驱动有 bug,系统重启后无法恢复原有驱动,可能导致设备异常。建议调试时使用 insmod 加载编译目录下的驱动,避免覆盖系统文件;若需持久化,应通过 extra 目录配合 depmod 和 dracut 实现,而非直接替换内核自带模块。
Q&A
如何使用modprobe加载out-of-tree驱动?
可以通过拷贝法、软链接法和配置external路径法三种方法来加载out-of-tree驱动。
拷贝法加载驱动的具体步骤是什么?
将驱动文件拷贝到/lib/modules/$(uname -r)/extra/目录,并创建配置文件以确保优先加载该驱动,最后执行depmod -a更新模块依赖。
为什么系统重启后out-of-tree驱动会消失?
如果未执行dracut --force指令,系统可能会加载内核自带的in-tree驱动替代out-of-tree驱动。
如何确保系统重启后自动加载out-of-tree驱动?
需要将驱动放置在系统硬盘驱动库的相关目录下,执行depmod -a和dracut -f命令以更新initramfs镜像。
使用insmod加载驱动有什么风险?
使用insmod加载驱动时,系统可能会加载内核自带的驱动文件而非手动编译的驱动文件,导致设备工作异常。
initramfs中包含多个同名驱动时,系统如何选择加载?
系统会根据优先级选择最高的驱动加载,优先级由/etc/depmod.d/dist.conf文件中的配置决定。