昨天参考社区的示例,开发了一个简单的kernel 模块,尽管我们可以通过insmod 进行模块安装,但是对于实际的分发是很不方便的
比较推荐的做法是制作一个rpm包,方便模块的分发以及共享

一些问题

  • 模块的安装位置
    一般我们外部开发的模块都在/lib/modules/${uname}\extra 目录下,之后需要执行depmod 进行依赖的更新
  • 模版的加载处理
    默认kernel 包含了模版加载的处理,配置在/etc/depmod.d/*.conf 下边,具体查找的为,实际上也会依赖depmod 进行依赖的更新

 

#
# depmod.conf
#
 
# override default search ordering for kmod packaging
search updates extra built-in weak-updates
#
search updates extra built-in weak-updates
  • 模版的开机自自动
    开机自启动会通过modules-load.d 配置加载,指定模块名称就可以了
  • kernel 升级对于模版的影响
    上边也说了,默认的安装模式依赖内核路径,不是很方便,weak-updates 是一种解决方法,通过兼容测试的,然后添加软连接

以上问题解决方法

实际上,linux 修通支持通过不同的配置进行模块的位置配置,比如通过自定义depmod.d 可以知道如何加载我们的模块,通过自定义modules-load.d
可以解决我们开机自启动的问题,因为指定了不同的位置,我们的模块就和系统的内核名称不依赖了,兼容相对比较好做了

基于fpm 的kernel 模块构建

  • 一些问题
    我们的模块安装完成之后,需要更新依赖(通过depmod),所以我们开发的rpm 需要在然后完成之后运行depmod 命令
  • 参考构建命令

 

 
fpm -s dir -t rpm -n hello_world_module --after-install=$PWD/post_install.sh --rpm-os linux -v v1.0-centos7 \
  ./build/hello_world.ko=/lib/modules/mymod/hello_world.ko \
  ./dalong.conf=/etc/modules-load.d/dalong.conf  \
  ./mymod.conf=/usr/lib/depmod.d/mymod.conf 

简单说明:
post_install.sh 进行依赖更新的

 

#!/bin/sh
depmod

dalong.conf 开机模块加载的

hello_world

/mymod.conf 配置自定义模块加载的

search external
external * /lib/modules/mymod

说明

完整demo 我已经放github 上了,大家可以参考使用,实际上对于kernel module 的打包还有基于官方标准的玩法可以参考学习

参考资料

https://fpm.readthedocs.io/en/v1.14.0/cli-reference.html
https://www.freedesktop.org/software/systemd/man/modules-load.d.html
https://man7.org/linux/man-pages/man8/modprobe.8.html
https://man7.org/linux/man-pages/man5/depmod.d.5.html
https://unix.stackexchange.com/questions/229521/weak-modules-from-module-init-tools-directory
https://github.com/rongfengliang/kernel-module-learning/releases/tag/v1.0.0
https://access.redhat.com/solutions/3536351
https://wiki.centos.org/HowTos/BuildingKernelModules