一、 什么是DKMS 1
二、 DKMS工作流程 2
三、 安装DKMS 2
四、 使用DKMS打包并安装驱动 3
1、 准备驱动 3
2、 创建dkms.conf配置文件 3
3、 添加至dkms 3
4、 创建dkms模块 4
5、 检查创建后状态 4
6、 安装模块 4
7、 安装后检查 4
五、内核升级后自动加载验证 4
六、 打包制作好的DKMS驱动 5
??
一、什么是DKMSDKMS(Dynamic Kernel Module Support)是DELL的一个项目,主页在:http://linux.dell.com/projects.shtm,对应的GitHUB地址:https://github.com/dell/dkms。 DKMS为整个社区加快了驱动程序的开发、测试和检验,也便于用户安装所需的驱动程序。
DKMS的目的是让依赖内核的模块源码独立出来以便升级内核时候可以容易地重新建立。这也使得Linux驱程编写人员能够尽快的提供他们的驱动而不用等待新版本的Linux内核发布,同时也打消了用户对模块能否在新内核上面重新编译的疑虑。
简单来说,当我们在为服务器安装操作系统后,某些驱动在操作系统内核中并为集成,需要在安装操作系统过程中进行安装(如RAID卡驱动),或安装完操作系统后再进行单独安装(如网卡驱动)。对于这种情况,如果我们后期对操作系统内核进行了升级,因为新内核很可能没有集成对应的驱动,需要重新安装才能恢复正常。
这种情况,增加了我们日常运维的复杂度,降低了运维效率,同时,用户体验也相应地大大降低。
DKMS就是为了解决这类问题而产生的,它可以将驱动程序以动态内核模块的方式安装在操作系统中,当内核升级后,如果升级的内核未集成对应的驱动,则可通过DKMS服务自动安装、加载对应内核版本的驱动,完美的解决了升级内核后还需要要手动安装操作的问题。
二、DKMS工作流程DKMS的使用流程可以用下图简单表示:
通过上图,我们可以看到,DKMS分为:未安装、添加状态、创建状态和安装状态。即,最初始的状态为未安装的状态,可以通过dkms add将指定模块进行添加,变更为添加状态。添加状态后,再通过dkms build,可以将模块变为创建状态。创建状态后,通过dkms install将模块变为安装状态。之后如果需要卸载模块,可以通过dkms remove将模块卸载。
DKMS模块的状态,可以通过dkms status进行查看,如下图:
三、安装DKMS对于不同的操作系统,可以使用不同的安装方法:
操作系统 |
安装命令 |
备注 |
Centos |
yum?install dkms |
1、需要安装EPEL源:yum -y install epel-release, 2、需要安装linux-headers-<kernel version>[-generic]用于编译对应内核版本的驱动。 |
Ubuntu |
apt-install dkms |
需要安装linux-headers-<kernel version>[-generic]用于编译对应内核版本的驱动。 |
Debian |
apt-install dkms |
需要安装linux-headers-<kernel version>[-generic]用于编译对应内核版本的驱动。 |
安装完成后,可以通过dkms -V查看dkms是否安装成功,以及版本号:
四、使用DKMS打包并安装驱动?
本文档以打包Intel i40e网卡驱动为例,示范使用DKMS如何管理驱动。
1、准备驱动
?
-
下载地址:wget https://downloadmirror.intel.com/24411/eng/i40e-2.15.9.tar.gz-C /usr/src/
-
解压驱动:cd /usr/src && tar zxvf i40e-2.15.9.tar.gz
2、创建dkms.conf配置文件
cd /usr/src/i40e-2.15.9
vim dkms.conf
### 添加如下内容:
MAKE="BUILD_KERNEL=${kernelver} make -C src/ KERNELDIR=/lib/modules/${kernelver}/build"?#这里-C指向了源码所在文件夹
CLEAN="make -C src/ clean"
BUILT_MODULE_NAME=i40e??#这里对应驱动的名字
BUILT_MODULE_LOCATION=src/
DEST_MODULE_LOCATION="/updates"
PACKAGE_NAME=i40e-dkms
PACKAGE_VERSION=2.15.9??#这里对应驱动版本
REMAKE_INITRD=no
AUTOINSTALL="yes"
3、添加至dkms
$ dkms add -m i40e -v?2.15.9?#-m和-v后面的参数要和文件夹及dkms.conf中配置对应
Creating symlink /var/lib/dkms/i40e/2.15.9/source ->
?????????????????/usr/src/i40e-2.15.9
DKMS: add completed.
4、创建dkms模块
$ dkms build -m i40e -v?2.15.9
Kernel preparation unnecessary for this kernel.? Skipping...
Building module:
cleaning build area...
BUILD_KERNEL=3.10.0-862.el7.x86_64 make -C src/ KERNELDIR=/lib/modules/3.10.0-862.el7.x86_64/build........
cleaning build area...
DKMS: build completed.
5、检查创建后状态
## 执行dkms status命令,可以看到当前dkms加载驱动、版本、内核版本及状态
$ dkms status
i40e, 2.15.9, 3.10.0-862.el7.x86_64, x86_64: built
6、安装模块
## 执行dkms install正式安装驱动
$ dkms?install?-m i40e -v?2.15.9
7、安装后检查
## 等待命令运行完成,执行modinfo命令查看驱动五、内核升级后自动加载验证
$ modinfo i40e
## 执行dkms status命令,可以看到当前状态已经为installed,此时dkms的驱动就安装完成了
$ dkms status
i40e, 2.15.9, 3.10.0-862.el7.x86_64, x86_64: installed (original_module exists)
$ yum update kernel*?|| apt?update kernel*六、打包制作好的DKMS驱动
$ reboot
## 重启后查看当前内核
$ uname -a
Linux localhost.localdomain 3.10.0-1160.25.1.el7.x86_64?#1 SMP Wed Apr 28 21:49:45 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
## 查看dkms状态,可以看到i40e驱动已经加载到了新内核
$ dkms status
i40e, 2.15.9, 3.10.0-862.el7.x86_64, x86_64: installed (original_module exists)
## 在dkms build完成后,我们除了可以直接dkms install进行安装外,还可以将驱动打包成rpm包
$ dkms mkrpm -m i40e -v?2.15.9?--source-only
copying legacy postinstall template...
Copying?source?tree...
rpmbuild...
Wrote:?/var/lib/dkms/i40e/2.15.9/rpm/i40e-2.15.9-1dkms.src.rpm
Wrote:?/var/lib/dkms/i40e/2.15.9/rpm/i40e-2.15.9-1dkms.noarch.rpm???#此文件就是打包完成的rpm包,直接安装后驱动就是dkms的状态,该文件同样可以在别的版本的系统中安装
DKMS: mkrpm completed.
$?mv?/var/lib/dkms/i40e/2.15.9/rpm/i40e-2.15.9-1dkms.noarch.rpm ~/
$ rpm -ivh ~/i40e-2.15.9-1dkms.noarch.rpm