一 背景

现场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软件包。

broadcom Ethernet BCM57412 驱动更新记录(dkms方式)的更多相关文章

  1. Dell R410 broadcom网卡驱动更新失败

    问题描述: 最近遇到一个Dell R410 broadcom网卡驱动更新失败的问题.从官网上下载的驱动在安装的过程中都会自己回滚回来,很是困惑. 尝试解决: Dell官网现在提供的驱动一般最少有两种格 ...

  2. Dynamics CRM 通过Odata创建及更新记录各类型字段的赋值方式

    CRM中通过Odata方式去创建或者更新记录时,各种类型的字段的赋值方式各不相同,这里转载一篇博文很详细的列出了各类型字段赋值方式,以供后期如有遗忘再次查询使用. http://luoyong0201 ...

  3. mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样

    Mybatis批量更新数据 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批 ...

  4. Dynamics CRM2016 Web API之更新记录

    本篇继续探索web api,介绍如何通过web api更新记录. 下面是一段简单的更新代码,更新了几个不同类型的字段,entity的赋值和前篇创建时候的一样的. var entity = {}; en ...

  5. Ubuntu 18.04 安装博通(Broadcom)无线网卡驱动

    目录 Ubuntu 18.04 安装博通(Broadcom)无线网卡驱动 Package gcc is not configured yet. 解决办法 history history | grep ...

  6. JAVA-数据库之更新记录

    相关资料:<21天学通Java Web开发> 更新记录 StatementUpdate.jsp <%@ page language="java" contentT ...

  7. linux installer os的驱动更新

    installer os的驱动更新 linux系统可以简单的分为installer OS与运行时的OS,安装阶段识别不到硬件设备大概率因为installers OS版本较低,没有驱动来识别新的硬件,可 ...

  8. MicroERP软件更新记录1.1

    MicroERP软件更新记录 最新版本:1.1 1.增加固定资产检修.租赁.转移记录 2.增加产品质检单 3.增加零售单(收银台) 4.支持各种主流关系型数据库 5.完善了数据字典,如加入原材料材质. ...

  9. 更新记录后关闭子窗口并刷新父窗口的Javascript

    有时我们需要在新打开的窗口里面编辑信息,等编辑完了,需要将当前窗口关闭并且刷新父窗口,以使修改生效,本文就是介绍用 javascript 来实现"更新记录后关闭子窗口并刷新父窗口" ...

  10. JDBC注册驱动的三种方式

    JDBC注册驱动的三种方式 1.通过导入的JDBC的驱动包拿到的com.mysql.jdbc.Driver对象,利用java.sql.DriverManager对象的DriverManager.reg ...

随机推荐

  1. tensorflow2.0和之前版本读取模型的接口变化

    tensorflow2.0 c++加载模型可以用接口LoadSavedModel: SessionOptions opts;     tensorflow::RunOptions run_option ...

  2. Day10-数组

    数组 一.什么是数组 数组是相同数据类型的有序集合 数字描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成 其中.每一个数据称作一个数组元素,每个数组元素可以通过一个下表来访问它们 二.数组 ...

  3. 文件上传html

    <html><head> <meta charset="UTF-8"> <title>上传文件测试</title>< ...

  4. svg矢量二维码加盖在PDF文件中

    正常行驶的bitmap类型的二维码格式,加载到PDF中,将会导致二维码失真,无法扫描. 矢量图可根据尺寸大小进行调节,不会出现失真模糊情况 所用依赖 <PackageReference Incl ...

  5. Servlet执行步骤

    <!-- 1. 用户发请求,action=add 2. 项目中,web.xml中找到url-pattern = /add -> 第12行 3. 找第11行的servlet-name = A ...

  6. flutter 环境配置以及我的第一个flutter程序(Hello World)

    电脑配置: 操作系统: Windows 7 或更高版本 (64-bit) 磁盘空间: 400 MB (不包括Android Studio的磁盘空间). Windows下所需安装有: 1.Flutter ...

  7. .Net 开发 web.config参数获取

    System.Configuration.ConfigurationSettings.AppSettings["title"] 对应着 web.config下面的 <conf ...

  8. P2212 Watering the Fields S

    题目描述 给定n个点,第i个点的坐标为(xi,yi)(xi​,yi​),如果想连通第i个点与第j个点,需要耗费的代价为两点的距离.第i个点与第j个点之间的距离使用欧几里得距离进行计算,即:(xi-xj ...

  9. AcWing 66. 两个链表的第一个公共结点 (2012算法题)

    题目: 输入两个链表,找出它们的第一个公共结点. 当不存在公共节点时,返回空节点. 数据范围 链表长度 [1,2000]. 保证两个链表不完全相同,即两链表的头结点不相同. 样例  给出两个链表如下所 ...

  10. squad经验总结

    啊美丽卡:M1A2 - TANKM2A3 - BLDL/M2A3M1126 - SCKMATV - RWS(电摇),ZCC(手摇)MATV(TOW) - TOW车M989 - 补给卡/运兵卡 俄军 8 ...