基于2512 LTS版本的openUBMC
发现一个问题,只插了一张四口网卡:
但是网络管理页面出现五个网口:
可以看到MgmtPort_2和MgmtPort_146的DeviceId、DevicePortId相同,这说明一个网口对应了多个mgmtport对象:
怀疑可能是这里创建mgmtport对象时没有检查并删除废弃的mgmtport导致:
希望确认一下这个问题。
基于2512 LTS版本的openUBMC
发现一个问题,只插了一张四口网卡:
但是网络管理页面出现五个网口:
可以看到MgmtPort_2和MgmtPort_146的DeviceId、DevicePortId相同,这说明一个网口对应了多个mgmtport对象:
怀疑可能是这里创建mgmtport对象时没有检查并删除废弃的mgmtport导致:
希望确认一下这个问题。
答案内容由AI生成,仅供参考:
| 项目 | 内容 |
|---|---|
| 问题性质 | MgmtPort 对象 |
| 根本原因 | AddMgmtPort 调用前缺乏重复性校验,且不同类型(ExternalPCIe/Ocp)可并行注册同一端口 |
| 影响范围 | 网络配置混乱、IP 冲突、WebUI 显示异常、导入导出配置错误 |
| 是否与您猜测一致 | ncsi_nc_port_register() 缺少对废弃对象的主动检测与清除机制 |
| 建议措施 | NetworkPort 作为唯一物理端口标识 |
根据您提供的现象和信息,针对在基于 2512 LTS 版本的 openUBMC 系统中出现“一个物理网口对应多个 MgmtPort 对象”的问题,结合系统架构、日志数据及代码逻辑分析,以下是详细结论。
现象:
MgmtPort_2 和 MgmtPort_146 的 DeviceId=1, DevicePortId=1, Silkscreen="Port1" 完全相同,仅 Id 不同,且分属不同类型(ExternalPCIe vs Ocp),表明 同一物理端口被注册为两个不同的管理网口对象。核心怀疑点:
ncsi_info:ncsi_nc_port_register() 函数执行时,未正确检测并清理废弃的 MgmtPort 实例,可能引发重复创建。从知识库可知,MgmtPort 类型属于 BMC 中用于表示物理网络接口的管理对象。其关键标识属性如下:
| 属性 | 含义 | 是否唯一 |
|---|---|---|
Id |
BMC 内部对象唯一 ID(主键) | |
DeviceId |
设备编号(如 PCIe 卡编号) | |
DevicePortId |
卡上的端口号(如 Port1=1) | |
EthId |
关联的系统以太网设备号(如 eth0) | |
Type |
网卡类型(Dedicated / ExternalPCIe / Ocp) | |
Silkscreen |
丝印标签(如 “Port1”) |
虽然上述属性描述网口位置和类型,但 只有
Id是全局唯一标识。因此,即使DeviceId和DevicePortId相同,只要Id不同,系统仍视为两个独立对象。
AddMgmtPort 方法可能导致重复注册AddMgmtPort 是用于向 BMC 添加管理网口的核心方法,原型如下:
ok, rsp = pcall(eth_obj.AddMgmtPort_PACKED, self, ctx_new,
SlotId, PortId, Silkscreen, EthId, Type, MgmtPortId)
SlotId: 插槽编号PortId: NCSI 端口 IDSilkscreen: 显示名称(如 Port1)EthId: 对应 ethX 设备编号Type: 网口类型(ExternalPCIe、Ocp 等)MgmtPortId: 指定分配的 MgmtPort 的 Id(可选)
若
MgmtPortId未强制校验或复用已有对象,则可能在不同上下文中对同一物理端口调用多次AddMgmtPort,导致重复创建。
ncsi_info:ncsi_nc_port_register() 逻辑存在隐患for id = 1, nc_info.PortNum do
port_info = self.db:select(...):where({PortId = id}):first()
if port_info.PortAvailable then
-- 尝试添加 MgmtPort
ok, rsp = pcall(eth_obj.AddMgmtPort_PACKED, ..., port_info.Type, port_info.MgmtPortId)
if ok then
port_info.MgmtPortId = rsp.PortId -- 更新数据库中的 MgmtPortId
port_info:save()
end
elseif port_info.MgmtPortId ~= 255 and port_info.MgmtPortId ~= 0 then
-- 删除不可用端口对应的 MgmtPort
ok, rsp = pcall(eth_obj.DeleteMgmtPort_PACKED, self, ctx_new, port_info.MgmtPortId)
if ok then
port_info.MgmtPortId = 0
port_info:save()
end
end
end
| 问题 | 分析 |
|---|---|
当 PortAvailable=false 且 MgmtPortId ≠ 0/255 时会触发删除 |
|
在 AddMgmtPort 前未检查是否已存在相同 (DeviceId, DevicePortId, Type) 的 MgmtPort 对象,直接创建 |
|
MgmtPortId 存储于 NcsiNCPortInfo 表中,若状态异常或未持久化,可能导致重复注册 |
|
即使同一物理端口,若先后以 ExternalPCIe 和 Ocp 类型注册,系统认为是两个不同对象 |
结果:当系统因热插拔、固件升级或配置变更多次触发注册流程时,可能因未清理旧对象而产生多个
MgmtPort实例指向同一物理端口。
对比二者属性:
| 属性 | MgmtPort_2 | MgmtPort_146 |
|---|---|---|
Id |
2 | 146 |
DeviceId |
1 | 1 |
DevicePortId |
1 | 1 |
EthId |
0 | 0 |
Silkscreen |
“Port1” | “Port1” |
Type |
"ExternalPCIe" |
"Ocp" |
LinkStatus |
“” | “Connected” |
OriginalGroupId |
0 | 1 |
DeviceId 和 DevicePortId 完全一致 → 指向同一个物理网口。Type 不同 → 来自不同注册上下文(NC-SI over PCIe vs OCP 模块)。AddMgmtPort 注册,且未在注册前销毁对方。
结论:系统将 同一物理端口按照不同接口标准进行了两次独立注册,形成了两个“影子”对象。
在调用 AddMgmtPort_PACKED 前,先查询是否存在已注册的相同物理端口对象:
-- 伪代码:查找是否已有相同 DeviceId + DevicePortId + Type 的 MgmtPort
local existing = self.db:query_mgmtport_by_key(DeviceId, DevicePortId, Type)
if existing then
log:warn("MgmtPort already exists for DeviceId=%d, PortId=%d, Type=%s", DeviceId, DevicePortId, Type)
port_info.MgmtPortId = existing.Id -- 复用已有 Id
port_info:save()
else
-- 正常 AddMgmtPort 流程
end
优势:避免重复创建,保持对象一致性。
NetworkPort 作为底层实体引用知识库中的概念:
NetworkPort是代表物理或逻辑网络接口的系统级实体,作为MgmtPort的基础对象。
建议重构为:
NetworkPort 对应一个实际的物理网口(基于 BDF + DevicePortId 唯一标识);MgmtPort 可绑定到同一个 NetworkPort,但仅允许一个处于“激活”状态;NetworkPort 被多类型同时启用。
类似 Redfish 中的
PhysicalPort→EthernetInterface映射关系。
添加启动或注册前扫描逻辑,自动删除非法或重复的 MgmtPort:
-- 清理规则示例
for each mgmtport in all_mgmtports:
if not is_port_physical_exists(DeviceId, DevicePortId):
delete_mgmtport(Id)
else:
count = count_same_physical_port(DeviceId, DevicePortId)
if count > 1:
keep latest one, delete others
可作兼容性兜底措施。
| 项目 | 内容 |
|---|---|
| 问题性质 | MgmtPort 对象 |
| 根本原因 | AddMgmtPort 调用前缺乏重复性校验,且不同类型(ExternalPCIe/Ocp)可并行注册同一端口 |
| 影响范围 | 网络配置混乱、IP 冲突、WebUI 显示异常、导入导出配置错误 |
| 是否与您猜测一致 | ncsi_nc_port_register() 缺少对废弃对象的主动检测与清除机制 |
| 建议措施 | NetworkPort 作为唯一物理端口标识 |
MgmtPort 是“物理网络卡信息持有者”,包含 DeviceId, DevicePortId, Silkscreen 等字段;AddMgmtPort 是“添加管理端口”的方法,参数含 Type, Silkscreen, EthId 等;NetworkPort 是“系统级网络接口实体”,更适合作为物理端口抽象;MgmtPort->Id,说明 Id 是关键追踪字段;DeleteMgmtPort 接口,具备删除能力,但当前流程未有效利用。如需进一步定位具体是哪个模块(如 OCP 模块加载、NC-SI 发现)率先注册了该端口,建议启用 BMC 日志中的 ncsi:* 和 ethmgr:* 跟踪,抓取完整注册时序日志。