制作镜像包时遇到的模块加载错误的问题

最近遇到一个问题,定制的一个镜像包,在启动后,发现有些内核模块加载是错误的,有些是正确的。使用modinfo去查询,可以看到加载的为内核版本中的模块(非自己定制的模块),而有些自己新增的模块没有加载成功。

这个问题也折腾了一两天的时间,最开始时排查做包日志,发现在安装rpm包时,%post后面的depmod都没有生效,报了如下错误:

Installing : openvswitch-kmod-2.7.x86_64                                                                                                                             40/340
depmod: ERROR: could not open directory /lib/modules/3.10.0.28_20.x86_64: No such file or directory
depmod: FATAL: could not search modules: No such file or directory
warning: %post(openvswitch-kmod-2.7.x86_64) scriptlet failed, exit status 1
Non-fatal POSTIN scriptlet failure in rpm package openvswitch-kmod-2.7.x86_64

为什么会报这个错误呢?

/lib/modules/3.10.0.28_20.x86_64

这个路径,3.10.0.28_20为当前做包环境的内核版本,镜像包中的内核版本为3.10.0.28_21,在做镜像时有执行chroot操作,所以在镜像的当前目录中是没有/lib/modules/3.10.0.28_20.x86_64这个目录的。看来depmod执行时并不能很聪明的知道已经做过chroot操作。

因为获取的都为做包环境中的内核版本,而非镜像包中的内核版本。这样,即使每个rpm包都执行了depmod,但是在镜像包中却没有生成正确的modules.dep,即模块依赖关系是错误的,所以用modinfo查询也是错的。

经过仔细排查,将几个版本的做包日志打出来,发现每次出现加载错误的模块有略微差异,好像在某个包之前安装的包模块加载都正确,在某个包之后安装的包模块加载就是错误的。后来经过排查分析比对,锁定在了AXX包,果然,这个包里有如下操作:

echo "/lib/modules/%{kern_devel_ver}/extra/xx.ko" | /sbin/weak-modules --add-module --no-initramfs

而这个操作也会更新modules.dep。在安装了这个包后,镜像包中的modules.dep就发生了更新,在这个包之前安装的包,其模块都生成了正确的关系列表。而在这个包之后,再没哪个包在安装后会更新moduels.dep的,所以在这个包之后安装的rpm包,模块都没有加载正确。

原文地址:https://www.cnblogs.com/xingmuxin/p/9132225.html