kernel@dkms动态内核模块支持
DKMS
(Dynamic Kernel Module Support)是 Linux 下一个用于自动管理内核模块的框架,特别适合第三方驱动或模块,比如 NVIDIA 驱动、ZFS、VirtualBox 的内核模块等。它的主要作用是让模块在内核升级后自动重新编译和安装,避免手动重编译的麻烦。
一、DKMS 简介
作用
- 在 Linux 内核升级后,自动重新编译和安装相应的内核模块。
- 便于第三方驱动程序的发布和部署。
- 使模块与多个内核版本兼容,便于开发和测试。
原理
DKMS 会将模块源码保存在一个专用目录(通常是 /usr/src/
),并记录编译方式和配置。当系统内核变更后,它会根据这些信息自动为新内核编译模块。
二、安装 DKMS
在不同发行版下的安装方式如下:
1 | # Debian / Ubuntu |
三、DKMS 使用方法
1. 模块目录结构
假设你有一个模块叫 foo
,版本为 1.0
,你的源码目录应该是:
/usr/src/foo-1.0/
├── Makefile
├── foo.c
└── dkms.conf
2. dkms.conf
示例
1 | PACKAGE_NAME="foo" |
注意:有些模块可能还需要定义
MAKE
或CLEAN
命令。
四、基本操作命令
dkms help
[root@develop03 ~]# dkms --help
Usage: /usr/sbin/dkms [action] [options]
### action
[action] = { add | remove | build | unbuild | install | uninstall | match |
autoinstall | mktarball | ldtarball | status | generate_mok |
kernel_preinst | kernel_postinst | kernel_prerm }
### options
[options] = [-m module] [-v module-version] [-k kernel-version] [-a arch]
[-c dkms.conf-location] [-q] [--force] [--force-version-override] [--all]
[--templatekernel=kernel] [--directive='cli-directive=cli-value']
[--config=kernel-include/config/auto.conf-location] [--archive=tarball-location]
[--kernelsourcedir=source-location] [--rpm_safe_upgrade]
[--dkmstree path] [--sourcetree path] [--installtree path]
[--binaries-only] [--source-only] [--verbose]
[--no-depmod] [--modprobe-on-install] [-j number] [--version] [--help]
1. 添加模块到 DKMS 管理
1 | sudo dkms add -m foo -v 1.0 |
2. 编译模块
1 | sudo dkms build -m foo -v 1.0 |
3. 安装模块
(nvidia-driver)一步到位,自动处理添加/编译模块
1 | sudo dkms install -m foo -v 1.0 |
4. 卸载模块
1 | sudo dkms remove -m foo -v 1.0 --all |
五、自动重建机制
当你升级内核时,dkms
会通过系统的 post-install
脚本(例如 /etc/kernel/postinst.d/
)来自动重建模块,无需用户手动干预。
六、实际示例:管理 vboxdrv
1 | sudo dkms status # 查看所有 DKMS 管理的模块 |
七、总结
操作 | 命令 |
---|---|
添加模块 | dkms add -m <name> -v <version> |
构建模块 | dkms build -m <name> -v <version> |
安装模块 | dkms install -m <name> -v <version> |
移除模块 | dkms remove -m <name> -v <version> --all |
查看状态 | dkms status |