DKMS:Dynamic Kernel Module Support
DKMS简介
DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。
1.背景
对于没有内核编程经验的使用者来说,使用者可能经常困惑:为什么更新操作系统之后,原来用的好好的驱动程序突然就不能用了?
Linux模块和内核是有依赖关系的,如果发行版的内核版本发生变动,之前老内核版本上编译的模块将无法继续使用。一般的解决方案是:打开源码,手动重新再编译(make)一遍。
这样重复的操作有些繁琐且是反生产力的,就是Dell创建的DKMS项目的意义所在。
DKMS正是为了解决因为内核变动而导致有些模块(比如驱动程序)不能正常运行的情况而产生的。在内核版本变动之后可以自动重新生成新的模块。
2.DKMS使用
2.1安装
在使用dkms之前首先需要确保系统中已经安装了 DKMS。在Ubuntu下可以执行下面这个命令安装:
sudo apt-get install dkms
安装完毕之后,我们就可以开始使用 DKMS了。
本文的例子来自Ubuntu Wiki,大家可以从这里下载。
使用DKMS编译安装内核模块
DKMS的使用流程可以用下图简单表示:
以hello-0.1为例,我们首先需要把代码copy到"/usr/src"下面,这样完整路径将是"/usr/src/hello-0.1"。
DKMS要求我们的代码目录必须以" <module>-<module-version>"的格式命名。本例中,代码的版本是0.1。
DKMS主要的命令可以参考上图所示,分别是add、build、install、uninstall和remove,另外,还可以执行"dkms status"查看目前DKMS系统维护的模块的状态。
在我自己的主机上,首先执行dkms status看看:
bcmwl, 5.100.82.38+bdcom, 2.6.38-8-generic, i686: installed
目前我的机器上有一个处于“Installed State”的bcmwl模块,这是我的Broadcom无线网卡驱动。
我们还可以在目录"/var/lib/dkms"下查看目前有哪些由DKMS维护的驱动程序。
接下来,执行“sudo dkms add -m hello -v 0.1”来添加hello-0.1,执行的结果是:
Creating symlink /var/lib/dkms/hello/0.1/source -> /usr/src/hello-0.1
DKMS: add Completed.
我们再执行“dkms status”看看:
bcmwl, 5.100.82.38+bdcom, 2.6.38-8-generic, i686: installed
hello, 0.1: added
hello-0.1已经处于"Added State"了。
下面执行“sudo dkms build -m hello -v 0.1”:
Kernel preparation unnecessary for this kernel. Skipping...
Building module:cleaning build area....
make KERNELRELEASE=2.6.38-8-generic all KVERSION=2.6.38-8-generic.....
cleaning build area....
DKMS: build Completed.
我们可以在目录“/var/lib/dkms/hello/0.1/2.6.38-8-generic/i686/module/”下面找到编译生成的hello.ko二进制模块。
最后执行“sudo dkms install -m hello -v 0.1”来安装hello.ko:
hello.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/2.6.38-8-generic/updates/dkms/
把hello.ko从/lib/modules下移除可以执行“sudo dkms uninstall -m hello -v 0.1”,甚至可以使用命令“sudo dkms remove -m hello -v 0.1 --all”把hello-0.1从/var/lib/dkms下彻底删除,这样,DKMS系统就不再维护hello-0.1模块了。
以上的每个步骤我们都可以通过“dkms status”来查看执行后的状态。
对于处于"Installed State"的模块,即使内核版本发生变化,我们也不需要手动重新编译内核了。
我们再回过头来研究一下hello-0.1中文件。
/usr/src/hello-0.1/
├── dkms.conf
├── hello.c
└── Makefile
如果您比较熟悉Linux内核模块的编写,hello.c和Makefile的内容应该很简单,本文不再详细解释。有一点需要注意,在Makefile中要使用变量$(KVERSION)指定内核版本号,这样我们在执行dkms时,就可以用“-k”选项来设定为哪个内核版本编译模块。
$(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
dkms.conf文件是本文关注的重点。
1 2 3 4 5 6 7 |
|
PACKAGE_NAME和PACKAGE_VERSION和文件夹的命名是一致的。
CLEAN的命令是每次build的时候第一条执行的动作。
MAKE[0]用来设定编译的命令,一般情况下是不用设定的。在本例中,就可以把MAKE[0]这行删掉。但在下面这种情况下就需要设定了。比如,您的Makefile里有多个target,分别为all、debug、release等,不指定MAKE[0]时,编译会选择第一个target来执行,也就是make all,如果您想执行make release来编译,就需要在dkms.conf里明确设定。
BUILD_MODULE_NAME[0]用来指定模块的名称,一般情况下也可以不设定。
DEST_MODULE_LOCATION[0]用来设定模块安装的目的地址,本例是"/lib/module/$(KVERSION)/updates"。
AUTOINSTALL="yes"表示在Linux引导之后DKMS会自动对这个模块执行Build和Install的动作,当然如果模块已经处于该状态的话,相应的动作是不用再执行的。
基于DKMS制作驱动程序的DEB安装包
作为Linux驱动开发者,有时候用户会要求我们提供驱动的DEB安装包,基于DKMS来制作DEB安装包是一个很好的选择。对开发者来说这样的DEB包制作起来比较简单,对于用户来说使用起来也省去许多烦恼。需要注意的是,制作DEB包依赖于dh-make,请首先执行“sudo apt-get install dh-make”安装。
在模块处于"Built State"的条件下,执行“sudo dkms mkdeb -m hello -v 0.1”可以在目录“/var/lib/dkms/hello/0.1/deb”下生成deb包。
另外,DKMS还提供了mktarball和mkrpm来制作tarball和RPM安装包,这里就不再一一赘述。
DKMS:Dynamic Kernel Module Support相关推荐
- VM虚拟机:VMware Kernel Module Updater
错误信息 Before you can run VMware,several modules must be complied and loaded into the running kernel. ...
- Maven - Dynamic Web Module 3.0 requires Java 1.6 or newer.
2019独角兽企业重金招聘Python工程师标准>>> 首先先看一下错误信息: Dynamic Web Module 3.0 requires Java 1.6 or newer. ...
- 解决“Maven项目中的Dynamic Web Module 3.0 requires Java 1.6 or newer”问题
转载自 解决"Maven项目中的Dynamic Web Module 3.0 requires Java 1.6 or newer"问题 错误描述 当创建有动态web模块3.0 ...
- dynamic web module消失不见
2019独角兽企业重金招聘Python工程师标准>>> 方法1:在project Facets选项中勾选Dynamic Web Module即可 方法2: 我用eclipse对项目进 ...
- 【VMware】ubuntu运行VMware kernel module updater
问题描述 ubuntu22.04运行VMware 报错:VMware kernel module updater 解决方案 sudo vmware-modconfig --console --inst ...
- 如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded
我在启动minikube时,遇到如下错误消息: Starting local Kubernetes v1.10.0 cluster- Starting VM- E1010 03:27:37.92005 ...
- 【Spring MVC】 maven pom.xml 错误: Cannot upgrade/downgrade to Dynamic Web Module 3.0 facet.
2019独角兽企业重金招聘Python工程师标准>>> web.xml <?xml version="1.0" encoding="UTF-8&q ...
- dynamic web module 2.5与2.4
http://hi.baidu.com/yuanygb/blog/item/b7f89b54c1638045d0090642.html Project facet Dynamic Web Module ...
- kpatch: dynamic kernel patching
GitHub - dynup/kpatch: kpatch - live kernel patchinghttps://github.com/dynup/kpatch 目录 Supported Arc ...
- The Linux Kernel Module Programming Guide 2.4 中文版
The Linux Kernel Module Programming Guide 2.4 中文版 分类: Linux/os 2007-09-29 11:14 820人阅读 评论(0) 收藏 举报 T ...
最新文章
- linux驱动:TI+DM8127+GPIO(三)之omap_hwmod中添加GPIO资源
- 如何一眼识别蚂蚁集团身价千万的阿里人
- UIPageControl
- 百练1089:数字反转
- MySQL Group Replication 部署 (Single Master)
- 进程间通信之分别用共享内存和信号量实现卖票
- c构造函数和析构函数_C ++构造函数,析构函数能力问题和答案(第2组)
- c++ 显示三维散点图_【无机纳米材料科研制图——OriginLab 0210】Origin多组柱状图3D柱状图及3D散点图...
- 水面的简单渲染 – Gerstner波
- o3命令 linux,linux文本处理命令 一
- oracle建表时添加comment,MYSQL中创建表时可以直接声明comment,ORACLE中似乎不可以,那么oracle该怎样简明地声明comment...
- html中什么是围堵标签,HTML回顾(基础标签)
- 10. 获取Magento域名及图片,JS路径方法
- ER Studio 使用笔记
- R语言sparse.model.matrix函数报错
- 物流(Logistics)的概念
- 无法验证驱动程序的签名_无法验证应用?掉签名打不开应用?没越狱也能解决!...
- 五年北京,这个改变我命运的城市,终于要离开了
- 【转】你很闲吗?居然想在职场上收割友谊和性?
- [弹幕词云姬]硬核b站up主一周撸出来的小工具,根据b站弹幕生成词云(一)
热门文章
- fn键台式计算机在哪,fn键在哪?小鱼教您fn键使用方法
- 转载:开源license总结
- 记录阿里云增加二级域名步骤[同三级]
- php ini 分号,PHP.ini配置里这些开头的分号是什么意思
- c语言字符串转为大写,c语言 字符串转大写的简单实例
- app 显示未验证应用解决
- XP框架开启debug模式_win10 2004系统如何开启夜间护眼模式的问题
- vagrant lanp mysql远程登录设置
- [STM8L15x]输入捕获获取PWM占空比
- FCC ES6篇中的解构赋值