2016-09-28 22:03:24 hjwsm1989 阅读数 1690

概述

DKMS是基于动态内核模块支持的可以让开发者无需使用最新的内核版本而对某个单一的内核模块做升级(比如说是修复bug)

DKMS设计目标

1 实现的是机制(如何更新单一的内核模块并且跟踪)而不是策略(何时应该更新一个单一的内核模块),目的在于将两者隔开
2 允许系统管理员清楚地知道哪个模块、哪个版本为哪个内核以什么样的状态使用
3 让模块的源码保持是在顶层的内核树在kernel.org,使用补丁来使模块与更早的内核相兼容
4 应用内核-提供 创建机制。这样可以减少开发者必需弄清楚Makefile的困难,当有错误的时候
5 保持开发者需要额外的DKMS知识在最少的状态,只需要dkms.conf文件
6 允许多个版本同时出现在系统中,但是在任何时刻只有一个时活跃的,就是说只有一个可以使用在一个时刻
7 允许支持DKMS的驱动能够在linux标准基础上打成RPM格式
8 让多个使用者方便使用:驱动开发者、系统管理员、linux distros和系统售卖者
DKMS的生命周期:
有一个图形的使用说明了DKMS的生命周期,是由多个状态组成的
RPM:RedHat Package Manger 红帽包管理器

使用DKMS

1 Add
首先使用DKMS的模块的源码必需在/usr/src/<module>-<module-version>/.目录下。dkms.conf文件必需在适合的目录下,告诉DKMS在什么地方安装模块和怎样创建它。

命令:

<span style="font-size:18px;">dkms add -m module-name -v module-version </span>

将module-name/module-version加入到/var/dkms树中


2 Build

 此时需要内核的源码在/lib/module/<kernel-version>/build的软链接下,才能创建(build)
 命令: 
dkms build -m module-name -v module-version -k 2.6.35
 解释:在build步骤会编译模块,如果-k后的参数不写出来,则默认为当前运行的内核版本,但是可以很好的编译(不是当前运行的内核,这点很重要,只要你有这个版本内核的软链接在这个目录下)


3 Install

在build完成之后,这样这个模块就可以安装到内核中了,安装将生成的模块二进制文件复制到/lib/modules树下。如果相同名字的模块已经存在,那么dkms将它保存在原来的目录下,这样在新的模块被卸载之后就可以用来代替。例子:
dkms install -m module-name -v version -k kernel-version
若这个模块已经被安装,DKMS会保留副本在/var/dkms/<module-name>/original_module/目录下。


4 uninstall和remove

uninstall命令删除/lib/modules下你安装的这个模块
dkms uninstall -m module-name -v version -k kernel-version

同样,如果如果-k参数未指定,则使用当前运行的内核
那么remove则会将这个模块的所有的traces在DKMS树中
dkms remove -m module-name -v version -k kernel-version
dkms remove -m module-name -v version --all

第一个命令,不会将在另外的内核上的这个模块删除
第二个命令,将会删除所有的version在所有版本的内核中 
因此,remove命令就是清除DKMS树


5 status命令

status命令返回的是当前的DKMS树的信息,如果没有加参数,就返回所有的信息 逻辑上讲,具体的返回信息取决于你所加的参数
dkms [-m module-name] [-v version] [-k kernel-version]可选参数

6 match
可以将一个内核版本的模块转换到另外的内核,但是要保证在相应的内核模块下有这个模块的相关文件。
dkms match --templatekernel kernel-version -k kernel-version
--templatekernel 是说明以这个配置为基础,-k说明是在这个版本上执行

7 mktarball 
生成tar文件包

驱动开发

你只需要在驱动的源码中加入dkms.conf文件,接着使用dkms ldtarball --archive /path/to/foo-1.0.tgz 
列举两个例子,来说明两个dkms.conf文件
1 最简便的必需的例子     2 非常完整的例子
1 简单必需的例子
包版本的定义、使用make命令编译模块
PACKAGE_NAME 和BUILT_MODULE_NAME通常是相同的(即是复制)
DEST_MODULE_LOCATION数组也是必要的,就是告诉DKMS在/lib/modules下的模块应该安装在什么地方
例子:
PACKAGE_NAME=“bsdocfs”
PACKAGE_VERSION="0.1"
MAKE[0]="make -C ${kernel_source_dir}
     SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
