ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IB网卡切换Ethernet模式:Mellanox VPI卡修改Link Type全流程

IB网卡切换Ethernet模式:Mellanox VPI卡修改Link Type全流程 凌晨三点机房值班手机一响监控告警平台显示新上架的物理机网卡全部“离线”。赶到现场一看OS里ip a只能看到lo板载网卡也正常就是插了那根蓝色线缆的 IB 卡InfiniBand死活不出 IP。这种问题在异构网络环境里特别常见用的明明是支持 VPIVirtual Protocol Interconnect的 Mellanox 双协议卡结果出厂默认跑在 InfiniBand 协议上而你机房的接入交换机根本不做 IB 链路只认以太网。这时候不需要换硬件直接把这 张“IB 网卡”切到 Ethernet 模式当成普通高速网卡用就行。这篇内容就是围绕“ib网卡修改Ethernet模式”这件事展开的。我会把为什么要改、怎么改、改完要验什么、踩过哪些坑一次讲清楚适合刚接触 IB 卡/高速网卡或者正准备在测试环境里把旧型号 Mellanox 卡“废物再利用”的同学参考。全程是实际环境里跑过的流程没有纯理论堆砌。1. 为什么要把 IB 网卡改成 Ethernet 模式1.1 先搞清楚IB 卡和以太网卡到底差在哪InfiniBand 和 Ethernet 本质上是两套完全不同的链路层协议。IB 走的是 RDMA 原生通道有自己的一套寻址机制LID/GID、链路层流控和报文格式物理连接上通常使用 QSFP/AOC 光缆在某些系统里ip命令看到的是ib0这类接口而不是ethX。传统以太网则走 MAC/IP物理形态从 RJ45 到光模块都有对应的用户态工具是ethtool、ip语义是“网卡是网卡”。很多服务器里装的高性能卡其实是同一块硬件支持“双协议”既可以初始化成 IB 模式也可以初始化成 Ethernet 模式甚至可以一个口跑 IB、另一个口跑 Eth。这个能力就叫 VPI。比如 Mellanox 的 ConnectX-3、ConnectX-4/5 家族大多数型号底层硬件一样只是固件里写死的端口类型不同。所以你看到的“IB 网卡”严格说不一定是纯 IB 卡。有些卡是“纯 IB”OTPOne-Time Programmable一次性编程比如早期的 ConnectX-2 部分型号这类卡就改不了但大部分我们能在服务器配件市场买到的二代以后 VPI 卡都能通过工具修改端口类型。这是整个操作的前提。1.2 什么时候必须改 Ethernet什么时候不建议改最典型必须改的场景是你手上有 IB 卡但你的网络基础设施没有 IB 交换机也没有 IB 子网管理器Subnet Manager。InfiniBand 链路有个硬性要求子网内必须有一个 Subnet Manager 负责分配 LID、建立路由。如果你只有一台机器插了 IB 卡没有 IB 交换机也没有跑opensm之类的软件那这张卡就算起来也拿不到地址端口状态会一直停在 DOWN。这时候如果把它切到 Ethernet 模式就能直接插以太网交换机的光口当作普通 25G/40G/100G 网卡来用立刻解决链路层无人管理的问题。还有一类常见场景是测试环境没有专门的 IB 网络但机器上碰巧有几块旧的 ConnectX-3 卡这时候改 Ethernet 模式让它们跑 RoCE 或普通 TCP/IP成本很低性能还远好于板载千兆。特别是想玩玩 RDMA over Converged EthernetRoCE的不改 Ethernet 模式根本跑不起来因为 RoCE 的载体就是以太网链路。但如果你有完整的 IB 环境比如有 Mellanox IB 交换机、有 UFM 或者跑着 opensm那就不建议改。IB 模式下的 RDMA 语义、原子操作、更低的端到端延迟这些是 IB 协议的原生优势切成 Ethernet 模式虽然也能用 RoCE但丢包容忍度、队列语义、多路径特性完全不同。生产环境里跑的是 Lustre、GPFS 这类存储网络的话保持 IB 原样是更合适的选择。1.3 再说清楚其实“改 Ethernet”改的是端口类型很多人第一反应是“改驱动参数”。不是。IB 卡切 Ethernet 模式改的是固件里的Link Type字段。这个字段决定 HCAHost Channel Adapter主机通道适配器在上电初始化时端口按什么协议做链路训练。Mellanox VPI 卡的固件里每个物理端口都有一项LINK_TYPE可选的常见值包括IBInfiniBand 模式端口初始化为 IB 链路。EthEthernet 模式端口初始化为以太网链路。Auto自动探测部分型号/固件支持如果对方是 IB 交换机就切 IB如果对方是以太网交换机就切 Eth。InfiniBand/Ethernet等变体出厂固件版本不同显示不一。修改时用的工具通常是mlxconfig它是 Mellanox/NVIDIA 官方 MFTMellanox Firmware Tools里的一部分。改完要复位或者重启机器固件会在下次初始化按新类型训练端口。有一点需要先跟菜鸟兄弟说清楚这里说的 Ethernet 模式意思是端口直接变成以太网口MAC 地址、网卡队列、ethtool都能用。它不是 IPoIB。IPoIB 是“在 IB 链路上把 IP 报文封装成 IB 报文跑 TCP/IP”链路协议还是 IB跟我们今天要做的事完全两码事。后面我还会再区分一次。2. 动手前先摸清硬件和工具工具选型与准备2.1 确认你的卡是 VPI 卡还是纯 IB 卡第一件事不是装工具而是确认这张卡到底能不能改。拿 Linux 环境举例先看 PCI 设备信息lspci | grep -i mellanox正常会输出类似02:00.0 Infiniband controller: Mellanox Technologies MT27500 Family [ConnectX-3]注意看设备描述。带 “VPI” 或某些型号名称ConnectX-4/5/6/6 Lx的通常都能切。如果显示是 “InfiniBand controller” 不用太慌很多早期 VPI 卡在系统里也这么显示关键要看具体芯片型号。接着如果已经装了 MFT可以用mst status看有没有正确识别到 MST 设备mst status输出类似MST devices: /dev/mst/mt4099_pciconf0 - Mellanox ConnectX-3看到pciconf0说明 MFT 驱动已经挂上后面就能用mlxconfig操作了。如果系统里没装 MFT那后面所有固件级操作都做不了。因为mlxconfig是走 MST/SCFS 通道直接和固件通信的不是普通的 ethtool ioctl。2.2 工具链选择mlxconfig vs ibswsetup vs 自己写 sysfs改以太网模式这件事常见的做法有三种Mellanox MFT 里的 mlxconfig官方推荐改的是固件非易失配置重启生效最稳。适合生产环境、需要长期改场景。ibswsetup这个东西一般用在交换机上不是给服务器 HCA 用的大部分时候你压根不会碰到它。写进这里是因为有搜索词关联避免有人被误导。自己写 sysfs / 驱动参数某些老驱动支持在module参数里指定协议模式比如mlx4_core的port_type_array但这种不是持久化配置而且新版驱动里行为不一致出了问题很难排查不推荐在生产上用。结论很直接统一用mlxconfig。它的底层能直接读/写固件配置区操作粒度细支持按物理端口设而且有query命令可以先看一眼当前配置改了还能reset恢复安全系数高很多。后面整个实操流程我都用这套工具讲。补充一句Intel 阵营的 IB/OPA 卡比如 Omni-Path没有这种灵活的 VPI 切换能力你拿到的如果是 Intel/Omni-Path 的卡这套流程大概率不适用。动手前一定先确认硬件品牌和型号。2.3 固件版本和驱动先用哪个命令探路在跑mlxconfig之前最好也确认固件版本是否支持你要设的 Link Type。flint -d /dev/mst/mt4099_pciconf0 qflint同样来自 MFTq是 query 的缩写可以查固件版本、芯片型号、PSID 等信息。固件版本太老的话建议先升到当前硬件支持的最新稳定版本再改模式。我在实践中遇到过一台老机器上 ConnectX-3 的固件是 2.xmlxconfig set LINK_TYPE_P1Eth报了参数不支持升级固件到 2.42 之后才开放这个配置项。另外驱动层面MLNX_OFED 和 inbox 内核自带驱动都能用。但注意如果是旧版系统内核自带的 mlx4/mlx5 驱动有可能和 MFT 版本不匹配导致 MST 设备起不来。优先安装和固件代际匹配的 MLNX_OFED或者直接用较新的系统版本能少踩很多坑。驱动和 MFT 不是一回事MFT 只管烧录/配置驱动管数据面运行。3. 实操全流程IB 网卡切换 Ethernet 模式3.1 第一步备份现场信息改固件配置有风险虽然不大但我每次都会先把现场信息留个底省得改完不记得原参数。执行mst status mlxconfig -d /dev/mst/mt4099_pciconf0 querymlxconfig query会打印类似Device #1: ---------- Device type: ConnectX3 Device: /dev/mst/mt4099_pciconf0 Configurations: Next Boot Current SRIOV_EN False False LINK_TYPE_P1 IB IB LINK_TYPE_P2 IB IB这一步记住两个字段LINK_TYPE_P1和LINK_TYPE_P2分别是两个物理端口的链路类型。有的卡只有一个物理端口那就只有LINK_TYPE_P1。备份在记事本里留着将来要切回去用。注意query里有两个列Next Boot和Current。改配置影响的是Next Boot所以不会立即生效不用担心敲一条命令就断网。3.2 第二步写入 LinkType把两个端口都设为 Ethernetmlxconfig -d /dev/mst/mt4099_pciconf0 set LINK_TYPE_P1Eth LINK_TYPE_P2Eth如果只需要改某一个口只写对应的项即可。执行后工具会给出确认提示* This tool will burn a new config to the device. *输入y确认后大概率输出Applied Configuration: Next Boot LINK_TYPE_P1 Eth LINK_TYPE_P2 Eth看到Applied就说明已经写进固件了。如果只改单口也可以只写一项mlxconfig -d /dev/mst/mt4099_pciconf0 set LINK_TYPE_P1Eth这里有个经验有些型号固件不支持Eth简写会提示参数不合法。这时候可以用mlxconfig -d /dev/mst/mt4099_pciconf0 set LINK_TYPE_P11把类型按数字直接写。不同固件版本的数字映射不一定一样一般0是 IB1是 Eth2是 Auto最稳的还是先query一下帮助信息或者查对应固件版本的 MFT 文档。我用过的多数版本支持Eth这个字符串但见过几台特定 OEM 固件的卡只认数字。补充说下有人问能不能不重启就切换到 Eth答案是不分内核版本和硬件只有极少数新卡支持“动态端口类型切换”大部分 Mellanox VPI 卡改完必须冷重启或至少重载驱动让固件重新做端口初始化。备机多的环境预留重启窗口。3.3 第三步重启驱动或机器验证改完Next Boot只是改了启动参数要让它生效有两种方式整机重启。最省事也最稳妥。只重载内核模块针对 ConnectX-3 系列是mlx4_coreConnectX-4/5 是mlx5_core。重载模块前必须停掉所有依赖这个设备的上层应用比如存储集群的客户端再modprobe -r mlx4_core modprobe mlx4_core。实际生产环境我强烈建议整机重启而不是modprobe -r因为重载模块可能触发驱动状态不一致尤其是多端口、多卡并联场景。有些 OS 的 initramfs 已经把模块参数固化动态 unload 再 load 后配置可能被 module 参数覆盖。重启能顺便验证固件初始化流程是不是完整。如果只是个人测试机不想重启也可以临时用驱动模块参数覆盖端口类型但这不是本文讲的持久化方案不建议写在自动化脚本里。3.4 第四步用正确姿势确认模式生效机器起来以后先用lspci看设备描述有没有变lspci | grep -i mellanox切成功的话设备描述大概率会从Infiniband controller变成Ethernet controller或类似描述。接着用ip link看接口名ip link如果切到 Ethernet 模式原来的ib0会消失出现ens2f0/ens2f1或者eth0/eth1这类命名。有的系统还会在dmesg里看到 “link up” 和对应端口速率。再用ethtool确认端口速率ethtool ens2f0 | grep -E Speed|Link detected正常会输出Speed: 40000Mb/s Link detected: yes注意如果交换机对端也是以太网口但速率协商异常常见问题是光模块/线缆不支持该速率或者交换机端口被配置成其他速率。这时候先不要怀疑模式没切成功先看对端。最后再检查一下 MAC 地址ethtool -P ens2f0能够输出 Permanent address 就说明设备已经完成以太网初始化。这套验证顺序下来基本能确认切换成功。4. 进阶场景与多端口配置4.1 双端口分开配置很多 Mellanox 卡是双口卡比如 ConnectX-3 的单卡双 QSFP 口。这种情况下LINK_TYPE_P1和LINK_TYPE_P2是独立配置的。实际使用中我见过两种需求两个口全切换成 Eth当作双口万兆/双口四万兆网卡用。一个口保持 IB 连接 IB 存储网络另一个口切 Eth 用于带外管理或普通 TCP/IP。这种方式适合服务器同时接入两类网络但机箱空间有限的情形。按需写入即可。比如保留 P1 为 IB把 P2 改为 Ethmlxconfig -d /dev/mst/mt4099_pciconf0 set LINK_TYPE_P1IB LINK_TYPE_P2Eth这样就会形成“一张卡双协议”的效果。这也是 VPI 卡被叫做“Virtual Protocol Interconnect”的由来。但要注意如果两个口都接了线缆一个口跑 IB、一个口跑 Eth两边子网完全隔离驱动会同时注册ib0和ens2f1两类接口。某些旧版驱动在双协议模式下的中断处理、NUMA 亲和性设置不如纯单模式好我遇到过这种配置下 CRC 错误计数偏高的个案后来靠升级固件解决。所以双协议虽然灵活但不要没事就这么玩稳定性优先选单模式。4.2 改完 Ethernet 之后这些功能会发生变化这是很多人容易忽略的。同样一张卡从 IB 模式切到 Eth 模式能力矩阵变了不是简单“换个接口名”而已。队列与 RDMA 语义IB 模式提供原生的 IB QPQueue Pair、SRQShared Receive Queue切到 Eth 模式后支持的是 RoCE。RoCE 的报文要经过以太网封装对网络的 PFCPriority Flow Control、ECNExplicit Congestion Notification配置有要求不然在拥塞场景下丢包率会比 IB 模式明显高。MTU 差异IB 模式常见 MTU 是 2048~4096 字节和以太网标准的 1500 字节不同虽然万兆网卡可以开 jumbo frame 到 9000 字节。如果你切成 Eth 模式默认 MTU 可能是 1500里面跑存储集群这类大块 IO 的话记得根据业务调 MTU比如 9000。IPoIB 变成纯 TCP/IP 网络这个变化最关键。以前网卡就是ib0你要配ib0的 IP用的是 IPoIB改成 Eth 模式之后接口变成标准以太网接口原来的ib0配置、/etc/sysconfig/network-scripts/ifcfg-ib0这类文件全都不再适用。如果脚本里有硬编码ib0一定要同步改。管理工具链IB 模式下用ibstat、ibv_devinfoEth 模式下用ethtool、rdma link show看 RoCE 状态。注意rdma link show在 Eth 模式下依然能用只是展示的是 RoCE 链路。这里插一句热门搜索词“Ethernet/IP 协议”有同学把“IB 网卡改 Ethernet 模式”和“Ethernet/IP 协议”搞混。Ethernet/IP 是工业自动化领域基于以太网的应用层协议CIP over Ethernet和本文说的把 HCA 端口切换为以太网接口完全是两码事。如果你是为了跑 PLC 或工业控制器联网查找资料时别走错方向。4.3 特殊场景和 Hyper-V、虚拟化共存热门搜索词里还有一个 “Hyper-V virtual ethernet”。如果你是在 Windows Server 的 Hyper-V 环境里操作 IB 卡或者 Linux 宿主机上开着虚拟化有几点经验可供参考Windows 下的 Mellanox 驱动也提供类似的端口类型配置工具一般是mlxconfig的 Windows 版或者通过Mellanox Firmware Tools (Win) - mlxconfig.exe操作流程和 Linux 基本一样。Hyper-V 的虚拟交换机如果已经绑定在旧接口比如ib0上切换模式后虚拟交换机配置会失效需要在新的以太网接口上重新绑定。建议先停掉虚拟机再改配置。Linux 侧跑 KVM / libvirt 的话如果用 macvtap 直通或 SR-IOV VF 绑定到 IB 模式端口改成 Eth 后 VF 的功能和配置方式也会变。特别是 SR-IOVMellanox 卡在 IB 模式和 Eth 模式下支持的 VF 数量上限可能不同切换前先查固件规格。虚拟化场景下还有个隐藏坑系统里如果存在多个虚拟以太网设备虚拟交换机创建的 NIC、Docker 网桥等改完卡模式后ip link输出会特别乱。建议用ethtool -i查驱动的 bus-info 来确认哪个接口是物理 IB 卡ethtool -i ens2f0 | grep bus-info只有 bus-info 指向真实 PCI 地址的接口才是这块卡。5. 常见问题与排查实录5.1 模式写进去了但起不来这是个高频问题。表现是mlxconfig set成功重启后ip link看不到新接口lspci里设备状态异常或者dmesg刷一堆错误。我先给结论大概率是线缆/光模块插错口或者对端交换机没有启用对应端口。很多双口卡上两个 QSFP 口有的机器前面板丝印不清你看着插的是P1实际物理位置对应的是P2但你把LINK_TYPE_P1改了P2 还是 IB于是物理链路起不来。排查方式是mlxconfig query再看两个口的当前配置然后用ethtool逐个口看 Link detected。另外有些 AOC 线缆有源光缆出厂时是针对 IB 交换机做的 EEPROM 编程插到以太网交换机的 SFP/QSFP 口上可能不识别。这种情况下硬件链路起不来很正常。解决办法是换 DAC 线或者能兼容目标交换机的光模块。如果确认物理链路没问题但dmesg里有类似 “firmware failed to initialize” 的报错那就考虑固件不匹配先用flint升级固件再重试。5.2 设备名变了脚本全废这是切模式最容易被忽视的“次生灾害”。IB 模式下接口名是ib0切到 Eth 模式后内核按照 systemd 的命名规则生成了ens2f0。你原先所有引用ib0的配置文件、监控脚本、防火墙规则、路由策略瞬间全部失效。我建议的操作顺序是重启前先记录老接口名和所有关联配置IP、metric、bond 关系。重启后先不要急着配 IP先把/etc/udev/rules.d/70-persistent-net.rules如果有看一下避免新旧接口名乱了。把管理 IP 临时配上确认网络通了再统一批量替换脚本里的接口名。当时我有一批 HPC 集群的 Munge/NFS 挂载脚本全部硬编码了ib0切完模式以后整个集群调度全挂排查了一晚上才找到问题。后来养成了习惯所有涉及网卡接口的配置一律用/etc/systemd/network里基于 MAC 的命名绑定或者干脆用ip link set name固定成业务名。少踩一半的坑。5.3 固件升级之后模式被重置有的机器在之后做固件升版时刷成出厂默认配置LINK_TYPE_P1/P2会被重置回 IB。这不算 bug很多固件版本默认配置就是 IB刷完固件之后如果有管理工具自动把配置区 restore 成默认就会出现“明明之前改成 Eth 了怎么又变回 IB”的情况。排查思路很直接mlxconfig -d /dev/mst/mt4099_pciconf0 query看LINK_TYPE_P1/P2的 Current 值如果变成 IB重新 set 一遍即可。如果是批量环境建议把这个mlxconfig set写进第一次上电的初始化脚本里别指望一次改完永久生效。固件升级属于高危操作有条件的话在测试机上先验证当前固件包里的默认配置策略再批量刷。5.4 关于“ib 网卡”搜索词别把 IPoIB 和 Eth 模式搞混我见过不下十次有人在群里问为什么我网卡已经切了 Ethernet 模式ibstat还是能看到设备甚至ib0还在。这里再强调一次ibstat是rdma-core提供的工具它管的是 RDMA 设备层不关心你的链路是 IB 还是以太网。InfiniBand 协议栈在系统里是按“RDMA 设备”暴露的和网络接口名是两个维度。切到 Ethernet 模式后ibstat可能依然能看到硬件设备但链路状态和协议类型变化了不能用它来判断“模式是否切成功”。判断模式是否切成功的唯一标准是lspci里的设备类型描述Infiniband controller vs Ethernet controller。物理口是否出现ethX/ensX接口。ethtool ensX是否能读速率和 Link。另外 IPoIB 是跑在 IB 链路上的 IP 封装协议你切到 Ethernet 模式后就没有 IPoIB 了而是走标准以太网驱动。想确认当前接口是 IPoIB 还是标准以太网可以用ethtool -i看驱动名IPoIB 一般是ib_ipoib标准以太网是mlx4_en/mlx5_core。这一招在排查“到底是 IB 还是 Eth”时非常好用比看接口名准一百倍。5.5 常见问题速查表现象可能原因快速排查/解法mlxconfig set报参数不支持固件太老/OEM 固件裁剪升级固件或用数字参数重试重启后ip link没有新接口端口插错/线缆 EEPROM 不匹配/固件初始化失败查dmesg换线缆确认mlxconfig queryethtool看不到速度链路未 UP或对端交换机端口未启用查对端端口配置换模块/DAC设备名ib0消失脚本全失效接口命名规则变化用 MAC 绑定命名改脚本固件升级后模式变回 IB刷固件导致配置区重置重新mlxconfig set写进初始化脚本ibstat还能看到设备正常现象RDMA 设备层与链路模式无关用lspciethtool -i判断真正模式Hyper-V / KVM 虚拟机网络失效虚拟交换机绑定旧接口停虚拟机重绑新接口6. 一个容易被忽略的点改模式记得同步检查散热与功耗配置这个问题初看和模式切换没关系但我在机房实际遇到过。ConnectX-3 这类老卡的 TDP 本来就不低切成 Ethernet 模式跑满 40G 线速以后芯片功耗和发热比 IB 模式下只跑 IPoIB 时高不少。部分 OEM 服务器对 PCIe 插槽的供电设计余量不足长时间跑满速率后可能出现网卡过热降速甚至 PCIe AER 报错。切完模式后不要只看端口能通就关机走人建议顺手跑一轮全速打流iperf3 -c 对端IP -t 300 -u -b 40G或者用qperf测一下带宽和延迟。如果发现持续打流后速率掉了一半先去查dmesg有没有温度告警再用ethtool -S看有没有大量tx_timeout。散热优化手段包括换更好的导风罩、调整风扇转速策略、给卡加一个主动散热片底座。老卡改 Eth 模式后当主力高速网卡用这一步省不得。7. 最后分享一个小习惯我在处理这种“改固件配置”的活时一定会同步准备一份回滚方案。以 IB 卡切 Ethernet 模式为例改之前用一个文本文件记录当前固件版本、mlxconfig query的完整输出、线缆连接关系、以及当前驱动模块参数改完并验证没问题后这份记录归档进机器台账。将来不管是固件升级还是别人接手都能快速知道这台卡当初是怎么配的。另外如果你是批量维护几十台机器别一台一台手动mlxconfig。Mellanox 的工具支持在同一网段内通过mlxconfig --devices枚举所有设备或者写好脚本批量执行 setverify。我第一次批量处理 16 台机器时就是用一条 for 循环加sshpass每台机器改完立刻mlxconfig query验证整个过程不到 20 分钟。省下来的时间够再摸一遍鱼。
返回列表