前言:
DKMS是一个外置模块管理工具,可以自动build,安装各类驱动
DKMS (Dynamic Kernel Module Support) 是一种框架,用于在 Linux 操作系统中构建和维护内核模块。内核模块是 Linux 内核的一部分,它们提供了许多功能,例如硬件驱动程序、网络协议栈扩展、文件系统等等。DKMS 简化了内核模块的安装和升级过程,可以自动地重新编译内核模块以适应新的内核版本。
在 DKMS 中,每个内核模块都被视为一个源代码包,并通过一个称为 dkms.conf 的配置文件进行管理。该配置文件指定了源代码的位置、编译和安装模块所需的命令,以及其他必要的信息。当内核更新时,DKMS 会自动重建和安装内核模块,以确保它们与新内核版本兼容。
DKMS 还允许用户创建和安装第三方内核模块,以扩展 Linux 内核的功能。这些模块可以从官方仓库或其他来源获得。一些常见的第三方内核模块包括虚拟机驱动程序、文件系统、网络协议栈扩展等等。
一,
DKMS的安装
该软件安装非常简单,有网有手就可以了,centos7操作系统需要epel源;
添加centos7的epel源并安装
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repoyum install dkms -y
其中依赖elfutils-libelf-devel-0.168-8.el7.x86_64.rpm比较重要
二,DKMS服务的配置文件
/etc/dkms/framework.conf ,里面有一些配置,基本不需要更改,如果有需要可以自己更改,主要是下面这两个路径 按需配置:
# source_tree="/usr/src"# DKMS Tree Location (default: /var/lib/dkms):# dkms_tree="/var/lib/dkms"
DKMS服务启动并加入开机启动:
systemctl enable dkmssystemctl start dkms
三,dkms安装外部驱动的准备工作
源码驱动文件建议找带dkms.conf 这样的,RTL8188GU-master.zip 这个驱动源码文件前面我已经分享在网盘了
链接:https://pan.baidu.com/s/1tQseIUjo_MVCe-kaU8cROA 提取码:kkey
RTL8188GU-master
在Anolis OS 8.8的内核版本5.10.134-13.an8.x86_64安装可用。
将此驱动源码文件下载后,放置到/usr/src 目录下,注意是8188gu-1.0.1这个文件夹,其它的驱动也是如此,固定放置在/usr/src 目录下,包名-版本号的形式
该源码文件带有dkms.conf ,内容如下,存放在8188gu-1.0.1这个文件夹下面:[root@centos10 8188gu-1.0.1]# cat dkms.conf PACKAGE_NAME="8188gu"PACKAGE_VERSION="1.0.1"MAKE[0]="'make' -j$(nproc) KVER=${kernelver}"CLEAN="'make' clean"BUILT_MODULE_NAME[0]="8188gu"DEST_MODULE_LOCATION[0]="/kernel/drivers/net/wireless"AUTOINSTALL="yes"REMAKE_INITRD="no"
[root@centos10 8188gu-1.0.1]# pwd/usr/src/8188gu-1.0.1[root@centos10 8188gu-1.0.1]# lsAMD_X86.sh ARM64.sh ARM_RPI.sh core dkms.conf hal include Kconfig Makefile os_dep platform README.md
这里需要注意,dkms.conf 文件里的package name 就是文件夹的前一部分,package version 就是文件夹的后面一部分,dkms运行的时候会自动识别,本例中,整个配置文件无需改动,
自己的服务器是什么架构就先运行哪个脚本,例如是AMD86的架构,就先运行一下AMD_X86.sh,脚本会自动帮你修改Makefile 以作适配,如果此脚本不先运行将会在开始编译的时候报错如下:
CC [M] /usr/src/8188gu-1.0.1/core/rtw_cmd.ogcc: error: unrecognized command line option ‘-mlittle-endian’
当然了,如果你是树莓派的板子,那么需要先运行ARM_RPI.sh这个脚本
四,dkms安装驱动并集成到内核
通常分三步,第一步添加驱动到内核,第二步build 驱动,第三步正式安装驱动
1,dkms add
[root@centos10 8188gu-1.0.1]# dkms add -m 8188gu -v 1.0.1Deprecated feature: REMAKE_INITRD (/usr/src/8188gu-1.0.1/dkms.conf)Creating symlink /var/lib/dkms/8188gu/1.0.1/source -> /usr/src/8188gu-1.0.1
2,dkms build
此命令对应于平常的编译命令里的make
[root@centos10 8188gu-1.0.1]# dkms build -m 8188gu -v 1.0.1Sign command: /lib/modules/5.4.266-1.el7.elrepo.x86_64/build/scripts/sign-fileSigning key: /var/lib/dkms/mok.keyPublic certificate (MOK): /var/lib/dkms/mok.pubDeprecated feature: REMAKE_INITRD (/var/lib/dkms/8188gu/1.0.1/source/dkms.conf)Building module:Cleaning build area...'make' -j4 KVER=5.4.266-1.el7.elrepo.x86_64..........Signing module /var/lib/dkms/8188gu/1.0.1/build/8188gu.koCleaning build area...
3,dkms install
此命令对应于平常的编译命令里的make install
[root@centos10 8188gu-1.0.1]# dkms install -m 8188gu -v 1.0.1Deprecated feature: REMAKE_INITRD (/var/lib/dkms/8188gu/1.0.1/source/dkms.conf)8188gu.ko:Running module version sanity check. - Original module - Found /lib/modules/5.4.266-1.el7.elrepo.x86_64/kernel/drivers/net/wireless/8188gu.ko - Storing in /var/lib/dkms/8188gu/original_module/5.4.266-1.el7.elrepo.x86_64/x86_64/ - Archiving for uninstallation purposes - Installation - Installing to /lib/modules/5.4.266-1.el7.elrepo.x86_64/extra/Adding any weak-modulesdepmod...
好了,就这么简简单单的安装好了rtl8188gu 网卡驱动了,那么,dkms如何管理驱动的呢?
[root@centos10 8188gu-1.0.1]# dkms statusDeprecated feature: REMAKE_INITRD (/var/lib/dkms/8188gu/1.0.1/source/dkms.conf)8188gu/1.0.1, 5.4.266-1.el7.elrepo.x86_64, x86_64: installed
此时,我们会看到 8188gu 安装在5.4.266内核下,架构是x86_64 ,已经安装完毕了
4,查看驱动是否加入内核
可以看到最后两行表明已经注册到内核了,
[root@centos10 8188gu-1.0.1]# modprobe 8188gu[root@centos10 8188gu-1.0.1]# tail /var/log/messagesJan 24 07:48:26 centos10 systemd-logind: New session 4 of user root.Jan 24 07:48:26 centos10 systemd: Started Session 4 of user root.Jan 24 08:01:01 centos10 systemd: Started Session 5 of user root.Jan 24 08:16:16 centos10 kernel: usbcore: deregistering interface driver rtl8710buJan 24 08:16:20 centos10 kernel: usbcore: registered new interface driver rtl8710buJan 24 08:16:59 centos10 systemd: Got automount request for /proc/sys/fs/binfmt_misc, triggered by 8490 (find)Jan 24 08:16:59 centos10 systemd: Mounting Arbitrary Executable File Formats File System...Jan 24 08:16:59 centos10 systemd: Mounted Arbitrary Executable File Formats File System.Jan 24 08:18:57 centos10 kernel: usbcore: deregistering interface driver rtl8710buJan 24 08:19:58 centos10 kernel: usbcore: registered new interface driver rtl8710bu
如果dkms add 这个命令没有执行,忘记了,只执行了build和install,那么,dkms status 将会是这样输出的:[root@centos10 8188gu-1.0.1]# dkms statusDeprecated feature: REMAKE_INITRD (/var/lib/dkms/8188gu/1.0.1/source/dkms.conf)8188gu/1.0.1, 5.4.266-1.el7.elrepo.x86_64, x86_64: installed (original_module exists)
并且加载驱动的时候会报这个错,虽然此错误没什么影响,但总归是不完美嘛:Jan 21 17:30:00 centos10 kernel: AVX2 version of gcm_enc/dec engaged.Jan 21 17:30:00 centos10 kernel: AES CTR mode by8 optimization enabledJan 21 17:30:00 centos10 kernel: 8188gu: loading out-of-tree module taints kernel.Jan 21 17:30:00 centos10 kernel: usbcore: registered new interface driver btusb
因此,这说明dkms可以消除掉这些烦人的报错
卸载前面安装的8188gu驱动也非常的简单了 dkms remove就可以了:
[root@centos10 8188gu-1.0.1]# dkms remove -m 8188gu -v 1.0.1Deprecated feature: REMAKE_INITRD (/var/lib/dkms/8188gu/1.0.1/source/dkms.conf)Module 8188gu-1.0.1 for kernel 5.4.266-1.el7.elrepo.x86_64 (x86_64).Before uninstall, this module version was ACTIVE on this kernel.Removing any linked weak-modules8188gu.ko: - Uninstallation - Deleting from: /lib/modules/5.4.266-1.el7.elrepo.x86_64/extra/ - Original module - Archived original module found in the DKMS tree - Moving it to: /lib/modules/5.4.266-1.el7.elrepo.x86_64/kernel/drivers/net/wireless/depmod...Removing original_module from DKMS tree for kernel 5.4.266-1.el7.elrepo.x86_64 (x86_64)Deleting module 8188gu-1.0.1 completely from the DKMS tree.
可以看到dkms还是非常的方便的,某个驱动需要编译的话,只要有源码包,然后仿照上面的dkms.conf 就可以简简单单的添加到内核里了,不想要这个驱动了,也是简简单单的一个命令
注意,一个驱动只需要注册 也就是add一次就可以了
版权声明:本文内容来自CSDN博客: 晚风_END,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://blog.csdn.net/alwaysbefine/article/details/135797191如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。