↓ 跳过正文

利旧 25G 网卡系统里认、PXE 里不认:固件升了,还差一个开关没开

·3497 字·7 分钟·
作者
闫工
十年运营商机房 IT 运维,CCIE。做数据中心网络架构、GPU 服务器与裸金属交付,顺手写点自研小工具。

📌 转载说明:本文首发于微信公众号《闫工的算力工具箱》 原文链接: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

利旧 25G 网卡系统里认、PXE 里不认:固件升了,还差一个开关没开

图:版本表里 FW 和 PXE 都有版本号,唯独 UEFI 一栏是 N/A,可用版本那列显示 14.25.0017

证据就在这张版本表里。Mellanox 网卡的固件不是一个整体,它由几个可独立更新的组件组成:

组件当前版本可用版本这一栏管什么
FW14.21.233014.32.1912网卡主固件,链路层、协议、参数都在这
PXE3.5.03053.6.0502传统 PXE 启动的扩展 ROM
UEFIN/A14.25.0017UEFI 启动的扩展 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

利旧 25G 网卡系统里认、PXE 里不认:固件升了,还差一个开关没开

图:从 False(0) 改成 True(1),New 列确认后生效

工具会回显一个 New 列,确认变 True(1) 之后再输入 y 应用。写完再查一遍,当前值也变成 True(1),才算落地。

到这一步,才是真正可以重启了。

结案:它回来了
#

这次重启,起来之后先复查固件:

mlxfwmanager --query

利旧 25G 网卡系统里认、PXE 里不认:固件升了,还差一个开关没开

图: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

利旧 25G 网卡系统里认、PXE 里不认:固件升了,还差一个开关没开

图:改前启动项列表到 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 卡等。

相关文章