跳转到内容

在 Ubuntu 上使用 DKMS 构建内核模块

本文介绍 DKMS 的使用与手动内核模块构建步骤,并提供具体命令。DKMS 会在内核更新时自动重建已注册的模块。

Terminal window
sudo apt update
sudo apt install -y dkms build-essential linux-headers-$(uname -r)

确保头文件与 uname -r 输出一致。

~/projects/hellomodule/ 中创建最小模块:

hellomodule.c

#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void){ printk(KERN_INFO "hello loaded\n"); return 0; }
static void __exit hello_exit(void){ printk(KERN_INFO "hello unloaded\n"); }
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

Makefile

obj-m += hellomodule.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

构建并加载:

Terminal window
make
sudo insmod hellomodule.ko
dmesg | tail
sudo rmmod hellomodule

/usr/src/yourmod-1.0/ 放置源代码并创建 dkms.conf,最小示例:

PACKAGE_NAME="yourmod"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="yourmod"
DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
AUTOINSTALL="yes"

注册并使用 DKMS 构建:

Terminal window
sudo dkms add -m yourmod -v 1.0
sudo dkms build -m yourmod -v 1.0
sudo dkms install -m yourmod -v 1.0

DKMS 会在 /var/lib/dkms/yourmod/1.0/ 存储构建结果,并在内核更新时自动重建。

卸载:

Terminal window
sudo dkms remove -m yourmod -v 1.0 --all
  1. 查看构建日志:/var/lib/dkms/<module>/<version>/build/make.log
  2. 确保已安装匹配的 linux-headers-$(uname -r)
  3. 若内核升级后 DKMS 构建失败,手动运行 dkms build 查看错误,并修复缺失符号或 API 变更。
  4. 使用 dkms status 列出已安装模块及其状态。