kernel@dkms动态内核模块支持

DKMS(Dynamic Kernel Module Support)是 Linux 下一个用于自动管理内核模块的框架,特别适合第三方驱动或模块,比如 NVIDIA 驱动、ZFS、VirtualBox 的内核模块等。它的主要作用是让模块在内核升级后自动重新编译和安装,避免手动重编译的麻烦

一、DKMS 简介

作用

  • 在 Linux 内核升级后,自动重新编译和安装相应的内核模块。
  • 便于第三方驱动程序的发布和部署。
  • 使模块与多个内核版本兼容,便于开发和测试。

原理

DKMS 会将模块源码保存在一个专用目录(通常是 /usr/src/),并记录编译方式和配置。当系统内核变更后,它会根据这些信息自动为新内核编译模块。


二、安装 DKMS

在不同发行版下的安装方式如下:

1
2
3
4
5
6
7
8
# Debian / Ubuntu
sudo apt install dkms

# RHEL / CentOS / Fedora
sudo dnf install dkms # 或 sudo yum install dkms

# Arch Linux
sudo pacman -S dkms

三、DKMS 使用方法

1. 模块目录结构

假设你有一个模块叫 foo,版本为 1.0,你的源码目录应该是:

/usr/src/foo-1.0/
├── Makefile
├── foo.c
└── dkms.conf

2. dkms.conf 示例

1
2
3
4
5
PACKAGE_NAME="foo"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="foo"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"

注意:有些模块可能还需要定义 MAKECLEAN 命令。


四、基本操作命令

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
2
3
sudo dkms install -m foo -v 1.0

dkms install -m nvidia -v 570.124.06

4. 卸载模块

1
sudo dkms remove -m foo -v 1.0 --all

五、自动重建机制

当你升级内核时,dkms 会通过系统的 post-install 脚本(例如 /etc/kernel/postinst.d/)来自动重建模块,无需用户手动干预。


六、实际示例:管理 vboxdrv

1
2
sudo dkms status   # 查看所有 DKMS 管理的模块
sudo dkms install vboxhost/6.1.30 # 安装某个特定版本

七、总结

操作 命令
添加模块 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