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="hello"

PACKAGE_VERSION="0.1"

CLEAN="make clean"

MAKE[0]="make all KVERSION=$kernelver"

BUILT_MODULE_NAME[0]="hello"

DEST_MODULE_LOCATION[0]="/updates"

AUTOINSTALL="yes"

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相关推荐

  1. VM虚拟机:VMware Kernel Module Updater

    错误信息 Before you can run VMware,several modules must be complied and loaded into the running kernel. ...

  2. 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. ...

  3. 解决“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 ...

  4. dynamic web module消失不见

    2019独角兽企业重金招聘Python工程师标准>>> 方法1:在project Facets选项中勾选Dynamic Web Module即可 方法2: 我用eclipse对项目进 ...

  5. 【VMware】ubuntu运行VMware kernel module updater

    问题描述 ubuntu22.04运行VMware 报错:VMware kernel module updater 解决方案 sudo vmware-modconfig --console --inst ...

  6. 如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded

    我在启动minikube时,遇到如下错误消息: Starting local Kubernetes v1.10.0 cluster- Starting VM- E1010 03:27:37.92005 ...

  7. 【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 ...

  8. dynamic web module 2.5与2.4

    http://hi.baidu.com/yuanygb/blog/item/b7f89b54c1638045d0090642.html Project facet Dynamic Web Module ...

  9. kpatch: dynamic kernel patching

    GitHub - dynup/kpatch: kpatch - live kernel patchinghttps://github.com/dynup/kpatch 目录 Supported Arc ...

  10. 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 ...

最新文章

  1. linux驱动:TI+DM8127+GPIO(三)之omap_hwmod中添加GPIO资源
  2. 如何一眼识别蚂蚁集团身价千万的阿里人
  3. UIPageControl
  4. 百练1089:数字反转
  5. MySQL Group Replication 部署 (Single Master)
  6. 进程间通信之分别用共享内存和信号量实现卖票
  7. c构造函数和析构函数_C ++构造函数,析构函数能力问题和答案(第2组)
  8. c++ 显示三维散点图_【无机纳米材料科研制图——OriginLab 0210】Origin多组柱状图3D柱状图及3D散点图...
  9. 水面的简单渲染 – Gerstner波
  10. o3命令 linux,linux文本处理命令 一
  11. oracle建表时添加comment,MYSQL中创建表时可以直接声明comment,ORACLE中似乎不可以,那么oracle该怎样简明地声明comment...
  12. html中什么是围堵标签,HTML回顾(基础标签)
  13. 10. 获取Magento域名及图片,JS路径方法
  14. ER Studio 使用笔记
  15. R语言sparse.model.matrix函数报错
  16. 物流(Logistics)的概念
  17. 无法验证驱动程序的签名_无法验证应用?掉签名打不开应用?没越狱也能解决!...
  18. 五年北京,这个改变我命运的城市,终于要离开了
  19. 【转】你很闲吗?居然想在职场上收割友谊和性?
  20. [弹幕词云姬]硬核b站up主一周撸出来的小工具,根据b站弹幕生成词云(一)

热门文章

  1. fn键台式计算机在哪,fn键在哪?小鱼教您fn键使用方法
  2. 转载:开源license总结
  3. 记录阿里云增加二级域名步骤[同三级]
  4. php ini 分号,PHP.ini配置里这些开头的分号是什么意思
  5. c语言字符串转为大写,c语言 字符串转大写的简单实例
  6. app 显示未验证应用解决
  7. XP框架开启debug模式_win10 2004系统如何开启夜间护眼模式的问题
  8. vagrant lanp mysql远程登录设置
  9. [STM8L15x]输入捕获获取PWM占空比
  10. FCC ES6篇中的解构赋值