我已经安装了一个模块,acpi_call,与make && sudo make install
。问题是当我升级内核时模块不再安装,我必须make install
重新安装。为什么其他模块没有发生这种情况?我该如何避免这种情况?
答案1
acpi_call
不是常规程序,而是内核模块。内核模块必须编译为特定内核版本,否则将被视为不兼容且不会加载。
DKMS
(动态内核管理系统)将管理您的自定义内核模块并在当前运行的内核版本中重新编译它们,并在您下载新版本时自动执行此操作。它还将更新作为initrd
引导加载程序进程(昵称 boot)的一部分。一个独特的初始化文件位于/boot
您安装的每个唯一内核版本的目录中。
作为凯尔特勇士指出您可以在以下位置阅读 Ubuntu 的详细安装说明:help.ubuntu.com/community/DKMS。
项目页面本身位于:linux.dell.com/dkms/它还包含一些您会觉得有用的附加链接。
我用了知识管理系统用于保持EnhanceIO
(以前用于 Facebook 服务器的 HDD 到 SSD 缓存程序)处于最新状态。知识管理系统自动为各种内核版本编译,并且运行良好。请注意错误消息,因为参数可能会因内核版本而异,并且可能需要新的源代码补丁github
。
对于感兴趣的读者来说,编译内核模块的想法一开始似乎令人生畏,但是,一旦你进入这个状态,你就会感到舒服。
答案2
谢谢大家,我解决了。
使用CelticWarrior 链接的示例,我创建了这个dkms.conf
文件:
MAKE[0]="make"
CLEAN="make clean"
BUILT_MODULE_NAME[0]=acpi_call
# BUILT_MODULE_LOCATION[0]=./
DEST_MODULE_LOCATION[0]="/extra"
PACKAGE_NAME=acpi_call
PACKAGE_VERSION=1.0
REMAKE_INITRD=yes
DEST_MODULE_LOCATION
man dkms
尽管有示例,但如中所述是必需的。
然后我复制源代码/usr/src/acpi_call-1.0
并使用以下命令进行安装:
sudo dkms install -m acpi_call -v 1.0
另请参阅kernel.org 有关外部模块的文档- 它记录了创建用于构建和安装外部模块的 makefile 的正确方法,并且它说明外部模块的正确位置位于子目录下extra
。