最近帮一位客户折腾一批 Mellanox ConnectX-4 Lx 25G 网卡现场环境是 CentOS 7.9 加自编译内核本来以为半小时能搞定的驱动安装和温度检查结果因为固件版本和内核头文件对不上硬是耗了一下午。说实话这种项目看着简单其实坑全藏在细节里。这篇就把我这次的操作过程、方案权衡和踩过的坑完整梳理一遍重点覆盖两个核心诉求Mellanox 网卡驱动安装和温度检查中间会穿插一些 DPDK、固件升级、系统兼容性的实战经验给正在折腾同类网卡的朋友做个参考。1. 整体设计与思路拆解1.1 项目需求到底在解决什么Mellanox 网卡在服务器和数据中心场景里用得非常多尤其是 ConnectX 系列几乎成了高性能计算、存储网络和虚拟化平台的标配。驱动安装这个需求背后通常对应几种实际情况一是新采购的网卡装到旧系统里系统自带驱动不认二是原有驱动版本太老跑 DPDK 时性能上不去三是系统重装后网卡没被正确识别需要手动装回官方驱动。温度检查这个需求则更偏向运维体检。高速网卡的功耗随着速率提升明显增大25G、100G 网卡的散热设计如果出问题轻则降速、丢包重则直接烧毁板载元件。很多朋友以为温度检查就是进去看一眼实际上 Mellanox 网卡的温度信息藏在多个数据源里读法和判断标准都有讲究。这两件事放在一起做其实是比较合理的组合拳。驱动装好网卡才能正常工作而温度检查又依赖正确的驱动和工具链。一次操作解决两个问题也能顺便把整张卡的运行状态做个摸底。1.2 驱动方案选型三种路线的取舍先说结论Mellanox 网卡的驱动安装市面上主流有三种路线第一种用系统自带驱动inbox driver。大部分主流 Linux 发行版的内核里都已经带了 mlx4_core、mlx5_core 这些模块。装上网卡后系统大概率能直接识别并拉起端口。优点是零成本、不用折腾缺点是版本通常比较旧性能和功能支持有限而且不一定带全 DPDK 所需的 userspace 库。第二种安装 NVIDIA MLNX_OFED 官方驱动包。这是最推荐的路线。MLNX_OFED 是从上游内核社区拉取的驱动代码加上 NVIDIA 自己的优化、补丁、用户态工具打包成的完整发行包里面会带上 opensmd、ibdump、mlxup 等一大票管理工具。安装完以后不仅内核模块版本新连 mget_temp 这类温度检查工具也一并装好了省很多事。第三种从 GitHub 或内核源码手动编译驱动。这个适合开发调试场景比如你在改驱动代码或者需要打自定义补丁。生产环境不太建议编译依赖容易出问题维护成本也高。我这边的选择很直接优先用 MLNX_OFED除非官方包不支持当前内核版本再退回到 inbox 驱动或源码编译。1.3 温度检查的思路不能只看一个数据点Mellanox 网卡的温度信息按数据来源可以分成几个层级ASIC 芯片温度、板载传感器温度、光模块温度如果用了光口。命令层面有 NVIDIA 官方的mget_temp工具也有ethtool -m这类看光模块 DOM 信息的通用方法。温度数据的意义不只是看个数字更重要的是做趋势判断。一次读到的温度是瞬时值但如果连续监测就能看出散热风道是不是堵了、散热片是不是松了、机房空调是不是不给力。这里要多说一句很多新手会犯一个错误只看系统里sensors命令的输出发现没有网卡温度就觉得查不了。实际上 Mellanox 的温度工具链不在 lm_sensors 体系里要用官方工具读。2. 准备工作与版本核对2.1 安装前必须查清楚的五个信息在实际动手之前我习惯先把环境信息摸清楚这步看起来啰嗦但能避免后面大量返工。你需要确认这几项网卡具体型号和 PSID通过lspci -vvv | grep -i mellanox查看确定是哪一代 ConnectX是 CX4、CX5 还是 CX6以及对应的 PSID因为固件和驱动版本与这个关联很大。操作系统版本cat /etc/os-release不同发行版和版本号对应的 MLNX_OFED 包不同。内核版本uname -rMLNX_OFED 对内核版本有严格匹配要求不匹配时安装脚本会报错。是否安装过旧版驱动rpm -qa | grep mlnx或者ls /usr/src/ofed*看一下有旧版必须先卸载或覆盖。机器架构uname -m确定是 x86_64 还是 aarch64下载对应安装包。这五项信息收集完心里基本有数了。尤其内核版本和网卡型号这两项几乎决定了你该下载哪个 OFED 版本。2.2 固件版本为什么值得提前查驱动安装容易被人忽略的一个前置步骤是固件检查。Mellanox 网卡的固件和驱动是配套演进的关系驱动太新固件太旧或者固件太新驱动太老都会出现奇怪问题。之前遇到过一张 CX5固件停留在 16.x.x.x装上最新的 OFED 后端口能 up但跑流就是不稳定最后升级固件到 16.29.x.x 才正常。检查固件版本的方法很简单如果系统已经识别网卡用ethtool -i eth0就能看到 firmware-version 字段。如果在驱动都没装的状态下可以装好驱动后再看。固件升级工具是mlxupMLNX_OFED 里自带也可以单独从 NVIDIA 官网下载。在装驱动之前先确认固件不是古董级版本可以省掉一轮排障。2.3 我踩过的第一个坑下载包选错架构这次客户环境是 CentOS 7.9 x86_64我一开始下载了 MLNX_OFED_LINUX-5.8-1.1.2.1-rhel7.9-x86_64.tgz解压后执行安装脚本报了一堆依赖错误仔细看才发现系统里装的是带有特殊内核参数的定制内核OFED 自带的预编译模块不匹配。这个问题虽然最后还是靠--force加源码编译解决了但给整个流程增加了不少时间。我的建议是下载前一定对照操作系统和内核版本如果系统不是标准的发行版内核建议直接用./mlnxofedinstall --force走源码编译流程或者干脆用--without-dkms加手动编译的方式。当然几乎所有机器上装 OFED 都建议同步装好对应内核的 kernel-devel、kernel-headers 和 gcc、make因为即使安装脚本用的是预编译模块后续 DKMS 或者 modules 签名校验也可能会用到编译环境。3. 驱动安装实操全流程3.1 从下载到安装的完整命令序列这里以 RHEL/CentOS 7.9 ConnectX-5 为例完整走一遍流程。先下载官方的 MLNX_OFED 包wget https://www.mellanox.com/downloads/ofed/MLNX_OFED-5.8-1.1.2.1/MLNX_OFED_LINUX-5.8-1.1.2.1-rhel7.9-x86_64.tgz tar xzf MLNX_OFED_LINUX-5.8-1.1.2.1-rhel7.9-x86_64.tgz cd MLNX_OFED_LINUX-5.8-1.1.2.1-rhel7.9-x86_64/解压后先不要急着装直接执行./mlnxofedinstall --help看下可选参数了解有哪些开关。我这次用的命令是sudo ./mlnxofedinstall --force --without-32bit --enable-dpdk --skip-distro-check几个关键参数解释一下--force允许覆盖已有的旧版驱动和库文件前提是确保系统里没有重要的旧版 OFED 配置。--without-32bit不装 32 位兼容库纯 64 位环境足够了装 32 位库反而可能引发 glibc 版本冲突。--enable-dpdk额外安装 DPDK 所需的 PMD 库和依赖如果后续要做 DPDK 测试这个选项必须加。--skip-distro-check跳过发行版严格匹配检查对定制系统比较友好但前提是你清楚当前内核兼容。整个安装过程会编译若干内核模块耗时大概 5 到 15 分钟不等看机器性能。期间会有很多类似Verifying 26 installations...的输出最后出现Installation finished successfully就是装好了。注意安装完成时提示需要重启或者重新加载模块建议直接重启干净利落。3.2 安装后验证别急着看温度重启之后第一步是确认系统正确加载了 mlx5_core 模块lsmod | grep mlx5_core正常会输出类似mlx5_core 438272 0 mlx5_fpga_tools 16384 0 mlx5_core mlx5_ib 344064 2 ib_uverbs 106496 8 mlx5_ib mlx5_fwctl 16384 0 mlx5_core然后看端口状态ip link show找到 Mellanox 网卡对应的物理口。如果端口显示state DOWN需要手动 up 一下sudo ip link set enp175s0f0 up接着再用ethtool -i确认驱动版本和固件版本sudo ethtool -i enp175s0f0 driver: mlx5_core version: 5.8-1.1.2.1 firmware-version: 16.32.1010到这一步驱动安装才算真正完成。如果后面要做 DPDK、VPP 或者容器网络可以继续用ibv_devinfo属于 libibverbs 的用户态工具确认 verbs 接口是否正常ibv_devinfo -d mlx5_0看到state: PORT_ACTIVE说明用户态驱动也通了。3.3 DPDK 测试前的驱动准备细节很多搜到这篇的朋友是因为 Mellanox 网卡 DPDK 测试的需求来的。安装时加了--enable-dpdk但装完还要确认用户态库版本匹配否则 DPDK 跑起来 PMD 初始化直接报No devices found。查看 DPDK 相关库rpm -qa | grep dpdk dpdk-21.11-5.el7_9.x86_64 dpdk-devel-21.11-5.el7_9.x86_64 dpdk-tools-21.11-5.el7_9.x86_64如果跑 DPDK 测试时出现mlx5_pci_probe(): Failed to load mlx5dv说明 libibverbs 版本和 DPDK 版本不匹配常见的解法是重新编译 DPDK 时指定RTE_EAL_PMD_PATH指向 OFED 自带的 PMD 库路径或者直接使用 DPDK 源码里的usertools/dpdk-devbind.py绑定网卡sudo python3 usertools/dpdk-devbind.py --bindmlx5_core 0000:af:00.0这块属于 DPDK 的展开话题这篇不深挖但做温度检查之前顺手确认这些库没问题后面不用反复重装。3.4 固件升级驱动装完最值得做的一步驱动装好、端口能 up 之后我强烈建议顺手做一次固件升级。尤其当你发现固件版本和驱动版本跨度很大的时候不升级固件后面的温度管理和高级功能可能会受限。MLNX_OFED 里自带 mlxupsudo mlxup -i enp175s0f0它会自动从 NVIDIA 官方仓库获取新版固件并提示确认整个过程大概一两分钟。这里唯一要注意的是升级固件期间绝对不能断电不能断网卡连接否则变砖风险很高。一般生产环境操作固件升级前我会确认业务已经迁移或维护窗口已批准。升级完成后建议重启一次让固件彻底生效。4. 温度检查方法与数据解读4.1 mget_temp 工具的正确打开方式温度检查的核心工具是 NVIDIA 提供的mget_temp脚本。这个脚本通常在 MLNX_OFED 安装包里自带了路径一般位于/opt/mellanox/scripts/或者安装包解压根目录的utils/子目录下。如果系统里找不到也可以从 NVIDIA 官网单独下载或者从 GitHub 上的 mellanox 相关仓库获取。直接运行sudo /opt/mellanox/scripts/mget_temp它会自动枚举系统里的所有 Mellanox 网卡输出类似Device 1: /dev/infiniband/mlx5_0 1) Temperature (deg C): 43.15 2) Temperature (deg C): 42.96 3) Temperature (deg C): 43.10 4) Power (W): 7.83 5) Voltage (mV): 1216.50这个输出是从网卡内部的 MLXSENSOR 信息读取的不同的行可能对应不同的传感器位置。输出里还包含功耗和电压信息对判断网卡电源健康状况也很有用。如果只想快速跑一次就退出sudo /opt/mellanox/scripts/mget_temp -c 1-c参数指定读取次数1 就是只读一次适合脚本里调用。4.2 温度数据的三个关键判断准则拿到温度数字以后怎么判断正不正常根据我这几年维护高速网卡的经验可以给你一个参考区间温度范围状态建议25°C - 55°C正常无需操作55°C - 68°C偏高检查散热风道、风扇转速68°C - 75°C危险立即降载、检查散热75°C 以上严重建议停机检修防止烧毁这个区间是基于 ConnectX-4/5/6 系列的经验值不同型号和速率会有差异比如 ConnectX-6 Dx 因为功耗更高工作温度会比 CX4 高一些。但总体原则是长期超过 75°C 就要当回事了。需要特别提醒的是Mellanox 网卡的 ASIC 温度阈值在不同固件版本里可能有差异。比较稳妥的做法是连续监测 5 次取平均值和最大值不要看到一次 60°C 就慌也可能只是瞬时负载波动。4.3 光模块温度怎么查如果你的接口是光口光模块自身的温度也很重要。用 ethtool 查 DOM 信息sudo ethtool -m enp175s0f0输出末尾会有一大段 Module Temperature、Vcc、Tx/Rx power 之类的信息。光模块的工作温度范围一般是 0°C 到 70°C长期超过 60°C 寿命会明显缩短。这里补充一个容易踩的坑很多光模块在网卡驱动没正确加载时ethtool -m会报Operation not supported这不是光模块坏了而是 I2C 读取链路没建立起来。先确认驱动和端口状态正常再查温度。4.4 监控脚本让温度检查自动化单独跑一次命令只能拿到瞬时数据更实用的做法是写一个简单的巡检脚本放到 crontab 里定时执行温度过高时报警。这里分享一个简易版思路#!/bin/bash TEMP$(sudo /opt/mellanox/scripts/mget_temp -c 1 | grep Temperature | awk -F: {print $2} | awk {print $1} | sort -rn | head -1) if [ $(echo $TEMP 70 | bc) -eq 1 ]; then echo $(date) WARNING: Mellanox NIC temperature $TEMP°C /var/log/mlnx_temp.log fi这个脚本只是抛砖引玉实际生产环境建议配合 Zabbix、Prometheus 这类监控系统把 mget_temp 的输出转换成监控指标。之前帮客户做过一个方案5 分钟采集一次温度画成趋势图散热问题基本能提前一到两天发现。5. 常见问题与避坑速查5.1 安装阶段的高频报错报错一Cannot find a valid base OS或者not supported distribution。原因是 MLNX_OFED 对发行版和内核版本有严格校验。回答是先用--skip-distro-check尝试如果还不行大概率是内核太新需要下载更新的 OFED 版本。报错二缺少依赖库比如libibverbs相关。手动 yum 安装缺失项sudo yum install -y libibverbs libibverbs-devel librdmacm librdmacm-devel报错三编译内核模块时提示找不到kernel-devel。严格匹配当前内核版本安装sudo yum install -y kernel-devel-$(uname -r)报错四mlnxofedinstall卡在Building rpms阶段很久不动。比较常见的是部分旧 RPM 包冲突可以加--force重试或者先卸载旧版 OFEDsudo /usr/sbin/ofed_uninstall.sh5.2 驱动装好了但温度工具拿不到数据的排查这个问题我在 CX6 上遇到过。mget_temp明明装了跑出来却是No devices found排查步骤如下先看用户态工具能否看到设备ibv_devinfo如果这里能看到设备说明驱动没问题问题出在mget_temp的权限或路径上。确保用 root 运行或者把当前用户加入root组并设置sudo免密码。如果ibv_devinfo也看不到设备检查模块和端口状态dmesg | grep mlx5看有没有读到类似mlx5_core 0000:af:00.0: firmware version: 16.32.1010的日志。如果没有可能网卡的 PCIe 链路没 up需要用lspci -vvv确认设备挂载状态。5.3 温度偏高时先别急着换卡拿到偏高的温度数字第一反应别是换硬件先从这几个维度排查风道堵塞服务器前面板防尘网堵了没这是最常见的原因。风扇策略BIOS 或 BMC 里的风扇调速模式是不是自动手动模式可能转速过低。环境温度机柜进风温度是多少超过 28°C网卡温度上 60°C 是很自然的。加装散热片部分 25G 及以上网卡对风道设计有明确要求有些型号本身不带主动散热非要横插在低风阻槽位上温度就是下不来。如果以上都排查过温度还是持续走高才考虑返修。之前客户有一批 CX5放在 1U 服务器里风道比较紧张温度一直压在 65°C 附近后来在机箱尾部加装了两个 4028 风扇解决问题网卡温度降到 48°C。很多时候温度问题不是网卡本身而是整个散热系统的问题。5.4 常见问题速查表问题现象可能原因解决思路安装报 not supported distribution发行版版本过老或过新加--skip-distro-check或换对应版本 OFED编译模块时缺 kernel-devel内核头文件缺失安装匹配的内核开发包装完没看到mlx5_core模块安装未成功或内核不兼容dmesg 确认错误重装端口 up 后反复 down固件与驱动不匹配升级固件检查光模块/线缆mget_temp报 No devices found驱动没加载或权限不对确认模块加载使用 root 执行ethtool -m不支持驱动/端口状态异常先确保端口 up驱动版本正常温度长期高于 70°C风道/环境温度问题检查散热、添加风扇别急着换卡6. 一些实操体会这次项目做完下来最大的感受是Mellanox 网卡的驱动安装和温度检查本质上不是两条独立的工作线而是同一套周边生态里的两个环节。驱动装好了温度工具才跑得起来温度数据正常驱动和固件的健康状态也间接得到了验证。另外想说一下固件管理。很多人驱动装完能用就完事了温度、性能都等到出问题再看。实际上 Mellanox 的 firmware release note 里会明确写每个版本修复了哪些热管理问题。有些旧固件在特定负载下对温度的响应不够灵敏会出现温度已经很高但风扇策略还没跟上升级固件后会有明显改善。所以我的习惯是每次装完驱动顺手把固件也升到该驱动版本对应的推荐版本。最后分享一个小技巧mget_temp这个命令本身还支持输出 JSON 格式-j参数方便接入监控系统解析。之前做 Prometheus exporter 时用这个格式扒数据比正则匹配输出文本省力得多。网卡温度这类硬件指标本身逻辑不复杂但真正接到监控里、做到阈值告警和趋势预测才算把温度检查的功能用透。