Yocto中如何修改内核模块自动加载顺序?
内核模块A在模块B之后自动加载的解决方案
一、通过模块依赖实现自动顺序加载
这是最贴合内核原生逻辑的方案,无需额外系统服务:
- 有符号依赖的情况:如果模块A代码中调用了模块B导出的符号,编译后
depmod会自动生成模块间的依赖关系。保持KERNEL_MODULE_AUTOLOAD += "A"的配置即可,modprobe加载A时会自动先加载B。 - 无符号依赖需强制顺序:在模块A的代码中添加一行声明依赖的宏:
编译后模块A的元数据会包含依赖B的信息,MODULE_INFO(depends, "B");modprobe加载A时会优先确保B已加载。同时在Yocto配方中可以添加KERNEL_MODULE_DEPENDS_${PN} = "B",确保编译阶段模块B先被构建安装。
二、自定义systemd服务精确控制加载时机
如果不想依赖模块依赖机制,可以弃用KERNEL_MODULE_AUTOLOAD,通过systemd服务实现:
- 编写systemd服务文件(命名为
module-a-load.service):[Unit] Description=Load kernel module A After=systemd-modules-load.service Requires=systemd-modules-load.service # 若模块B由systemd-modules-load加载,确保服务在B加载完成后启动 After=sys-devices-platform-B.device # 替换为模块B对应的设备路径,或直接用modprobe检查 [Service] Type=oneshot RemainAfterExit=yes # 直接加载A,若需确保B已加载,可改用下方的shell命令 ExecStart=/sbin/modprobe A # ExecStart=/bin/sh -c "while ! lsmod | grep -q B; do sleep 0.1; done; modprobe A" [Install] WantedBy=multi-user.target - 在Yocto配方中配置服务:
在模块A的.bb文件中添加:
这样Yocto会自动安装并启用该服务,它会在FILES_${PN} += "${systemd_system_unitdir}/module-a-load.service" SYSTEMD_SERVICE_${PN} = "module-a-load.service" SYSTEMD_AUTO_ENABLE_${PN} = "enable"systemd-modules-load.service之后启动,确保模块B已被加载。
三、Yocto原生的加载顺序相关机制
Yocto没有专门的顶层配置直接修改模块自动加载顺序,但可以通过两种原生方式实现:
- 依赖内核模块的原生依赖机制:即第一部分提到的通过
MODULE_INFO(depends)或符号依赖让modprobe自动处理顺序,这是Yocto推荐的标准方式。 - 调整modules-load.d配置文件顺序:
systemd-modules-load会按文件名排序加载/etc/modules-load.d/下的配置文件。可以在模块A的配方中设置MODULES_LOAD_CONF_FILENAME = "zzz-module-a.conf",让其配置文件在模块B的配置文件之后被处理。不过这种方式依赖文件名排序,可靠性不如模块依赖方案,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者jianbin zhang
相关产品推荐
相关产品推荐

