0.前言
之前已经编写了一个简单的内核模块,通过之前在源码目录下make/make install完成了编译和安装动作。
实际内核开发中,会存在各种各样的驱动需要维护和管理(主要是针对操作系统厂商而言),如果将第三方驱动全放在内核源码树中(一般流程是驱动厂商向操作系统厂商发起合入请求,操作系统厂商进行改造适配),可能导致内核源码越来越臃肿,操作系统厂商会投入太多的人力在这种重复性的工作上。
通过DKMS的方式,将第三方驱动的维护任务交还给驱动厂商,操作系统厂商只负责整个包管理,可以极大得减少适配的工作量。
下面以之前写过的简单内核模块为例,总结一下如何改造成通过DKMS来管理。
1. 源码
基础源码还是使用之前的一个简单内核模块作为示范:
Linux内核开发-编写一个proc文件
源码github链接
源码gitee链接
(后续都在gitee开发了,github在公司不稳定也不太敢进行各种魔法操作)
2. 步骤
无需修改源码,只需要在根目录下添加一个文件dkms.conf,内容如下:
//kernel_module/dkms.conf
PACKAGE_NAME="kernel_module"
PACKAGE_VERSION="1.0" # 这个版本号应当匹配源码版本
MAKE[0]="make"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="km" # makefile中的模块名
DEST_MODULE_LOCATION[0]="/updates" # ko产物install位置
AUTOINSTALL="yes"
- 将源码拷贝到/usr/src/目录下:
sudo cp -r ../kernel_module /usr/src/kernel_module-1.0 # 这里的xxx-1.0这个xxx就是上面的PACKAGE_NAME和PACKAGE_VERSION
- 在dkms中加入本模块:
sudo dkms add -m kernel_module -v 1.0
- 通过dkms编译:
sudo dkms build -m kernel_module -v 1.0
- 安装
sudo dkms install -m kernel_module -v 1.0
可以看到module.dep已更新:
- 后面就可以加载模块了
sudo insmod /lib/modules/5.10.0-15-generic/updates/km.ko
- 移除dkms包
sudo dkms remove -m kernel_module -v 1.0 --all