← 返回目录课程:《ConnectX-6 Lx网卡安装配置资料包》
04

04 驱动编译:MLNX_OFED源码编译与内核模块加载

从源码编译MLNX_OFED驱动并加载到Linux内核
章节导航 难度:入门类型:概念框架
目标结果

掌握Lx网卡安装配置资料包在驱动编译中的定位、故障信号与验证顺序。

关键词
模块接口配置流程状态
交付物
架构图代码片段排障表检查清单

编译环境准备与源码获取:从资料包到构建目录

现场定位记录

  • 对象/模块:典型技术应用现场里的驱动编译
  • 问题现象:典型技术应用现场里驱动编译一开始改动很快,输入需求增加后日志记录显示状态外泄、循环依赖和接口膨胀。
  • 验证动作:先把职责边界、私有状态、依赖方向、阈值标准和验证入口画清,再执行拆分动作。
  • 工程判断:前后变化点能被隔离、被验证、被替换,才说明架构重构达到标准。

概念块:驱动编译

驱动编译用驱动编译、MLNX_OFED源码编译、内核模块加载连接到驱动编译的调试、验证和交付动作。

  • 驱动编译
  • MLNX_OFED源码编译
  • 内核模块加载
  • Linux内核
关键判断

例如: modprobe 核心 会同时加载 mlx5_ib 和 mlx5_en

常见误区

不要把底层实现细节、全局变量和临时调试逻辑暴露到上层接口。

实操步骤

ConnectX-6 Lx 网卡依赖的 MLNX_OFED(Mellanox OpenFabrics Enterprise Distribution) 源码包已包含在《ConnectX

驱动编译的验收口径

驱动编译的第一步是确认内核版本与源码包的匹配关系。ConnectX-6 Lx 网卡依赖的 MLNX_OFED(Mellanox OpenFabrics Enterprise Distribution) 源码包已包含在《ConnectX-6 Lx网卡安装配置资料包》中。解压后,你会看到 MLNX_OFED_SRC-5.8-x.x.x.tgz 这样的文件。不要直接在解压目录下执行 make,而是先运行 ./install.pl --build-only 脚本,它会自动检测当前运行的内核版本并生成对应的 Kconfig 和 Makefile 构建环境

实操步骤

执行 uname -r 确认内核版本后,进入源码顶层目录运行 ./install.pl --build-only --kernel-sources /usr/src/kernels/$(uname -r)。如果系统缺少内核头文件,先安装 kernel-devel 包,否则 Kconfig 解析会失败

构建脚本会检查依赖项,包括 GCC、make、perl 等工具链。如果提示缺少 libibverbs 或 rdma-core 开发库,使用包管理器安装对应版本即可。这一步的关键输出是 build_dir 目录,其中包含了按内核版本隔离的编译中间件

内核模块编译与 Kconfig 配置验证

驱动编译落地前要同时核对驱动编译的MLNX_OFED源码编译、失败路径和内核模块加载。

MLNX_OFED 的驱动核心是多个 内核模块(Kernel Modules),包括 核心(网卡主驱动)、mlx5_ib(InfiniBand/RDMA 支持)和 mlx5_en(以太网协议栈)。这些模块的编译行为由 Kconfig 文件控制。在 build_dir 下执行 make menuconfig 可以查看所有可配置项,但生产环境通常保持默认值即可

编译命令很简单:在 build_dir 内执行 make -j $(nproc)。编译成功后,模块文件(.ko)会输出到 build_dir/drivers/net/ethernet/mellanox/ 等路径下。为了验证模块是否与当前内核兼容,可以执行 modinfo 核心 检查其 vermagic 字段是否与 uname -r 输出一致

关键判断

如果编译过程中出现 Kconfig: syntax error,通常是因为内核源码路径错误或 kernel-devel 版本不匹配。此时应检查 /lib/modules/$(uname -r)/build 软链接是否指向正确的内核源码树

模块加载与持久化配置

编译完成后,使用 insmod 或 modprobe 加载模块。推荐使用 modprobe,因为它会自动处理模块依赖。例如:modprobe 核心 会同时加载 mlx5_ib 和 mlx5_en。加载后通过 lsmod | grep mlx5 确认模块已驻留内核

为了让驱动在重启后自动加载,需要将模块名写入 /etc/modules-load.d/mlx5.conf 文件,每行一个模块名。同时,在 /etc/depmod.d/ 下更新依赖关系:depmod -a

