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 的基本步骤
-
安装 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
-
-
准备内核模块源代码:
将内核模块的源代码放置在
/usr/src/<module_name>-<module_version>/目录下,并确保包含dkms.conf文件。 -
添加模块到 DKMS:
使用
dkms add命令将模块添加到 DKMS 管理中。例如:sudo dkms add -m example_module -v 1.0 -
构建并安装模块:
使用
dkms build和dkms install命令编译并安装模块:sudo dkms build -m example_module -v 1.0 sudo dkms install -m example_module -v 1.0如果
AUTOINSTALL设置为"yes",则在添加模块时也会自动构建和安装。 -
验证模块是否正确安装:
使用
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 定义了编译和清理模块的具体命令。
注意事项
- 正确填写路径和命令:确保
MAKE和CLEAN字段中的路径和命令与实际源码和构建系统相匹配。 - 版本匹配:
PACKAGE_VERSION应与模块源代码的版本一致,避免版本冲突。 - 权限:通常需要以超级用户权限运行 DKMS 相关命令,以便正确安装和管理模块。
- 模块依赖:如果模块依赖其他模块或库,确保这些依赖也已正确安装和配置。
通过正确配置 dkms.conf 文件,DKMS 能够有效地管理内核模块的编译和安装,极大地简化了模块维护和系统升级的过程。
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/18934802

浙公网安备 33010602011771号