![更新内核如何影响自定义模块?](https://linux22.com/image/830512/%E6%9B%B4%E6%96%B0%E5%86%85%E6%A0%B8%E5%A6%82%E4%BD%95%E5%BD%B1%E5%93%8D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%EF%BC%9F.png)
我很好奇当你跑步时会发生什么
sudo apt-get update && sudo apt-get upgrade
如果您安装了自定义内核模块。
是否有钩子可以重新安装自定义模块?模块是否完全不受升级的影响?
我之所以问这个问题,是因为每次升级时我都担心从源代码安装的模块会损坏。目前我还没有遇到任何问题,但我想了解更多关于通过常规更新更新内核时模块会发生什么情况的信息。
答案1
这确实取决于如何已安装此模块。知识管理系统是专门为针对新安装的内核进行自动重新编译而创建的。
普通内核模块只针对其编译的版本构建,并在更新后继续工作不是打破澳大利亚商业信息局。但是,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
在这里你可以看到我已经在 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
为了获得不支持 DKMS 的自定义内核模块,您需要自己进行一些“打包”,或者每次都必须重新编译。换句话说,“典型”的内核模块./configure; make; sudo make install
只会安装一个特定的内核模块,并且每次都需要您重新编译。
如果您不这样做,更新后将无法找到内核模块。它不会在旧目录中查找,如果您强制加载它,它可能会插入失败。如果安装覆盖了系统默认模块,它还可能会加载非自定义模块。
我不会在这里包含 DKMS 包装,因为我认为我现在已经回答了你的问题。