BUILT_MODULE_NAME[0]="bsdocfs"
DEST_MODULE_LOCATION[0]="/kernel/fs/bsdocfs"

对内核版本和架构的限制
BUILD_EXCLUSIVE_KERNEL=
BUILD_EXCLUSIVE_ARCH=
这表明只允许指定的内核和架构安装


POST_INSTALL等命令的使用,待以后再说明
举例说明:
1. 安装与当前内核版本对应的内核开发包
2. 安装dkms包
3. 创建目录/usr/src/<module>-<module-version>/
[root@host]# mkdir /usr/src/cifs-1.45fixed/
4. 拷贝内核模块的代码到该目录
[root@host]# cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-i686/fs/cifs
[root@host cifs]# cp -a * /usr/src/cifs-1.45fixed/
5. 新建dkms.conf文件
[root@host cifs]# cd /usr/src/cifs-1.45fixed
[root@host cifs-1.45fixed]# vi dkms.conf
配置文件dkms.conf要包含如下:
PACKAGE_NAME="cifs"
PACKAGE_VERSION="1.45fixed"
BUILT_MODULE_NAME[0]="cifs"
DEST_MODULE_LOCATION[0]="/kernel/fs/cifs/"
AUTOINSTALL="yes"
ps:<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">DEST_MODULE_LOCATION[0]在安装模块的是会被忽略</span>

默认的总是 /lib/modules/<kernel-version>/extra/ 目录。

这个参数是在模块被卸载的时候,数据保存的路径 ,类似保留旧模块数据。

6.加入<module>/<module-version> 到DKMS树
[root@host cifs-1.45fixed]# dkms add -m cifs -v 1.45fixed
7. 编译DKMS
[root@host cifs-1.45fixed]# dkms build -m cifs -v 1.45fixed
8. 安装DKMS
[root@host cifs-1.45fixed]# dkms install -m cifs -v 1.45fixed

ps: 在内核2.6.35.3 (i686)可能会报错


参考manpage

http://linux.dell.com/dkms/manpage.html

白皮书

 http://linux.dell.com/dkms/dkms-ols2004.pdf

2011-09-05 19:42:43 boywhp 阅读数 17469

http://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support


Dynamic Kernel Module Support (DKMS) is a framework used to generate Linux kernel modules whose sources do not generally reside in the Linux kernel source tree. DKMS enables kernel device drivers to be automatically rebuilt when a new kernel is installed.

An essential feature of DKMS is that it automatically recompiles all DKMS modules if a new kernel version is installed. This allows drivers and devices outside of the mainline kernel to continue working after a Linux kernel upgrade.

Another benefit of DKMS is that it allows one to install a new driver on an existing system, running an arbitrary kernel version, without any need for manual compilation or precompiled packages provided by the vendor.

DKMS was written by the Linux Engineering Team at Dell in 2003. It is included in many distributions, such as UbuntuDebianRed Hat Enterprise LinuxFedoraSuSE and CentOS. DKMS is free software released under the terms of the GNU General Public License (GPL) v2 or later.


CentOS:Build Your Own Kernel Modules


http://wiki.centos.org/HowTos/BuildingKernelModules#head-d2e4c05886f94c701e4ae74387d41d8c40c25d01


dkms
2016-04-22 16:08:40 xbrother123 阅读数 1033

DKMS简介

DKMS全称是Dynamic Kernel Module Support
Linux模块和内核是有依赖关系的,如果遇到因为发行版更新造成的内核版本的变动,之前编译的模块是无法继续使用的,我们只能手动再编译一遍。
DKMS可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。

安装dkms

sudo apt-get install dkms

dkms的使用流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
                                                                 uninstall
---------------------------
- -
V -

--------------- --------------- --------------- -------------------
- - add - - build - - install - -
- Not in tree - ------> - Added State - ------> - Built State - ------> - Installed State -
- - - - - - - -
--------------- --------------- --------------- -------------------
^ - - -

- - - -
--------------------------------------------------------------------------
remove

DKMS主要的命令

add、build、install、uninstall和remove

例如:

1
2
$ dkms status 
virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed

dkms要求代码的目录必须以 - 的格式命名, 例如: hello-0.1

