DKMS
Dynamic Kernel Module Support (DKMS) 是一个用于动态管理 Linux 内核模块的框架。它能够在内核升级时自动重新编译和安装相应的内核模块,以保证其与新内核版本的兼容性。本文档将介绍 DKMS 的使用方法和基本原理。
背景
我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件,按部就班的执行几条命令还是很容易办到的。但这里还有一个问题,Linux模块和内核是有依赖关系的,如果遇到因为发行版更新造成的内核版本的变动,之前编译的模块是无法继续使用的,我们只能手动再编译一遍。这样重复的操作有些繁琐且是反生产力的,而对于没有内核编程经验的使用者来说可能会造成一些困扰,使用者搞不清楚为什么更新系统之后,原来用的好好的驱动程序突然就不能用了。这里,就是Dell创建的DKMS项目的意义所在。
DKMS和RPM区别
DKMS和RPM都是与Linux系统相关的软件包管理技术,但它们有不同的作用和用途。
-
DKMS(Dynamic Kernel Module Support):如前所述,DKMS是用于动态管理内核模块的框架。它主要用于在Linux系统中编译、安装和管理第三方或自定义的内核模块。通过DKMS,可以确保内核模块在内核升级时自动重新编译和安装,以保持其与新内核版本的兼容性。DKMS适用于需要频繁更新内核或使用特定内核模块的情况。
-
RPM(Red Hat Package Manager):RPM是一种常用的软件包管理工具,用于在基于Red Hat的Linux发行版(如Red Hat Enterprise Linux、Fedora等)中管理软件包。RPM主要用于安装、升级、删除和查询软件包,以及解决软件包之间的依赖关系。RPM使用
.rpm
文件作为软件包的打包格式,可以通过命令行或图形界面工具进行操作。RPM适用于管理整个操作系统中的软件包,包括系统工具、库文件、应用程序等。
DKMS和RPM分别用于管理内核模块和软件包,它们在功能和应用场景上有所区别。DKMS主要用于动态管理内核模块,而RPM主要用于管理整个操作系统中的软件包。
安装 DKMS
在大多数 Linux 发行版中,DKMS 已经作为一个软件包提供,可以通过包管理器进行安装。以下是一些常见发行版的安装命令示例:
- Ubuntu/Debian:
sudo apt-get install dkms
- Fedora/RHEL:
sudo dnf install dkms
创建 DKMS 包
- 检查是否存在
/usr/src
目录,如果不存在则创建:
sudo mkdir -p /usr/src
- 创建新的 DKMS 包目录:
sudo mkdir -p /usr/src/<package_name>-<package_version>
- 进入新创建的目录:
cd /usr/src/<package_name>-<package_version>
- 编写
dkms.conf
文件,指定包的相关信息和编译规则:
sudo nano dkms.conf
示例 dkms.conf
文件内容:
PACKAGE_NAME="<package_name>"
PACKAGE_VERSION="<package_version>"
BUILT_MODULE_NAME="<module_name>"
DEST_MODULE_LOCATION="/kernel/drivers/<module_name>"
AUTOINSTALL="yes"
- 将模块源代码复制到 DKMS 包目录中:
sudo cp -R <module_source_directory>/* /usr/src/<package_name>-<package_version>/
- 添加 DKMS 包到 DKMS 框架中:
sudo dkms add -m <package_name> -v <package_version>
- 编译和安装内核模块:
sudo dkms build -m <package_name> -v <package_version>
sudo dkms install -m <package_name> -v <package_version>
更新 DKMS 包
当需要更新内核模块时,可以按以下步骤进行操作:
- 进入 DKMS 包目录:
cd /usr/src/<package_name>-<package_version>
- 更新模块源代码:
sudo cp -R <new_module_source_directory>/* /usr/src/<package_name>-<package_version>/
- 重新编译和安装内核模块:
sudo dkms build -m <package_name> -v <package_version>
sudo dkms install -m <package_name> -v <package_version>
删除 DKMS 包
如果需要删除一个 DKMS 包,可以按以下步骤进行操作:
- 移除 DKMS 包:
sudo dkms remove -m <package_name> -v <package_version> --all
- 删除相关的源代码目录:
sudo rm -rf /usr/src/<package_name>-<package_version>
- 清理已编译的模块:
sudo rm -rf /var/lib/dkms/<package_name>/<package_version>/
结论
DKMS 提供了一种方便的方式来管理和维护 Linux 内核模块,使得其与当前正在运行的内核版本保持同步。