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

  1. dkms add:将内核模块源代码添加到 DKMS 中,使其可以自动构建和安装。

    sudo dkms add -m module_name -v module_version
    其中,`module_name` 是内核模块的名称,`module_version` 是内核模块的版本号。
  2. 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
  3. dkms install:使用 DKMS 安装内核模块。

    sudo dkms install -m module_name -v module_version
    此命令将会在 DKMS 管理的所有内核版本上安装指定的内核模块。
  4. dkms remove:从 DKMS 中删除内核模块。

    sudo dkms remove -m module_name -v module_version --all
    此命令将会从 DKMS 中删除指定的内核模块,并删除相关的文件。使用 `--all` 选项可以删除 DKMS 中所有安装的版本。
  5. dkms status:显示已安装的内核模块及其状态。

    sudo dkms status
    此命令将会列出所有已安装的内核模块及其状态,例如构建状态、安装状态、错误状态等等。
  6. dkms mktarball:创建内核模块的源代码压缩包。

    sudo dkms mktarball -m module_name -v module_version
    此命令将会创建指定内核模块的源代码压缩包,可以用于备份或分发。
  7. dkms mkdeb:创建 Debian 软件包。

    sudo dkms mkdeb -m module_name -v module_version
    此命令将会创建一个 Debian 软件包,包含指定的内核模块和相关文件。
  8. 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 中的步骤:

  1. 安装 deb 包:

    sudo dpkg -i package_name.deb
    其中,`package_name.deb` 是要安装的 deb 包的名称。
  2. 进入内核模块所在的目录,查看是否存在 dkms.conf 配置文件。如果不存在,需要手动创建。

  3. 在内核模块所在的目录中执行以下命令,将内核模块添加到 DKMS 中:

    sudo dkms add -m module_name -v module_version
    其中,`module_name` 是内核模块的名称,`module_version` 是内核模块的版本号。
    
  4. 构建和安装内核模块:

    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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