更新内核如何影响自定义模块?

Cau*_*tic 6 upgrade apt kernel

我很好奇你跑步时会发生什么

sudo apt-get update && sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

如果您安装了自定义内核模块。

是否有钩子可以重新安装您的自定义模块?模块是否完全不受升级影响?

我这样问是因为每次升级时我都担心我从源代码安装的模块会损坏。目前我还没有遇到任何问题,但我想了解更多有关通过定期更新更新内核时模块会发生什么的信息。

ger*_*ijk 5

这实际上取决于如何安装这个模块。DKMS的机制是专门为针对安装的新内核自动重新编译而创建的。

普通内核模块仅针对它们编译的版本构建,并在更新破坏ABI时继续工作。但是,Ubuntu 更新似乎经常破坏 ABI,并且需要重新编译内核模块。由于这是一项非常无聊和重复的任务,因此发明了 DKMS 来克服这个问题。它在 APT 中插入钩子来触发编译和安装新版本。

查看当前使用 DKMS 安装的内核模块(示例):

dkms status
nvidiabl, 0.79, 3.5.0-22-generic, x86_64: installed
nvidiabl, 0.79, 3.7.5-030705-generic, x86_64: installed
nvidia-current, 313.09, 3.5.0-22-generic, x86_64: installed
nvidia-current, 313.09, 3.7.5-030705-generic, x86_64: installed
vboxhost, 4.2.6, 3.5.0-22-generic, x86_64: installed
vboxhost, 4.2.6, 3.7.5-030705-generic, x86_64: installed
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到我在DKMS中安装了一些内核模块,只有nvidiabl我自己一个,其他的都是由Nvidia驱动包和Virtualbox包安装的。

这些模块位于(安装)在每个内核版本的特定目录中:

/lib/modules/
??? 3.5.0-22-generic
?   ??? build -> /usr/src/linux-headers-3.5.0-22-generic
?   ??? initrd
?   ??? kernel
?   ?   ??? arch
?   ?   ??? crypto
?   ?   ??? drivers
?   ?   ??? fs
?   ?   ??? lib
?   ?   ??? net
?   ?   ??? sound
?   ?   ??? ubuntu
?   ??? updates
?       ??? dkms
??? 3.7.5-030705-generic
    ??? build -> /usr/src/linux-headers-3.7.5-030705-generic
    ??? initrd
    ??? kernel
    ?   ??? arch
    ?   ??? crypto
    ?   ??? drivers
    ?   ??? fs
    ?   ??? lib
    ?   ??? mm
    ?   ??? net
    ?   ??? sound
    ??? updates
        ??? dkms
Run Code Online (Sandbox Code Playgroud)

为了获得不支持 DKMS 的自定义内核模块,它需要一些“打包”,您必须自己做,而且每次都必须自己重新编译。换句话说,“典型”./configure; make; sudo make install只会安装一个特定的内核模块,并且每次都需要您重新编译它。

如果你不这样做,内核模块将在更新后根本找不到。它不会在旧目录中查找,如果您强制加载它,它可能无法插入。如果安装覆盖了系统默认安装,它也可能加载非自定义安装。

我不会在这里包含 DKMS 包装,因为我想我现在已经回答了您的问题。