OS兼容性weak-modules脚本修改方法

why涛2023-12-27openGauss

问题现象 ​

安装umdk-urma-kmod和umdk-urma-compat-ib-kmod依赖时,虽然安装成功,但是提示内核4.19.90-2012.5.0.0054.oe1.x86_64中的模块ubcore.ko与内核4.19.90-2109.1.0.0108.oe1.x86_64的符号不兼容,在使用modinfo和modprobe查看和加载ko文件时,无法找到ko文件。

  • 安装umdk-urma-kmod依赖:

    [root@localhost dlock]# rpm -ivh umdk-urma-kmod-1.3.0-206.3.0.B130.x86_64.rpm 
    Verifying...                          ################################# [100%]
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:umdk-urma-kmod-1.3.0-206.3.0.B130################################# [100%]
    /var/tmp/rpm-tmp.wSpThz: line 2: fg: no job control
    Module ubcore.ko from kernel 4.19.90-2012.5.0.0054.oe1.x86_64 is not compatible   with kernel 4.19.90-2109.1.0.0108.oe1.x86_64 in symbols: memcpy_s memset_s
    Module uburma.ko from kernel 4.19.90-2012.5.0.0054.oe1.x86_64 is not compatible   with kernel 4.19.90-2109.1.0.0108.oe1.x86_64 in symbols: snprintf_s
    
  • 安装umdk-urma-compat-ib-kmod依赖:

    [root@localhost dlock]# rpm -ivh umdk-urma-compat-ib-kmod-1.3.0-206.3.0.B130.x86_64.rpm 
    Verifying...                          ################################# [100%]
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:umdk-urma-compat-ib-kmod-1.3.0-20################################# [100%]
    Module uboib.ko from kernel 4.19.90-2012.5.0.0054.oe1.x86_64 is not compatible   with kernel 4.19.90-2109.1.0.0108.oe1.x86_64 in symbols: ib_destroy_cq_user ib_register_client ib_set_client_data ib_destroy_qp_user rdma_query_gid ib_query_port ib_unregister_client memcpy_s __ib_create_cq ib_dealloc_pd_user backport_dependency_symbol ib_query_qp strcpy_s __ib_alloc_pd memset_s ib_create_qp
    Created symlink /etc/systemd/system/multi-user.target.wants/uboib-module.service → /usr/lib/systemd/system/uboib-module.service.
    

问题原因 ​

uboib依赖于OFED,而OFED是系统安装后单独安装的,其符号是在“/lib/modules/当前内核版本/extra“下的,在安装RPM依赖时,weak-modules脚本运行中找不到其符号,使用系统默认的符号去和ubcore等对应,判断兼容性出错。

操作系统兼容性信息

表 1 操作系统兼容性信息

操作系统

存在兼容性问题

openEuler 20.03 SP1 x86

是

openEuler 20.03 SP1 Arm

是

openEuler 20.03 SP3 x86

否

openEuler 20.03 SP3 Arm

否

openEuler 20.03 LTS x86

否

openEuler 20.03 LTS Arm

否

openEuler 22.03 LTS x86

否

openEuler 22.03 LTS Arm

否

根本原因

urma内核版本和系统版本不匹配。

  • 使用rpm -ql umdk-urma-kmod命令查看urma编译使用的内核小版本。

    /etc/modules-load.d/ubcore.conf
    /etc/modules-load.d/uburma.conf
    /lib/modules/4.19.90-2012.5.0.0054.oe1.x86_64/extra/urma
    /lib/modules/4.19.90-2012.5.0.0054.oe1.x86_64/extra/urma/ubcore.ko
    /lib/modules/4.19.90-2012.5.0.0054.oe1.x86_64/extra/urma/uburma.ko
    /usr/include/umdk
    /usr/src/ubcore/Module.symvers
    
  • 使用uname -r查看系统小版本。

    4.19.90-2109.1.0.0108.oe1.x86_64
    

查询得知,urma编译使用的内核小版本和实际的系统小版本不匹配。

直接原因

没有正确获取到实际使用的ko文件进行兼容性判断,导致误判成不兼容。

weak-modules脚本判断是否兼容流程:

  1. 获取当前系统内核编译时的符号表,这里记为S-kernel。
  2. 获取“/lib/modules/$module_krel/extra“中额外ko文件的符号表,这里记为S-extra。
  3. 将前两步的符号表合并为S-all。
  4. 获取待检查的ko文件的符号表,这里记为S-target。
  5. 检查S-target中的所有符号是否能在S-all中找到匹配。
  • 如果S-target中的所有符号都能在S-all中找到,那么兼容性就判断为可兼容,则在“/lib/modules/$(uname -r)/weak-updates/“中创建原ko文件的符号链接。
  • 如果S-target中有符号不能在S-all中找到,那么兼容性将判断为不兼容,将会直接报错。处理方法请参见解决方法。

预防措施和规范建议 ​

在安装RPM包之前,先检查urma编译使用的内核小版本和实际的系统小版本,版本匹配后再进行安装操作。

如果不匹配,亦可参见解决方法处理。

解决方法 ​

将当前已RPM安装的ko文件加入S-all中进行符号依赖的判断。

  1. 登录服务器,打开weak-modules脚本文件。

    vi /sbin/weak-modules
    
  2. 在图片白色位置新增对应脚本。

    脚本如下:

    if type "nm" > /dev/null; then
        find -L /lib/modules/$krel -name '*.ko' \
        | xargs nm \
        | sed -nre 's:^[0]*([0-9a-f]{8}) A __crc_(.*):0x\1 \2:p'
    else
        for ko in `find -L /lib/modules/$krel -name '*.ko'`
        do
                modprobe --show-exports $ko 2>/dev/null
        done
    fi >> $tmpdir/symvers-$krel
    
  3. 保存之后重新执行安装操作。