1,linux dkms是什么
DKMS (Dynamic Kernel Module Support) 是一种框架,用于在 Linux 操作系统中构建和维护内核模块。内核模块是 Linux 内核的一部分,它们提供了许多功能,例如硬件驱动程序、网络协议栈扩展、文件系统等等。DKMS 简化了内核模块的安装和升级过程,可以自动地重新编译内核模块以适应新的内核版本。
在 DKMS 中,每个内核模块都被视为一个源代码包,并通过一个称为 dkms.conf 的配置文件进行管理。该配置文件指定了源代码的位置、编译和安装模块所需的命令,以及其他必要的信息。当内核更新时,DKMS 会自动重建和安装内核模块,以确保它们与新内核版本兼容。
DKMS 还允许用户创建和安装第三方内核模块,以扩展 Linux 内核的功能。这些模块可以从官方仓库或其他来源获得。一些常见的第三方内核模块包括虚拟机驱动程序、文件系统、网络协议栈扩展等等。
2, 如何安装和使用DKMS
在大多数 Linux 发行版中,DKMS 已经预装了,如果您的系统没有预装 DKMS,可以通过以下命令进行安装:
对于 Debian/Ubuntu 系统:
sudo apt-get install dkms
对于 Fedora/CentOS/RHEL 系统:
sudo yum install epel-release
sudo yum install dkms
3, 如何使用DKMS
-
dkms add
:将内核模块源代码添加到 DKMS 中,使其可以自动构建和安装。sudo dkms add -m module_name -v module_version 其中,`module_name` 是内核模块的名称,`module_version` 是内核模块的版本号。
-
dkms build
:使用 DKMS 构建内核模块。sudo dkms build -m module_name -v module_version 此命令将会在 DKMS 管理的所有内核版本上构建指定的内核模块。 sudo dkms build -m module_name -v module_version -k kernel_version -k:指定要使用的内核版本。其中,`kernel_version` 是要使用的内核版本号。如果不指定该选项,则默认使用当前正在运行的内核版本。 -m:指定要构建的内核模块名称,其中,module_name 是要构建的内核模块名称。 -v:指定要构建的内核模块版本号。 其中,module_version 是要构建的内核模块的版本号。 例如,如果要在内核版本为 5.10.0-7 的系统上构建版本号为 1.0 的内核模块,可以使用以下命令: sudo dkms build -m module_name -v 1.0 -k 5.10.0-7
-
dkms install
:使用 DKMS 安装内核模块。sudo dkms install -m module_name -v module_version 此命令将会在 DKMS 管理的所有内核版本上安装指定的内核模块。
-
dkms remove
:从 DKMS 中删除内核模块。sudo dkms remove -m module_name -v module_version --all 此命令将会从 DKMS 中删除指定的内核模块,并删除相关的文件。使用 `--all` 选项可以删除 DKMS 中所有安装的版本。
-
dkms status
:显示已安装的内核模块及其状态。sudo dkms status 此命令将会列出所有已安装的内核模块及其状态,例如构建状态、安装状态、错误状态等等。
-
dkms mktarball
:创建内核模块的源代码压缩包。sudo dkms mktarball -m module_name -v module_version 此命令将会创建指定内核模块的源代码压缩包,可以用于备份或分发。
-
dkms mkdeb
:创建 Debian 软件包。sudo dkms mkdeb -m module_name -v module_version 此命令将会创建一个 Debian 软件包,包含指定的内核模块和相关文件。
-
dkms mkrpm
:创建 RPM 软件包。sudo dkms mkrpm -m module_name -v module_version ``` 此命令将会创建一个 RPM 软件包,包含指定的内核模块和相关文件。
以上命令只是 DKMS 提供的一部分功能,还有许多其他命令和选项可以用来管理内核模块。您可以使用 man dkms
命令查看 DKMS 的完整帮助文档。
4,dkms不依赖内核源码吗
DKMS 不依赖于内核源代码,因为它是使用内核源代码的头文件和符号文件进行编译的。DKMS 需要安装一个与当前正在运行的内核版本匹配的内核头文件包,以便在编译和安装内核模块时使用正确的头文件。
在大多数 Linux 发行版中,内核头文件包已经预装。如果没有预装,可以通过包管理器安装。例如,在 Ubuntu 系统上,需要安装一个名为 linux-headers
的包,可以使用以下命令进行安装:
sudo apt-get install linux-headers-$(uname -r)
其中,$(uname -r)
会自动获取当前正在运行的内核版本号,并将其作为参数传递给包管理器。这样就可以安装与当前内核版本匹配的内核头文件包了。
在 DKMS 中,可以在 dkms.conf
配置文件中指定要使用的内核头文件的位置。如果您需要在不同的内核版本之间切换,可以使用 dkms
命令的 -k
选项指定要使用的内核版本,例如:
sudo dkms build -m module_name -v module_version -k 5.10.0-7-amd64
这将使用内核版本为 5.10.0-7-amd64 的头文件进行编译内核模块。
5,内核模块是通过 deb 包提供
如果内核模块是通过 deb 包提供的,可以使用 DKMS 将其编译为可在多个内核版本上运行的模块。以下是将 deb 包中的内核模块添加到 DKMS 中的步骤:
-
安装 deb 包:
sudo dpkg -i package_name.deb 其中,`package_name.deb` 是要安装的 deb 包的名称。
-
进入内核模块所在的目录,查看是否存在
dkms.conf
配置文件。如果不存在,需要手动创建。 -
在内核模块所在的目录中执行以下命令,将内核模块添加到 DKMS 中:
sudo dkms add -m module_name -v module_version 其中,`module_name` 是内核模块的名称,`module_version` 是内核模块的版本号。
-
构建和安装内核模块:
sudo dkms build -m module_name -v module_version sudo dkms install -m module_name -v module_version ```build` 命令用于构建内核模块,`install` 命令用于安装内核模块。
现在,内核模块已经成功添加到 DKMS 中,并且已经构建和安装到当前正在运行的内核版本中。如果需要在其他内核版本中使用该内核模块,可以使用 -k
选项指定要使用的内核版本,例如:
sudo dkms build -m module_name -v module_version -k 5.10.0-7-amd64
这将使用内核版本为 5.10.0-7-amd64 的头文件进行编译内核模块。
例子:
源码必须放在/usr/src/目录
/usr/src/megaraid_sas-07.721.02.00
dkms.conf
#
# Master copy of dkms.conf for megaraid_sas.
# Dont edit this file manually. Auto build script makes necessary changes.
#
PACKAGE_NAME="megaraid_sas"
PACKAGE_VERSION=07.721.02.00
MOD_PATH=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}
MAKE[0]="make -C ${kernel_source_dir} SUBDIRS=${MOD_PATH}/build modules"
CLEAN="make -C ${kernel_source_dir} SUBDIRS=${MOD_PATH}/build clean"
BUILT_MODULE_NAME[0]="megaraid_sas"
DEST_MODULE_LOCATION[0]="/kernel/drivers/scsi/megaraid/"
MODULES_CONF_ALIAS_TYPE[0]="scsi_hostadapter"
REMAKE_INITRD="yes"
Makefile
obj-m += megaraid_sas.o
megaraid_sas-objs := megaraid_sas_base.o megaraid_sas_fusion.o megaraid_sas_fp.o megaraid_sas_debugfs.o
dmks增加模块:
sudo dkms add -m megaraid_sas -v 07.721.02.00
自动创建: /var/lib/dkms/megaraid_sas/
sudo dkms status
megaraid_sas, 07.721.02.00, 4.15.18-20220228, aarch64: built
编译:
sudo dkms build -m megaraid_sas -v 07.721.02.00
最终生成在:
/var/lib/dkms/megaraid_sas/07.721.02.00/4.15.18-20220228/aarch64/module/
megaraid_sas.ko
如果要安装;
sudo dkms install -m megaraid_sas -v 07.721.02.00