DKMS的使用方法

DKMS 是一个框架,旨在在内核更新时自动重新构建和安装内核模块,确保这些模块始终与当前运行的内核版本兼容。dkms.conf 是用于 DKMS(Dynamic Kernel Module Support,动态内核模块支持) 的配置文件。这对于那些需要自定义内核模块或依赖外部模块的系统尤为重要,如某些显卡驱动、虚拟机驱动等。

dkms.conf 的主要功能

  • 自动化:在内核升级时,DKMS 会根据 dkms.conf 文件中定义的指令自动编译和安装相关模块。
  • 兼容性:确保第三方或自定义内核模块在内核升级后依然可用,避免系统功能异常。
  • 版本管理:允许同时维护多个版本的内核模块,方便在需要时进行回滚或切换。

dkms.conf 文件的位置

通常,dkms.conf 文件位于内核模块源代码的根目录中。例如:

/usr/src/<module_name>-<module_version>/dkms.conf

dkms.conf 文件的基本结构

dkms.conf 文件使用简单的键值对格式来定义模块的构建和安装方式。以下是一个典型的 dkms.conf 文件示例及其各部分说明:

PACKAGE_NAME="example_module"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="example"
DEST_MODULE_LOCATION[0]="/extra"
AUTOINSTALL="yes"

MAKE[0]="make KVER=${kernelver}"
CLEAN="make clean"

# 可选的源代码文件列表
# SOURCES="."

# 支持的内核版本(可选)
# ONLY_BUILT_MODULES="yes"

# 事件钩子(可选)
# PRE_BUILD="scripts/pre_build.sh"
# POST_BUILD="scripts/post_build.sh"

关键字段说明

  • PACKAGE_NAME:模块的名称。通常与模块源代码目录名称一致。
  • PACKAGE_VERSION:模块的版本号。
  • BUILT_MODULE_NAME:编译后生成的模块名称。可以有多个,使用数组索引 [0][1] 等标识。
  • DEST_MODULE_LOCATION:模块安装的目标路径,相对于内核模块目录(通常是 /lib/modules/$(uname -r)/)。同样,可以有多个,使用数组索引对应 BUILT_MODULE_NAME
  • AUTOINSTALL:设置为 "yes" 表示在内核升级时自动安装该模块。
  • MAKE:定义编译模块的命令。可以包含多个变量,如 KVER 指定内核版本。
  • CLEAN:定义清理构建环境的命令。
  • SOURCES:指定源代码文件的位置,默认为当前目录。
  • ONLY_BUILT_MODULES:如果设置为 "yes",则仅构建 BUILT_MODULE_NAME 中指定的模块,而忽略其他模块。
  • PRE_BUILD / POST_BUILD:在构建前后执行的脚本,用于执行自定义任务。

使用 DKMS 及 dkms.conf 的基本步骤

  1. 安装 DKMS

    确保系统已安装 DKMS。根据不同的 Linux 发行版,可以使用以下命令安装:

    • Debian/Ubuntu

      sudo apt-get update
      sudo apt-get install dkms
      
    • CentOS/RHEL

      sudo yum install dkms
      
    • Arch Linux

      sudo pacman -S dkms
      
  2. 准备内核模块源代码

    将内核模块的源代码放置在 /usr/src/<module_name>-<module_version>/ 目录下,并确保包含 dkms.conf 文件。

  3. 添加模块到 DKMS

    使用 dkms add 命令将模块添加到 DKMS 管理中。例如:

    sudo dkms add -m example_module -v 1.0
    
  4. 构建并安装模块

    使用 dkms builddkms install 命令编译并安装模块:

    sudo dkms build -m example_module -v 1.0
    sudo dkms install -m example_module -v 1.0
    

    如果 AUTOINSTALL 设置为 "yes",则在添加模块时也会自动构建和安装。

  5. 验证模块是否正确安装

    使用 dkms status 查看模块的状态:

    dkms status
    

示例:实际 dkms.conf 文件

假设你有一个名为 hello_module 的内核模块,版本为 1.0,其 dkms.conf 文件如下:

PACKAGE_NAME="hello_module"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="hello"
DEST_MODULE_LOCATION[0]="/kernel/drivers/char"
AUTOINSTALL="yes"

MAKE[0]="make -C /lib/modules/${kernelver}/build M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION} modules"
CLEAN="make -C /lib/modules/${kernelver}/build M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION} clean"
  • PACKAGE_NAME 设置为模块名称 hello_module
  • PACKAGE_VERSION 设置为版本 1.0
  • BUILT_MODULE_NAME[0] 指定编译后生成的模块名为 hello
  • DEST_MODULE_LOCATION[0] 指定模块安装在 /kernel/drivers/char 目录下。
  • AUTOINSTALL 设置为 "yes",表示自动安装。
  • MAKE[0]CLEAN 定义了编译和清理模块的具体命令。

注意事项

  • 正确填写路径和命令:确保 MAKECLEAN 字段中的路径和命令与实际源码和构建系统相匹配。
  • 版本匹配PACKAGE_VERSION 应与模块源代码的版本一致,避免版本冲突。
  • 权限:通常需要以超级用户权限运行 DKMS 相关命令,以便正确安装和管理模块。
  • 模块依赖:如果模块依赖其他模块或库,确保这些依赖也已正确安装和配置。

通过正确配置 dkms.conf 文件,DKMS 能够有效地管理内核模块的编译和安装,极大地简化了模块维护和系统升级的过程。

posted @ 2025-06-18 15:29  闹闹爸爸  阅读(333)  评论(0)    收藏  举报