DKMS简介

DKMS简介

DKMS on Ubuntu

DKMS全称是DynamicKernel ModuleSupport,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。在使用dkms之前首先需要确保系统中已经安装了DKMS,在Ubuntu下可以执行下面这个命令安装。

sudo apt-get install dkms

DKMS要求我们的代码目录必须以-的格式命名,主要命令如下所示。

status
查看管理状态
add
添加模块
build
编译模块
install
安装模块
uninstall
卸载模块
remove
删除模块
编写dkms.conf

要使用DKMS管理模块,需要在源代码下面包含dkms.conf文件,在源代码根目录下面创建并配置dkms.conf,以hello-0.1为例。

PACKAGE_NAME="hello"
PACKAGE_VERSION="0.1"
AUTOINSTALL="yes"

CLEAN="make clean"

BUILT_MODULE_NAME[0]="hello"
DEST_MODULE_LOCATION[0]="/updates"
MAKE[0]="make all KVERSION=$kernelver"
PACKGE_NAME
用于指示整个包的模块,必须要设定。必须要有编译的模块和这个参数同名,否则将提示找不到二进制包,所以可以指定为编译的任何一个模块名。
AUTOINSTALL
当更改kernel的时候会自动更新模块
BUILT_MODULE_NAME[0]
当有多个模块时,可以按序号设定每个模块的参数,注意模块名后面不需要加后缀。
添加模块

首先将代码命名为module-version格式并复制到/usr/src/下面,执行如下命令添加源代码到dkms。

sudo dkms add hello/0.1

接下来可以执行如下命令编译和安装。

sudo dkms build hello/0.1
sudo dkms install hello/0.1
删除模块

如果不需要使用模块,可以用如下命令删除。

sudo dkms remove hello/0.1 --all
制作deb包

使用DKMS更为常见的用法是制作deb包,用户可以直接从deb包安装,制作deb包需要安装如下工具。

sudo apt-get install dh-make libdigest-md5-file-perl

制作deb包的命令如下。

sudo dkms mkdeb hello/0.1
路径

假定我们的源码目录为sample-1.4.1。

源代码目录
sample-1.4.1
备份源代码目录
/usr/src/sample-1.4.1
源码包路径
/var/lib/dkms/sample/1.4.1/tarball/sample-1.4.1.dkms.tar.gz
安装包路径
/var/lib/dkms/sample/1.4.1/deb…

DKMS on RHEL

安装dkms环境
  1. 下载并安装dkms:RPM resourcedkms
  2. 如果要用rpmbuild需要安装rpm-build

    yum install rpm-build
    
  3. 原文:http://yemic.com/linux/linux-dkms.html
    

我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件,按部就班的执行几条命令还是很容易办到的。但这里还有一个问题,Linux模块和内核是有依赖关系的,如果遇到因为发行版更新造成的内核版本的变动,之前编译的模块是无法继续使用的,我们只能手动再编译一遍。这样重复的操作有些繁琐且是反生产力的,而对于没有内核编程经验的使用者来说可能会造成一些困扰,使用者搞不清楚为什么更新系统之后,原来用的好好的驱动程序突然就不能用了。这里,就是Dell创建的DKMS项目的意义所在。DKMS全称是DynamicKernel Module Support,它可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。

在使用dkms之前首先需要确保系统中已经安装了 DKMS。在Ubuntu下可以执行下面这个命令安装:

sudo apt-get install dkms

安装完毕之后,我们就可以开始使用 DKMS了。

本文的例子来自UbuntuWiki,大家可以从这里下载。

使用DKMS编译安装内核模块

DKMS的使用流程可以用下图简单表示:

DKMS简介

以hello-0.1为例,我们首先需要把代码copy到"/usr/src"下面,这样完整路径将是"/usr/src/hello-0.1"。

DKMS要求我们的代码目录必须以" -"的格式命名。本例中,代码的版本是0.1。

DKMS主要的命令可以参考上图所示,分别是add、build、install、uninstall和remove,另外,还可以执行"dkmsstatus"查看目前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 forthis kernel.  Skipping...
Building module:cleaning build area....
make KERNELRELEASE=2.6.38-8-generic allKVERSION=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 existswithin this kernel
 - Installation
   - Installing to/lib/modules/2.6.38-8-generic/updates/dkms/

把hello.ko从/lib/modules下移除可以执行“sudo dkms uninstall -m hello -v0.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= "makeclean"
MAKE[0]= "makeall 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来执行,也就是makeall,如果您想执行make release来编译,就需要在dkms.conf里明确设定。

BUILD_MODULE_NAME[0]用来指定模块的名称,一般情况下也可以不设定。

DEST_MODULE_LOCATION[0]用来设定模块安装的目的地址,本例是"/lib/module/$(KVERSION)/updates"。

表示在Linux引导之后DKMS会自动对这个模块执行Build和Install的动作,当然如果模块已经处于该状态的话,相应的动作是不用再执行的。

基于DKMS制作驱动程序的DEB安装包

作为Linux驱动开发者,有时候用户会要求我们提供驱动的DEB安装包,基于DKMS来制作DEB安装包是一个很好的选择。对开发者来说这样的DEB包制作起来比较简单,对于用户来说使用起来也省去许多烦恼。需要注意的是,制作DEB包依赖于dh-make,请首先执行“sudoapt-get install dh-make”安装。

在模块处于"Built State"的条件下,执行“sudo dkms mkdeb -m hello -v0.1”可以在目录“/var/lib/dkms/hello/0.1/deb”下生成deb包。

另外,DKMS还提供了mktarball和mkrpm来制作tarball和RPM安装包,这里就不再一一赘述。

http://www.cnblogs.com/wwang/archive/2011/06/21/2085571.html

  • 8
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Ubuntu上安装DKMS,可以使用以下命令进行安装: sudo apt-get install dkms 这将在您的系统中安装DKMS,并准备好在内核版本变动时重新生成驱动程序模块。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux Ubuntu20.04安装RTL8156网卡驱动开启巨型帧](https://blog.csdn.net/abanchao/article/details/125250161)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Ubuntu-离线安装基本依赖(gcc、make、dkms等)](https://blog.csdn.net/qyb19970829/article/details/109596767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [DKMS简介](https://blog.csdn.net/fouweng/article/details/53435602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值