![每次安装新内核时运行脚本](https://linux22.com/image/20520/%E6%AF%8F%E6%AC%A1%E5%AE%89%E8%A3%85%E6%96%B0%E5%86%85%E6%A0%B8%E6%97%B6%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
目前,每次获得新的内核版本时,我都必须从源代码重新编译无线驱动程序。我认为自动化这个过程是非常黑客行为,所以我将我的 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
答案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
我用来编译驱动程序的值。