urest命令getsyseth查询网口linkstatus为None

// 此模板仅供参考,如果不适用可以修改

问题描述

1、使用urest命令getsyseth查询网口信息,得到linkstatus为None,查看web网卡连接状态为连接

2、分析urest底层调用接口为/redfish/v1/Systems/:systemid/EthernetInterfaces/:ethernetinterfaceid

该接口获取linkstatus的逻辑如下

请问非NPU卡在不装ibma的情况下,os_link_status为空,那么link_status只能为NoLink或null,这种设计是否合理?

答案内容由AI生成,仅供参考:

关于非NPU卡在无iBMA情况下 LinkStatus 返回为 None 的合理性分析

根据您提供的信息,我们对以下问题进行深入分析:

非NPU卡在不安装iBMA的情况下,os_link_status 为空,导致 LinkStatus 只能为 NoLinknull(即urest中显示为 None),这种设计是否合理?


:magnifying_glass_tilted_left: 问题复现与现象

  • 使用 urest getsyseth 查询网口信息时,LinkStatus 显示为 None
  • 然而 Web 界面显示网口状态为“连接”(Connected),二者状态不一致。
  • 底层 Redfish 接口调用路径为:
    /redfish/v1/Systems/:systemid/EthernetInterfaces/:ethernetinterfaceid
    
  • 该接口中 LinkStatus 的值由脚本 get_port_link_status.lua 决定。

:puzzle_piece: LinkStatus 的生成逻辑分析

:white_check_mark: 核心脚本逻辑(get_port_link_status.lua)如下:

local os_link_status = Input[1]  -- OS 层链路状态
local link_status = Input[2]     -- BMC 获取的物理链路状态
local model = Input[3]           -- 网卡类型(如 NPU)

if model == 'NPU' then
    return link_status == 'linkUp' and 'LinkUp' or null
end

if os_link_status and #os_link_status ~= 0 then
    return os_link_status
else
    if link_status == 'Disconnected' then
        return "NoLink"
    else
        return null
    end
end

:pushpin: 执行逻辑分层:

条件 返回值
是 NPU 卡且 link_status == 'linkUp' "LinkUp"
是 NPU 卡且非 linkUp null
非 NPU 卡且 os_link_status 非空 返回 os_link_status
非 NPU 卡且 os_link_status 为空 ➜ link_status == 'Disconnected' "NoLink"
非 NPU 卡且 os_link_status 为空 ➜ link_status != 'Disconnected' null ➜ 最终显示为 None

:light_bulb: 注意:null 在 Redfish 响应中对应字段缺失或为 null 值,在 urest 中呈现为 None


:books: 上下文支持信息梳理

1. os_link_status 的来源

  • OS Link Status 是操作系统层面识别的链路状态。
  • 来源于 iBMA(Intelligent Bare Metal Agent) 上报的数据。
  • 若未安装 iBMA,则 os_link_status 为空字符串或未定义。

:white_check_mark: 文档依据(搜索结果 #7《网口链接状态手册》):

“连接状态与是否安装 iBMA、端口是否接线、端口是否 Up 强相关。”

2. link_status 的来源

  • 来自 BMC 层通过 NCSI 协议或硬件驱动获取的物理链路状态。
  • bmc.dev.NetworkPort.LinkInfo 接口提供。
  • 属性名:LinkStatus(字符串)、LinkStatusNumeric(数值)。

:white_check_mark: KG 实体关系支持:

  • NetworkPort 实现了 bmc.dev.NetworkPort.LinkInfo
  • LinkStatus 是其关键属性之一,用于反映物理连接状态。

3. NCSI 协议的作用

  • BMC 通过 NCSI 协议与网卡通信,查询链路状态。
  • 方法 update_link_status_by_ncsi 用于监控并更新状态。
  • 支持 GetPortLinkStatus(IPMI 命令)和 GetPortInfo 获取端口细节。

:warning: 若 NCSI 初始化失败或未成功获取状态,可能导致 link_status 不准确。


:balance_scale: 设计合理性分析

维度 分析
:white_check_mark: 设计初衷合理性 在具备 iBMA 的场景下,优先采用 OS 层更精确的状态(如协议栈是否 ready),此策略合理。
:cross_mark: 无 iBMA 场景下的缺陷 os_link_status 为空时,即使物理链路正常(link_status == 'Connected'),也因逻辑跳转到 else 分支,最终返回 null,即 None。这会导致 误报断连
:globe_with_meridians: 用户体验影响 用户看到 Web 显示“连接”,但 urest 显示 None,造成认知冲突和诊断困难。
:wrench: 故障排查误导 可能误导运维认为链路异常,而实际物理层已连接。

:hammer_and_wrench: 是否合理?结论

:cross_mark: 不合理 —— 当前设计在 非 NPU 卡且未安装 iBMA 的场景下存在明显缺陷。

主要问题:

  • 过度依赖 iBMA 的 os_link_status,而忽略了物理层 link_status 的可用性。
  • 即使 link_status == 'Connected',只要 os_link_status 为空,仍返回 null逻辑不完整
  • 没有提供降级策略:当 OS 状态不可用时,应退化到使用物理链路状态。

:white_check_mark: 改进建议

修改 get_port_link_status.lua 脚本逻辑如下:

if model == 'NPU' then
    return link_status == 'linkUp' and 'LinkUp' or 'NoLink'  -- 避免 null
end

if os_link_status and #os_link_status ~= 0 then
    return os_link_status  -- 优先使用 OS 状态
else
    -- 降级使用物理链路状态
    if link_status == 'Connected' or link_status == 'Up' then
        return "LinkUp"
    elseif link_status == 'Disconnected' or link_status == 'Down' then
        return "NoLink"
    else
        return "Unknown"  -- 或保留 null,但建议明确状态
    end
end

改进效果:

场景 改进前输出 改进后输出
有 iBMA,OS 连接 LinkUp 不变
无 iBMA,物理连接正常 None LinkUp :white_check_mark:
无 iBMA,物理断开 NoLink NoLink
未知状态 null Unknown(更友好)

:memo: 总结

项目 说明
当前行为 非 NPU 卡未装 iBMA 时,urestLinkStatus 显示为 None,即使物理连接正常。
根本原因 get_port_link_status.lua 脚本在 os_link_status 为空时未合理处理物理链路状态。
是否合理 :cross_mark: 不合理,忽略了物理层有效信息,导致状态误判。
建议方案 引入降级机制,当 OS 状态不可用时,依据物理 link_status 判断连接性。

:white_check_mark: 建议推动脚本优化,提升 BMC 在无 iBMA 场景下的可观测性与鲁棒性。

相关链接:

  1. 执行NCSI 相互影响测试-升降级FW DC Power Cycle测试时,ncsi网口概率断连
  2. sp925d中port1端口在热拔插光模块后,端口状态还是显示为LinkUp
  3. 网卡适配 NCSI over MCTP 协议经验分享
  4. 【公示中,下次评议时间7.28】网卡驱动规范v0.1
  5. GPU卡适配指导 | 文档中心 | openUBMC

与web显示不一致,web的逻辑是什么,看看能参考不 web这种情况看了下代码逻辑应该是返回的UP

bmc web前端显示逻辑如下,请问是否要与之保持一致呢?

redfish的System下这个接口是专门查询带内iBMA获取的连接状态,如果没有iBMA,为什么Disconnected会被转化成Nolink,是因为二者都表示硬件链路是断开的,二者等价所以才可以转化;其他取值找不到与之等价的iBMA取值,因此不做转化,直接显示成null