实例: 使用DKMS管理 rtlwifi驱动

准备rtlwifi源文件

rtlwifi代码的github地址为: http://github.com/lwfinger/rtlwifi_new.git

将下载的代码拷贝到/usr/src

例如:

1
2
3
$ ls /usr/src/
linux-headers-3.13.0-49 rtlwifi-1.0
linux-headers-3.13.0-49-generic virtualbox-4.3.10

还需要在rtlwifi-1.0中新建一个文件dkms.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PACKAGE_NAME="rtlwifi"
PACKAGE_VERSION="1.0"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="rtlwifi"
BUILT_MODULE_LOCATION[0]="."
DEST_MODULE_LOCATION[0]="kernel/drivers/net/wireless/rtlwifi"
BUILT_MODULE_NAME[1]="rtl_pci"
BUILT_MODULE_LOCATION[1]="."
DEST_MODULE_LOCATION[1]="kernel/drivers/net/wireless/rtlwifi"
BUILT_MODULE_NAME[2]="rtl_usb"
BUILT_MODULE_LOCATION[2]="."
DEST_MODULE_LOCATION[2]="kernel/drivers/net/wireless/rtlwifi"
BUILT_MODULE_NAME[3]="btcoexist"
BUILT_MODULE_LOCATION[3]="btcoexist"
DEST_MODULE_LOCATION[3]="kernel/drivers/net/wireless/rtlwifi/btcoexist"
BUILT_MODULE_NAME[4]="rtl8723be"
BUILT_MODULE_LOCATION[4]="rtl8723be"
DEST_MODULE_LOCATION[4]="kernel/drivers/net/wireless/rtlwifi/rtl8723be"
AUTOINSTALL="yes"

