![如何管理在 Debian 中从源代码构建的内核模块?](https://linux22.com/image/799561/%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E5%9C%A8%20Debian%20%E4%B8%AD%E4%BB%8E%E6%BA%90%E4%BB%A3%E7%A0%81%E6%9E%84%E5%BB%BA%E7%9A%84%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%EF%BC%9F.png)
我正在一台全新的 Mac Mini 上安装 Debian squeeze,其中的 Broadcom NIC 仅适用于Broadcom 的最新 tg3 模块。我可以很容易地构建这个模块,但执行手动构建并覆盖内核包附带的 tg3.ko 似乎是一个临时解决方案,因为:
- 我构建模块时执行的一些相当复杂的步骤并没有实现自动化
- 内核升级会覆盖我定制的模块,从而破坏以太网
我读了如何构建内核模块的 Debian 包?但到目前为止,我研究过的技术似乎都是针对打包模块的情况,不在内核包中. 假设我想替换内核包中已经提供的模块,而不是添加新模块,我该如何实现此目的而不诉诸脆弱的临时解决方案?
答案1
我能够使用 DKMS 来实现这一点。还有一个额外的问题,那就是不能破坏内核包中已经存在的 tg3.ko。我了解到,在 下可以有一个“更新”目录。/lib/modules/$KERNELVERSION
这样,我就不必担心覆盖另一个包的文件,而且还有一个简单的方法可以返回到默认版本。更多信息请见:
http://www.linuxvox.com/2009/10/update-kernel-modules-the-smart-and-safe-way/
这里有一个关于 DKMS 流程的很好的教程,它还描述了当 DKMS 模块将其模块放入 /updates 时的一些 Ubuntu/Debian 特定的魔法:
https://wiki.kubuntu.org/Kernel/Dev/DKMSPackaging
我用于此特定模块的 dkms.conf:
包名称="tg3" PACKAGE_VERSION="3.124c" BUILT_MODULE_NAME[0]="tg3" DEST_MODULE_LOCATION[0]="/更新" MAKE[0]="'make' KVER=$kernelver" 自动安装=“是”
这其中的困难部分是知道'make'
在 中引用$MAKE
,因为如果没有引用,DKMS 将附加KERNELRELEASE=...
到make
,这会破坏这个特定的构建系统。
我能够在 squeeze chroot 中完成所有构建,运行dkms mkdeb
,然后在 Mini 上安装生成的 deb 包以获得胜利。
答案2
查看知识管理系统。它可以在内核升级时重新编译内核模块。例如 nvidia 就使用这个。