使用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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-04-29 CloudBeaver docker镜像集成arthas
2019-04-29 使用s3fs-fuse 挂载minio s3 对象存储
2015-04-29 VC ++ MFC activex 控件获取连接的VPN 信息
2015-04-29 Google Proposes to Enhance JSON with Jsonnet
2014-04-29 oracle 与sql serve 获取随机行数的数据