技术资产:编译与加载命令速查表

以下表格总结了驱动编译和加载过程中的关键命令及其作用,便于现场快速参考

检查清单
参数表:MLNX_OFED 驱动编译与加载命令
检查项标准是否通过常见遗漏
./install.pl --build-only配合 --kernel-sources 指定路径生成构建目录与 Kconfig 配置检查 build_dir 是否存在
make -j $(nproc)在 build_dir 内执行并行编译所有内核模块查看 .ko 文件是否生成
modprobe 核心需 root 权限加载主驱动及依赖模块lsmod | grep mlx5
depmod -a模块加载后执行更新模块依赖关系无报错即成功

注意:modprobe 加载时如果提示 FATAL: Module 核心 not found,说明模块未安装到标准路径。此时应手动复制 .ko 文件到 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/mellanox/,然后执行 depmod -a 再尝试加载

问题对照与修正

  1. 常见偏差:把驱动编译直接写进主流程,只验证能跑通,留下驱动编译边界、状态和验证口径不清。
  2. 修正做法:把驱动编译收敛成稳定接口,明确伪代码和失败返回。
  3. 复核方式:构造一个异常输入或超时场景,用日志、断言和稳定性与可观测性证明修复有效。

风险边界与排障:编译加载常见问题

驱动编译:MLNX_OFED源码编译与内核模块加载
测试台架驱动编译:MLNX_OFED源码编译与内核模…测试步骤工具链路验证点ConnectX-6驱动编译OFED源码编译与内核模块加载ConnectX-6Conne…Lx网卡安装资料包L x网卡安装资料包驱动编译驱动编译MLNXMLNXfixturecapturejudge123核心对象ConnectX-6关键链路Lx网卡安装资料包工程提示驱动编译

驱动编译和加载过程中,最容易出错的环节是内核头文件版本不匹配和模块签名问题。以下表格列出了典型故障现象及执行侧案

排障表摘要
现象可能原因检查位置修复动作

真实项目场景

某数据中心在 CentOS 7.9 上编译 MLNX_OFED 驱动时,make 过程正常,但 modprobe 核心 后网卡无法识别。排查发现内核版本为 3.10.0-1160,而资料包中的 OFED 源码默认针对较新内核优化。解决方案是使用 --kernel-sources 参数明确指定旧内核源码树,并重新编译。编译后通过 dmesg | grep mlx5 确认驱动成功枚举了 ConnectX-6 Lx 网卡的 PCIe 设备

最后,务必在加载驱动后执行 ip link show 确认网口状态。如果看到 state DOWN,使用 ip link set dev ethX up 激活接口。至此,驱动编译与内核模块加载流程完成,网卡已具备收发数据包的能力

细节补充:

驱动编译先对齐现场任务、输入材料和输出结果,再回到Lx网卡安装配置资料包的细节逐项核对。

驱动编译的主要风险来自驱动编译边界、状态和验证口径不清;落地前必须核对伪代码,并确认例外场景和结果记录。

本节资料使用说明

Q1

驱动编译里最先使用的工具、样例或资料是哪一个?

使用口径:
使用顺序:先用定义目标和边界的材料,再进入具体样例或工具。
替换位置:把Lx网卡安装配置资料包中可替换字段和保留结构分开标注。
输出物:最终要看到驱动编译或Lx网卡安装配置资料包,不是只完成操作。
Q2

替换Lx网卡安装配置资料包时,哪些位置可以改,哪些位置要保留?

使用口径:
替换位置:把Lx网卡安装配置资料包中可替换字段和保留结构分开标注。
输出物:最终要看到驱动编译或Lx网卡安装配置资料包,不是只完成操作。
常见误操作:提醒默认值、旧素材或错误字段残留。
Q3

输出物检查时,最不能漏掉哪一项?

使用口径:
输出物:最终要看到驱动编译或Lx网卡安装配置资料包,不是只完成操作。
常见误操作:提醒默认值、旧素材或错误字段残留。
使用顺序:先用定义目标和边界的材料,再进入具体样例或工具。
Q4

如果换一套素材,使用顺序要不要调整?

使用口径:
常见误操作:提醒默认值、旧素材或错误字段残留。
使用顺序:先用定义目标和边界的材料,再进入具体样例或工具。
替换位置:把Lx网卡安装配置资料包中可替换字段和保留结构分开标注。