📌 转载说明:本文首发于微信公众号《闫工的算力工具箱》 原文链接:https://mp.weixin.qq.com/s/eOLQ928kwiZQwdwk5LOUUg
【闫工的工具箱 · 第 29 弹|硬件维修记】#
我是闫工,数据中心搬砖的 CCIE。
一张网卡,在我眼前"消失"了两次。
第一次,系统里明明认得它,链路也是通的,可 BIOS 里翻遍启动项,它就是不在。我顺着查下去,以为抓到真凶了,结果升级完固件,它还是不在。
第二回才是这个案子真正邪门的地方:所有的证据都指向"修好了",现象却跟没修一模一样。
— — —
案发:一个硬件,两副面孔#
先交代背景。第 19 弹写那批利旧 400G 线缆利旧 400G AOC / MPO 线缆复用前的 4 小时压力测试:PRBS-31Q 双向验收与判定标准的时候提过一句:利旧件最大的问题是没有使用历史。这次轮到了网卡,一路查下来并不顺利。
从退役仓库柜里翻出来几张 ConnectX-4 Lx,双口 25G,PCIe 3.0 x8,型号 MCX4121A-ACA_Ax。金手指干净,端面没痕迹,看着挺新。正好有台服务器要改配,业务网需要 25G 网卡,机器上还空着槽位,就插上试了。
先验的是系统这一侧,一切正常:
- 系统识别正常,两个口做了 bond0,状态
Up; ethtool 看速率协商,25G,没毛病。
当时我还挺得意,觉得这批卡捡着了。
然后装系统,翻车了。UEFI 启动菜单从头翻到尾,没有这张卡。8 张 400G 的启动项在,1 张 200G 的启动项在,唯独刚插上去的 25G,凭空消失了。
这就是案发现场:同一个硬件,操作系统能看见,固件层看不见。
排查:先把硬件的嫌疑排掉#
遇到这种"分裂"状态,第一反应当然是硬件坏了。
换槽位,现象一样。换一张同型号的卡,现象一样。把卡插到别的机器上,还是一样——系统里照样认,BIOS 里照样没有。
三步排除做完,硬件损坏的嫌疑基本可以撤了。
关键证据:那一栏写着 N/A#
登进系统查网卡固件:
mlxfwmanager --query
图:版本表里 FW 和 PXE 都有版本号,唯独 UEFI 一栏是 N/A,可用版本那列显示 14.25.0017
证据就在这张版本表里。Mellanox 网卡的固件不是一个整体,它由几个可独立更新的组件组成:
| 组件 | 当前版本 | 可用版本 | 这一栏管什么 |
|---|---|---|---|
| FW | 14.21.2330 | 14.32.1912 | 网卡主固件,链路层、协议、参数都在这 |
| PXE | 3.5.0305 | 3.6.0502 | 传统 PXE 启动的扩展 ROM |
| UEFI | N/A | 14.25.0017 | UEFI 启动的扩展 ROM |
看第三行。PXE 有版本号,说明这块卡带了传统 PXE 的启动 ROM;但 UEFI 是 N/A。
N/A 不是"这卡不支持 UEFI",而是手上这个固件镜像里压根没烧 UEFI 那部分 ROM。
真相基本清楚了。机器是 UEFI 启动模式,BIOS 要枚举启动项,得去网卡的 Flash 里读 UEFI 驱动;那块区域是空的,自然什么也枚举不出来。系统里能认,是因为驱动跑在内核态,走的是另一条路,跟固件里有没有 UEFI ROM 没关系。
这批卡当年出厂时烧的就是只有 PXE 的版本。这也解释了利旧件比新卡麻烦的地方:新卡出厂固件基本是最新全家桶,利旧卡你永远不知道它当年按什么场景配的,说到底就是旧。
以为要破了:升级固件#
动手前先把操作对象搞对。所有命令针对的是物理网卡的 PCI 设备,不是 bond0。 bond0 是内核上的逻辑接口,它没有固件这回事,工具直接不认。拿不准哪个物理口组成了 bond0:
cat /proc/net/bonding/bond0--query 的输出里还有两样东西要抄下来:PCI Device Name(形如 0000:b8:00.0)和 PSID(形如 MT_2420110034),后者是离线升级时匹配固件包用的。
这里有个容易搞错的点:双口网卡的两个口,共享同一个 PCI 设备。 两个端口在系统里是 ens11f0np0 和 ens11f1np1 两个名字,PCI 地址却是同一个。升级一次,两个口一起生效。
服务器能上外网,让工具自己匹配:
mlxfwmanager --online -u -d 0000:b8:00.0输入 y 确认,下载、写入,一气呵成。
Restart needed for updates to take effect.到这儿,按我以前的习惯就该收工了:重启,进 BIOS,卡出现,交差。手都已经敲了 reboot 了。
但那天不知道哪根筋搭对了,想着反正是台没跑业务的机器,不如先确认一下固件到底写成什么样了,就多查了一步。
反转:案子根本没破#
这一步查的是网卡参数。先起 MST 服务(Mellanox 的工具集,操作网卡 Flash 和参数都靠它):
mst start
mlxconfig -d 0000:b8:00.0 q | grep -i uefi输出是这样的:
UEFI_HII_EN True(1)
UEFI_LOGS DISABLED(0)
EXP_ROM_UEFI_ARM_ENABLE False(0)
EXP_ROM_UEFI_x86_ENABLE False(0)x86 服务器要看最后一行,EXP_ROM_UEFI_x86_ENABLE,它是 False(0)。
看到这个 False,我盯着屏幕愣了几秒:固件升级和 ROM 启用,是两件事。
mlxfwmanager 干的是"把 UEFI ROM 写进网卡 Flash"。写完,UEFI 组件就算装上了。但光装上还不够,还得有个开关告诉固件"启动的时候把它挂出去",而这个开关默认是关的。
也就是说,如果我按老习惯直接重启收工,等着我的会是:固件是新的、UEFI 那一栏也有版本号了,但 BIOS 里照样找不到这张卡。现象跟没升级一模一样。然后我大概率会掉头去怀疑卡、怀疑槽位、怀疑主板,把刚排查过的路原样再走一遍——那才是真正浪费时间的部分。
差点就带着一桩"假结案"交差了。
打开它:
mlxconfig -d 0000:b8:00.0 set EXP_ROM_UEFI_x86_ENABLE=1
图:从 False(0) 改成 True(1),New 列确认后生效
工具会回显一个 New 列,确认变 True(1) 之后再输入 y 应用。写完再查一遍,当前值也变成 True(1),才算落地。
到这一步,才是真正可以重启了。
结案:它回来了#
这次重启,起来之后先复查固件:
mlxfwmanager --query
图:UEFI 一栏从 N/A 变成具体版本号 14.25.0017
UEFI 那一栏不再是 N/A,而是 14.25.0017。
还有一个容易被忽略的前提要确认:服务器当前必须是 UEFI 启动模式。 如果机器是 Legacy 启动,哪怕网卡里烧好了 UEFI ROM,BIOS 也不会按 UEFI 方式去枚举它,等于白干。开机看 POST 界面里的 Boot Mode 一行,确认为 UEFI。
然后进 BIOS 启动菜单。这次翻到了——Slot 11 上出现了 Mellanox 25G 网卡的启动项,两个端口各两条:
UEFI: PXE IPv4 Slot 11: Port 1 - Mellanox Network Adapter - xx:xx:xx:xx:xx:01
UEFI: HTTP IPv4 Slot 11: Port 1 - Mellanox Network Adapter - xx:xx:xx:xx:xx:01
UEFI: PXE IPv4 Slot 11: Port 2 - Mellanox Network Adapter - xx:xx:xx:xx:xx:02
UEFI: HTTP IPv4 Slot 11: Port 2 - Mellanox Network Adapter - xx:xx:xx:xx:xx:02
图:改前启动项列表到 200G 为止,改后 Slot 11 多出 Mellanox 25G 的 PXE 和 HTTP 启动项
一个口枚举出 PXE 和 HTTP 两种启动方式,两个口就是四条。PXE 装机的流程,接上了,这张卡算是彻底恢复。
— — —
⚠️ 操作前提醒:固件写入会让网卡复位,链路断一下。这张利旧卡当时没承载业务,无所谓;要是给已经在跑业务的口升级,必须挪到维护窗口,或者先确认 bond 里的另一条链路扛得住。
结案之后,回头看这五个坑#
按踩到的先后顺序排,跟着走一遍,基本就是我那台机器的完整路径。
1. 先入为主,把 UEFI N/A 当成"这卡不支持 UEFI"。(最早踩的)这个误判最耽误时间,尤其手上是一批利旧卡的时候,很容易直接判定"这批不能用"就放弃了。它不是"不支持",是"当前这个固件镜像里没带这部分"。
2. 对 bond0 执行固件操作。(操作中踩的)bond0 是逻辑接口,工具不认,要先找到物理网卡的 PCI 地址再操作。找物理口的办法就是上面那条 cat /proc/net/bonding/bond0。
3. 升级了固件就以为完事。(升级后踩的)这是全文最值钱的一条。升级负责"把 ROM 写进去",EXP_ROM_UEFI_x86_ENABLE 负责"让固件启用它",两件事。少做一步,现象跟没升级一模一样,人会往回怀疑卡和槽位,把查过的路重走一遍。
4. 忘了确认启动模式。(验证时踩的)Legacy 模式下 UEFI ROM 不会被枚举,就算全做对了也看不到卡,容易误判成"前面白干了"。开机先看一眼 POST 界面里的 Boot Mode。
5. 只看 --query 的第一屏就下结论。(认知上踩的)双口卡的两个口共享一个 PCI 设备,看到系统里两个接口名字会以为要升两次,实际一次就够。反过来也容易搞错:以为升完两个口都好了,其实开关没开的时候一个都没有。
— — —
用这套东西,省了哪些事#
省了误判
“烧了"不等于"开了”。以后遇到"固件刷了但功能没生效",先想是不是还有个开关没拨,不用把排查过的路重走一遍
省了一批卡
按"BIOS 里认不到"直接判废的话,这几张卡就进垃圾桶了。实际上只是固件版本旧、开关没开,修好照样能用
省了记忆成本
命令就三条,
mlxfwmanager --online -u、mlxconfig q、mlxconfig set,不用记厂商工具的参数省了判断时间
UEFI那一栏是N/A还是有版本号,一眼就能判断这块卡能不能用来 PXE省了以后的坑
以后再收利旧网卡,先跑一遍
mlxfwmanager --query把三行版本记下来,这个动作以后能省更多事省了返工
这次是"差点直接重启收工"救回来的。刷完固件先花一分钟把相关参数查一遍,比事后返工便宜得多
— — —
结尾#
你们手上有没有那种"系统里好用、固件层不认"的利旧件?可以评论区聊聊。除了网卡,比如硬盘和 HBA 卡等。