• broadcom Ethernet BCM57412 驱动更新记录(dkms方式)


    一 背景

    现场Dell R740xd2机器使用网卡Broadcom 57412 10Gb SFP+,固件版本22.21.06.80。bnxt_en.ko内核模块是该网卡的驱动,我们默认的驱动版本为1.8.0,而固件版本22.21.06.80需要1.10.2的driver。

    本文主要是记录一些操作步骤,后续出现类似驱动过旧的问题可以快速解决。

    二 临时解决

    1. 现场通过下载Broadcom官方提供的tar包在生产节点上直接make编译出新的bnxt_en.ko
    2. 替换/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_en.ko
    3. 通过modprobe -r bnxt_enmodprobe bnxt_en重新加载新的模块,可以通过modinfo bnxt_en查看module的信息
    4. 使用depmod -a更新module加载的依赖
    5. bnxt_en.ko是网络驱动,在内核init on initramfs 阶段就需要加载,因此还要执行update-initramfs -u来更新initramfs image。

    三 长久解决

    3.1 backport内核代码(失败)

    1. 1.10.2的驱动在linux内核6.1中才有支持,而我们的内核版本是4.14,尝试直接cherry-pick,冲突过多失败。
    2. 下载并解压红帽4.10内核的iso,替换broadcom/bnxt_en目录下相关文件进行编译。这里记录下编译方式,整体编译内核速度过慢,我们可以在编译环境编译某一个modules:
      1. 复制/usr/src/$(uname -r)/Module.symvers到编译的内核目录drivers/net/ethernet/broadcom/bnxt/下面
      2. 执行make modules SUBDIRS=drivers/net/ethernet/broadcom/bnxt就可以编译啦

    结果同样差距太多,很多改动涉及到公共文件的接口,故放弃。

    3.2 dkms(成功)

    既然使用源码包可以直接在4.14内核环境上进行编译,那使用dkms(Dynamic Kernel Module Support)来在需要的时候编译安装是一个不错的选择,而且bnxt_en体量小,编译很快,安装系统时不会占用太多时间。

    制作dkms的deb包

    解压netxtreme-bnxt_en-1.10.2-224.0.157.0.tar源码包,目录结构如下:

    drwxrwxr-x  4 18896 dialout 4096 Mar 29 11:59 ./
    drwxr-xr-x 18 root  root    4096 Mar 27 18:03 ../
    lrwxrwxrwx  1 18896 dialout   27 Nov  3 04:25 bnxt_en -> bnxt_en-1.10.2-224.0.157.0//
    drwxrwxr-x  5 18896 dialout 4096 Mar 30 10:01 bnxt_en-1.10.2-224.0.157.0/
    lrwxrwxrwx  1 18896 dialout   20 Nov  3 04:25 bnxt_re -> bnxt_re-224.0.157.0//
    drwxrwxr-x  2 18896 dialout 4096 Mar 27 19:08 bnxt_re-224.0.157.0/
    -rw-r--r--  1 root  root     309 Mar 27 19:12 dkms.conf
    -rw-rw-r--  1 18896 dialout  537 Mar 27 17:18 Makefile
    

    其中dkms.conf是我们创建并加入的,内容如下:

    PACKAGE_NAME="netxtreme-bnxt_en"
    PACKAGE_VERSION="1.10.2"
    CLEAN="make clean"
    MAKE="make"
    BUILT_MODULE_NAME[0]="bnxt_en"
    BUILT_MODULE_NAME[1]="bnxt_re"
    BUILT_MODULE_LOCATION[0]="bnxt_en"
    BUILT_MODULE_LOCATION[1]="bnxt_re"
    DEST_MODULE_LOCATION[0]="/updates"
    DEST_MODULE_LOCATION[1]="/updates"
    AUTOINSTALL="yes"
    

    根据dkms的要求,我们需要将源码包移到/usr/src目录下,即当前源码包路径/usr/src/netxtreme-bnxt_en-1.10.2

    • PACKAGE_NAME:指定要编译和安装的模块的名称
    • PACKAGE_VERSION:模块版本
    • CLEAN:删除先前编译生成的内核模块文件和相关构建文件
    • MAKE:根据Makefile编译
    • BUILT_MODULE_NAME:模块名,也就是编译出来的bnxt_en.ko
    • BUILT_MODULE_LOCATION:存放的位置,这里是/usr/src/netxtreme-bnxt_en-1.10.2/bnxt_en/
    • DEST_MODULE_LOCATION:将模块放到内核目录的哪个文件夹下,这里是/lib/modules/$(uname -r)/updates
    • AUTOINSTALL:安装完毕后自动加载该模块

    接下来就可以验证dkms是否可以使用了,以下指令:

    # 可以查看当前的dkms模块的情况
    dkms status
    
    # 添加到dkms树,此时是added状态
    dkms add -m netxtreme-bnxt_en -v 1.10.2
    # 编译,成功是built状态
    dkms build -m netxtreme-bnxt_en -v 1.10.2
    # 安装,成功是installed状态
    dkms install -m netxtreme-bnxt_en -v 1.10.2
    
    # 其他指令
    # 移除
    dkms remove netxtreme-bnxt_en/1.10.2 --all
    # 打包deb
    dkms mkdeb netxtreme-bnxt_en/1.10.2
    # 查看module信息
    modinfo bnxt_en
    # 重新生成module加载依赖关系
    depmod -a
    # 加载module
    modprobe bnxt_en
    # 移除module
    modprobe -r bnxt_en
    

    根据dkms status确定dkms安装没有问题,再通过modinfo确认module的信息没问题后,我们就可以将dkms模块打包成deb(ubuntu)了,指令dkms mkdeb netxtreme-bnxt_en/1.10.2,我们可以得到一个名为netxtreme-bnxt-en-dkms_1.10.2_all.deb的deb,这样就可以在安装系统或升级阶段进行安装了。

    其他问题

    如果制作好的deb存在问题,需要在安装前后做一些清理或加载的工作后才能工作。这个时候可以将netxtreme-bnxt-en-dkms_1.10.2_all.deb解开,具体操作如下:

    # 创建工作目录
    mkdir -p extract/DEBIAN && mkdir build
    
    # 提取deb控制文件
    dpkg -e netxtreme-bnxt-en-dkms_1.10.2_all.deb extract/DEBIAN
    
    # 提取源文件
    dpkg -x netxtreme-bnxt-en-dkms_1.10.2_all.deb extract/
    
    

    提取后extract目录结构如下:

    .
    ├── DEBIAN
    │   ├── control
    │   ├── md5sums
    │   ├── postinst
    │   └── prerm
    └── usr
        ├── share
        │   └── netxtreme-bnxt_en-dkms
        │       ├── netxtreme-bnxt_en-1.10.2.dkms.tar.gz
        │       └── postinst
        └── src
    

    我们通过DEBIAN内的文件对deb安装前或安装后进行配置,常用的有preinst、postinst、prerm 和 postrm

    • preinst 脚本在软件包被安装之前运行,通常用来检查一些先决条件或配置
    • postinst 脚本在软件包安装完成后运行,通常进行配置更新加载等操作
    • prerm和postrm脚本通常对软件包卸载前后做停止服务,清除信息等操作

    制作好控制文件后使用指令dpkg-deb -b extract/ build在build目录下重新生成netxtreme-bnxt-en-dkms_1.10.2_all.deb软件包。

  • 相关阅读:
    周记之学习总结
    2.05_python+Django+mysql实现pdf转word项目_项目开发-表结构设计
    Spring结合自定义注解实现 AOP 切面功能【详解】
    一场由Integer引发的血案
    电脑技巧:Win10自带的6个实用功能,你都会用吗
    DNSlog漏洞探测
    Java注解
    [Cocos 3.5.2]开启模型合批
    VL36-状态机-重叠序列检测;设计一个状态机,用来检测序列1011.
    八、面向对象 之 封装
  • 原文地址:https://www.cnblogs.com/tongh/p/17274584.html