You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置OpenWrt内核模块Makefile实现模块自动加载

解决OpenWrt内核模块自动加载问题

你已经搞定了模块编译和手动加载的环节,差的就是自动加载这最后一步啦!OpenWrt内核模块的自动加载需要在Makefile里添加专门的加载规则,具体操作如下:

关键修改:添加AUTOLOAD配置

在你的KernelPackage定义块中,加入AUTOLOAD参数,它会让OpenWrt在目标系统中生成对应的启动加载配置,实现模块随系统自动启动。

修改后的KernelPackage片段如下:

define KernelPackage/$(PKG_NAME)
  SUBMENU:=Other modules
  TITLE:=helloworld lkm
  FILES:= $(PKG_BUILD_DIR)/hello.ko
  # 新增自动加载配置:90是加载优先级(数字越小加载越早),hello是模块名
  AUTOLOAD:=$(call AutoLoad,90,hello)
endef

参数说明:

  • AutoLoad是OpenWrt封装的宏,第一个参数是加载优先级(范围0-99),自定义模块选90左右即可,避免和系统核心模块抢占加载顺序;
  • 第二个参数是你的内核模块名称(即.ko文件名去掉后缀,这里是hello);
  • 如果模块需要启动参数,可以这么写:AUTOLOAD:=$(call AutoLoad,90,hello param1=test param2=123)

验证修改效果

  1. 重新编译模块(确保清除旧编译缓存):
    make package/HelloWorld/clean && make package/HelloWorld/compile V=s
    
  2. 生成新的OpenWrt镜像并刷入QEMU环境;
  3. 启动QEMU后,检查目标系统是否生成了加载配置:
    cat /etc/modules.d/90-hello
    
    正常情况下文件里会只有一行hello,系统启动时会自动读取这个目录下的配置加载模块。

额外注意事项

  • 如果你的模块依赖其他内核模块,需要在KernelPackage中添加DEPENDS参数,比如依赖kmod-usb-core就加DEPENDS:=+kmod-usb-core
  • 确保模块编译用的内核版本和QEMU中运行的OpenWrt内核版本完全一致(不过你手动加载成功,这一点应该没问题)。

内容的提问来源于stack exchange,提问作者FirmwareRootkits

火山引擎 最新活动