运行 dentOS 的 Edgecore AS5114-48X:18 号端口的 SFP+ 能正常识别,但 onlpdump 一直停在 RX_LOS
我们实验室机架上留着几台 ONIE 设备做测试,其中一台是运行 dentOS 的 Edgecore AS5114-48X-O-AC-F-EC。18 号端口本应承载一条通往相邻交换机的 10G 链路,但它就是起不来,尽管设备明显已经识别到了模块。
- 交换机:Edgecore AS5114-48X-O-AC-F-EC,dentOS(ARM64)
- 模块:18 号端口上的 Intel FTLX8571D3BCV-IT SFP+
- 双工 LC 跳线接到对端,和其他正常端口用的是同一批线
内核对这个模块完全没意见,平台层也识别出来了,但状态位却讲了另一个故事:
kernel: ... port 18: switched to inband/10gbase-r link mode
$ onlpdump
...
sfp @ 18 = Present
Status: 0x00000004 [ RX_LOS ]
已经做过的事:
- 重新插拔模块,清洁了两端接头
- 在对端交换了 TX 和 RX,然后把整根跳线换成了确认没问题的
- 把同一个模块换到另一个空闲端口,情况一样
所以 EEPROM 读取正常,MAC 侧也切换到了 10gbase-r,但接收端就是看不到光。onlpdump 只给我一个存在标志和一个状态位掩码,别的什么都没有,我该怎么把这个问题干净地拆分成模块、光纤线路、平台三部分?
Comments 5
RX_LOS 单独出现只能说明接收端没看到足够的光,所以在怪这台设备之前:对端报的是什么?如果对端端口能读 DDM,看一下它的 Tx 功率,确认激光器确实在发光、端口没被 shut。也值得确认一下两端是不是同一种光模块类型和光纤模式——一个短距模块对一个长距模块,或者用错了光纤,看起来跟这个现象一模一样。
另外,你有没有在 18 号端口试过另一个不同型号的模块,还是只把这一个模块在端口间挪来挪去?
对端是另一台交换机上的 10G 端口,两边用的都是同样的短距光模块。用同一根跳线接另一个模块,那个端口能顺利起链路,所以对端激光器是正常的,光纤线路端到端也没问题。18 号端口是 admin up 的,把线反过来接结果也一模一样。
麻烦的是我在本地能观察到的东西太少:onlpdump 给我的就是存在标志加状态位掩码,仅此而已。dentOS 这边没有 Rx 数值可以跟对端比对,所以我卡在"有什么东西收不到"这一步,不知道是哪一端的问题。
从现象到原因,按我会走的顺序来说。识别成功只能证明 I2C/EEPROM 通路和 MAC 那部分的接线是对的,别的什么都证明不了。内核那条关于 inband/10gbase-r 的日志是主机侧在自我配置——不代表有哪怕一个光子真的到达了。RX_LOS 被置位之后,剩下三个嫌疑对象:光纤本身不通或接反了、对端根本没在发送、以及这个平台上的接收器本身工作不正常。
前两项你已经查得很彻底了,所以别再收集状态位了,去拿一个具体数值。任何能打印数字诊断信息的交换机都行。在 EXOS 上是
show ports <port> transceiver information,能给出温度、供电电压、激光偏置电流、Tx 和 Rx 功率,并标出所有超出模块阈值的数值;debug hal show optic port <port>还能从 EEPROM 里拿到厂商、料号、序列号、连接器类型和波长。我就是这么在一台 X460-G2-24x-10G4 上追出一个失效的 10G 端口的,测出接收端大概是 -26.78 dBm,任何 10G 短距或长距接收器都锁不住这个电平。如果对端能在你的模块发送时给你一个 Rx 读数,你至少能知道它自己的激光器是否正常。排除掉这些之后剩下的,就是这个平台驱动不动这个具体型号的模块了。
我这里也是同一款设备,在这个平台上,模块支持是按具体型号而不是按标准来的。在我们的 AS5114-48X 上,Avago AFBR-703SDZ-IN2 rev G2.3 不用任何调整就能起来——平台把它报成 Intel Corp,序列号 AA1329A5UTA,第一眼看很容易把人搞糊涂。
有两个型号在我们同款交换机、同一条光纤上从来没成功过:你手上这个 Intel FTLX8571D3BCV-IT rev A,还有一个 OPNEXT TRS5020EN-S301。两个都能被识别,两个的状态都跟你 18 号端口一模一样。建议先借一个确认没问题的模块试试,别再在光纤线路上耗一个晚上了。
有一点值得说准确一点:RX_LOS 是模块自己按 SFF-8472 定义输出的 loss-of-signal 信号,平台层只是把它原样呈现成状态位 0x00000004。它是在低于接收器的 LOS 门限时被置位的,所以它告诉你的是"光不够",从来不会告诉你为什么。这也是为什么一次完全干净的 EEPROM 读取和一条彻底不通的光路可以同时成立,并不矛盾。
坚持要一个真实 Rx 数值的另一个理由是:从 CLI 上看,衰减过大和不兼容看起来一模一样。有个同事遇到过一个 Zyxel 端口大概停在 -25.69 dBm,最后解决问题的是跳线加上一块被人改动过的配线架,而不是模块本身。如果 dentOS 这边读不到 DDM,就从对端或者主机那边读——光靠一个位掩码解决不了这个问题。