每次安装新内核时运行脚本

每次安装新内核时运行脚本

目前,每次获得新的内核版本时,我都必须从源代码重新编译无线驱动程序。我认为自动化这个过程是非常黑客行为,所以我将我的 Bash 构建脚本符号链接到/etc/kernel/postinst.d.我已经验证它确实在安装最新的内核更新时运行,但仍然存在一个问题:驱动程序针对现有运行的内核版本进行编译。

例如,如果我运行 3.0.0-14-generic 并apt-get dist-upgrade运行到内核 3.0.0-15-generic,那么它会针对内核 3.0.0-14-generic 进行编译,这对我根本没有帮助。

有没有办法从我的内核 postinst 脚本中得知已安装哪个版本的内核,以便我可以将其传递给我的make调用,以便可以为新安装的内核进行编译?

答案1

这并不是对您问题的实际答案,只是指向可能相关且有帮助的工具:


你有dkms安装了? (这里有一些信息, 这阿里奥斯页此刻看起来很沮丧。)如果我没有被误导的话,它应该就是这样做的。它需要适当的linux-headers软件包和要安装的模块/固件/类似软件包;它适用于所有已安装的linux-image软件包。(我不能说任何关于通用模块的事情,但是当我将它与非免费的 nvidia 模块一起使用时它工作得很好。)

这里还有更多链接, 喜欢联机帮助页本文linuxjournal.com它提供了该程序的非 Debian 生态系统中心解释。)

答案2

尽管dkms可能是答案,但我为您提供了一种方法,如果您不想参与该解决方案或其他复杂的解决方案,它可能会提供更简单的解决方案。

既然在重新启动并开始运行新内核之前您并不真正需要它,为什么不及时运行脚本(在下次启动时)呢?

你可以使用一些独立的东西,比如用于将命令排队仅在下次启动时运行,以及脚本/etc/kernel/postinst.d

答案3

如果您正在运行支持 DKMS 的发行版(就像大多数流行的发行版一样),dkms 确实是答案。如果您运行的发行版不使用 DKMS 或者您已经安装了自己的 Linux,请继续阅读。

问题在于该postinst.d钩子在重新启动之前被调用,uname仍然返回旧的内核版本。

该解决方案有点黑客,但考虑到整个问题都围绕着升级后预构建模块的黑客攻击,我确信这是可以的:)

您只需要枚举其中的文件/boot/(除非您正在运行一些极其深奥的设置,其中内核安装在其他地方),按 mdate 对内容进行排序,然后从最近安装的内核中提取内核版本,如下所示:

KVERSION=$(ls -at /boot | sed -n 's/^vmlinuz-//;t p;b;:p;p;q')
# KVERSION will hold some value like 4.19.0-10-arm64

(这假设内核被压缩并安装为/boot/vmlinuz-${KVERSION}

答案4

新安装/重新安装的内核版本将传递给所有 postinst.d 脚本,或者至少 Fedora 和 Redhat 及其衍生版本是这样。当您在 bash 中读取第一个传递给普通脚本的参数时,您会读取该值:

kernel_ver = ${1}
...

传递的值与运行时得到的值相同uname -r

我刚刚测试了它,传递的值是6.6.9-200.fc39.x86_64我用来编译驱动程序的值。

相关内容