dkms项目主页 linux_linux dkms - CSDN
  • DKMS简介

    2020-03-30 00:08:02
    我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件...

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

    在使用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文件是本文关注的重点。

    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安装包,这里就不再一一赘述。



    作者:wwang
    出处:http://www.cnblogs.com/wwang
    本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    展开全文
  • 这篇文章http://xmodulo.com/build-kernel-module-dkms-linux.html讲的很详细,但是我遇到了一些问题,分享给大家,此篇教程只适用于我的rtl8723du驱动的情况,对于其他的情况可能适用,可能不适用。前提是在rtl8723...

    这篇文章http://xmodulo.com/build-kernel-module-dkms-linux.html讲的很详细,但是我遇到了一些问题,分享给大家,此篇教程只适用于我的rtl8723du驱动的情况,对于其他的情况可能适用,可能不适用。前提是在rtl8723du目录下直接执行make ;make install是没有问题的,但是在使用dkms时遇到了下列问题

    1、路径问题,

    dkms在将含Makefile的项目加入内核时,由于dkms路径已经改变了,好像是变到lib那去了,那么我们可以在Makefile添加下面的代码来适配在dkms中的情况

                  ifeq ($(src),)

                  export TopDIR ?= $(shell pwd)

                  else

                  export TopDIR ?= $(src)

                  endif

    2、post 0 MODULE 问题

    需要添加一行CONFIG_RTL8723DU := m,不知其所以然。。。

                  ifeq ($(CONFIG_RTL8723B), y)

                  $(MODULE_NAME)-$(CONFIG_MP_INCLUDED)+= core/rtw_bt_mp.o

                  endif

     

                  CONFIG_RTL8723DU := m

                  obj-$(CONFIG_RTL8723DU) := $(MODULE_NAME).o

     

                  else

     

                  export CONFIG_RTL8723DU = m

    3、最后两个坑:

    dkms.conf其中的package name和module name均不能有大写,否则会crash

    package name和/或module name都必须与makefile中的一致,否则binarary package not found

    展开全文
  • DKMS 应用

    2018-11-20 11:10:54
    我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件...

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

    在使用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文件是本文关注的重点。

     

    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

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

    2019-06-13 01:33:34
    为什么80%的码农都做不了架构师?>>> ...
  • 做技术的朋友可能有过类似这样的感觉——每天都会遇到新的问题,或者学到新的知识。然而一个人的时间和精力毕竟有限,不是所有的岗位都能做到总是亲力亲为,每人最擅长的领域也各...老版Linux不用愁 ——使用DKMS轻...
  • DKMS是什么?

    2020-04-25 17:14:09
    我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件...
  • 关于dkms

    2012-03-26 08:08:54
    DKMS(Dynamic Kernel Module Support)是DELL的一个项目主页在http://linux.dell.com/projects.shtml  DKMS为整个社区加快了驱动程序的开发、测试和检验,也便于用户安装所需的驱动程序。  目的:  ...
  • 网上有个项目叫bumblebee, 这个项目可以在linux下实现optimus技术. 不过,我一般用linux也就编编程, 用集成显卡足够了. 但是,虽然不用独立显卡,但是独立显卡在默认情况下是开启的,尽管不使用,但它依然在工作,在散热....
  • DKMS简介 DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。 1.背景 对于没有内核编程经验的使用者来说,使用者可能经常困惑:为什么更新...
  • 在Ubuntu安装和使用Anbox完整说明(一种在Linux使用Android应用的方法) Anbox安卓apk应用安装及使用说明和常见问题 https://blog.csdn.net/ZhangRelay/article/details/84671811 Anbox是一种基于容器...
  • linux服务器集群运维经验 公司大概有5000+以上的服务器节点,包括各种应用,我和同事共同维护大约2500+的服务器,主要包括一些视频cdn,直播视频cdn,webcdn和p2p服务器。 以下是自己在运维工作中的一点经验和看法,...
1 2 3 4 5 ... 16
收藏数 311
精华内容 124
关键字:

dkms项目主页 linux