使用fpm 构建一个kernel module rpm包
昨天参考社区的示例,开发了一个简单的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
- 模版的开机自自动
开机自启动会通过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.cnblogs.com/rongfengliang/p/17362946.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