PACKAGE_NAME和PACKAGE_VERSION和文件夹的命名是一致的。
DEST_MODULE_LOCATION[0]用来设定模块安装的目的地址,本例是”/lib/module/$(KVERSION)/updates”
DEST_MODULE_LOCATION[#] 在下面这些发行版中被忽略:
Fedora Core 6 and higher, Red Hat Enterprise Linux 5 and higher
Novell SuSE Linux Enterprise Server 10 and higher, Novell SuSE Linux10.0 and higher, and Ubuntu
Instead , the proper distribution-specific directory is used.
AUTOINSTALL=”yes”表示在Linux引导之后DKMS会自动对这个模块执行Build和Install的动作,当然如果模块已经处于该状态的话,相应的动作是不用再执行的。

将rtlwifi添加到dkms

sudo dkms add -m rtlwifi -v 1.0

其中-m指定module的名字, -v 指定module version
所以rtlwifi的源文件路径为: /usr/src/rtlwifi-1.0

1
2
3
4
5
6
$ sudo dkms add -m rtlwifi -v 1.0

Creating symlink /var/lib/dkms/rtlwifi/1.0/source ->
/usr/src/rtlwifi-1.0

DKMS: add completed.

查看dkms的状态:

1
2
3
$ dkms status 
rtlwifi, 1.0: added
virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed

可以看到rtlwifi的状态为added

使用dkms build rtlwifi

1
2
3
4
5
6
7
8
9
10
sudo dkms build -m rtlwifi -v 1.0

Kernel preparation unnecessary for this kernel. Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=3.13.0-49-generic -C /lib/modules/3.13.0-49-generic/build M=/var/lib/dkms/rtlwifi/1.0/build....................
cleaning build area....

DKMS: build completed.

查看dkms状态:

1
2
3
$ dkms status 
rtlwifi, 1.0, 3.13.0-49-generic, x86_64: built
virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed

rtlwifi的状态为built

生成的ko模块位于:

/var/lib/dkms/rtlwifi/1.0/3.13.0-49-generic/x86_64/module

使用dkms 安装rtlwifi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ sudo dkms install --force -m rtlwifi -v 1.0

rtlwifi:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/3.13.0-49-generic/updates/dkms/

rtl_pci.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/3.13.0-49-generic/updates/dkms/

rtl_usb.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/3.13.0-49-generic/updates/dkms/

btcoexist.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/3.13.0-49-generic/updates/dkms/

btcoexist.ko:
Running module version sanity check.
- Original module
- Multiple same named modules!
- 2 named btcoexist.ko in /lib/modules/3.13.0-49-generic/
- Installation
- Installing to /lib/modules/3.13.0-49-generic/updates/dkms/

rtl8723be.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/3.13.0-49-generic/updates/dkms/

depmod....

DKMS: install completed.

查看dkms 状态:

1
2
3
$ dkms status 
rtlwifi, 1.0, 3.13.0-49-generic, x86_64: installed
virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed

从dkms系统移出rtlwifi

从/lib/modules下移除:

sudo dkms uninstall -m rtlwifi -v 1.0

从/var/lib/dkms下彻底删除

sudo dkms remove -m rtlwifi -v 1.0 —all



转载:

http://www.linuxtoy.cn/2015/07/LSM/dkms/

DKMS
2016-08-01 09:37:35 Michaelwubo 阅读数 4990

DKMS:主要作用就是当内核发生变化(版本号),内核之外的驱动可以动态重新生成新的模块。因为内核之外的模块是找/lib/modules/内核版本号的当内核升级后,内核版本号发生变化,目录也发生变化,而内核之外的驱动版本号没有发生变化,此时就用不了了。而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.conf

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"

sudo dkms add -m hello -v 0.1

dkms status

sudo dkms build -m hello -v 0.1

sudo dkms install -m hello -v 0.1

/usr/src/hello-0.1/
├── dkms.conf
├── hello.c
└── Makefile



dkms与deb打包结合在一起

1、在debian同一级目录下面创建

dkms.conf

  1 PACKAGE_NAME="mt7601u-ap"
  2 PACKAGE_VERSION="#MODULE_VERSION#"
  3 CLEAN="make clean"
  4 MAKE="make all KVERSION=$kernelver"
  5 BUILT_MODULE_NAME="mt7601Uap"
  6 DEST_MODULE_LOCATION="/kernel/drivers/net/wireless"
  7 AUTOINSTALL="yes"

2、在debian目录中的rule

2.1、rules:

 1 #!/usr/bin/make -f
  2 VERSION=$(shell dpkg-parsechangelog | sed -rne 's,^Version: (.+).*,\1,p' | cut -d . -f 1,2)
  3 %:
  4         dh $@ --with dkms
  5 
  6 override_dh_auto_configure:
  7 override_dh_auto_build:
  8 override_dh_auto_test:
  9 override_dh_auto_install:
 10 override_dh_auto_clean:
 11 
 12 override_dh_dkms:
 13         dh_install ap  \
 14                 ate \
 15                 chips  \
 16                 common \
 17                 include  \
 18                 LICENSE  \
 19                 mac  \
 20                 Makefile  \
 21                 mcu  \
 22                 mgmt  \
 23                 os  \
 24                 phy  \
 25                 rate_ctrl  \
 26                 README.md  \
 27                 RT2870APCard.txt  \
 28                 RT2870AP.txt  \
 29                 tools \
 30                 usr/src/mt7601u-ap-$(VERSION)
 31 
 32         dh_dkms -V $(VERSION)


2.2、dkms:



  1 PACKAGE_NAME="mt7601u-ap"
  2 PACKAGE_VERSION="#MODULE_VERSION#"
  3 CLEAN="make clean"
  4 MAKE="make all KVERSION=${kernelver}"
  5 BUILT_MODULE_NAME="mt7601Uap"
  6 DEST_MODULE_LOCATION="/kernel/drivers/net/wireless"
  7 AUTOINSTALL="yes"



2019-01-29 10:42:00 liuqun69 阅读数 72

DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。

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

dkms.conf文件是本文关注的重点。

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_NAMEPACKAGE_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/modules/$(KVERSION)/updates"。但是阿群在CentOS 7.6测试的结果是系统会将模块安装到/lib/modules/3.10.0-957.el7.x86_64/extra/目录。
  • AUTOINSTALL="yes"表示在Linux引导之后DKMS会自动对这个模块执行Build和Install的动作,当然如果模块已经处于该状态的话,相应的动作是不用再执行的。
sudo dkms build -m hello -v 0.1
sudo dkms install -m hello -v 0.1
sudo dkms uninstall -m hello -v 0.1
sudo dkms remove hello/0.1 --all

DKMS简介

阅读数 15685

关于dkms

阅读数 358

没有更多推荐了,返回首页