点击此处查看详细分析解答
双对外网口适配问题排查与解决方案
根据您提供的硬件环境和故障描述,目前 SGMII0 接口(eth2)可以正常访问 BMC Web 界面,但 NCSI 网口(通过 Hilink5 连接到主 CPU 的 PCIe 千兆网卡)无法使用。尽管该网卡在系统中被识别、与 CPU 通信正常、且固件支持 NCSI 功能,但仍无法实现 BMC 的带外管理通信。
以下将从架构理解、问题定位、排查路径和调试建议四个方面进行综合分析与指导。
一、系统架构与通信机制回顾
1. 当前硬件连接拓扑
- NCSI 路径:
- 主 CPU → SerDes(Hilink5)→ PCIe0 → 千兆网络芯片(WX1860AL1 / SF100HT)
- BMC 通过 MCTP over PCIe 协议与该网卡通信(NCSI 通道)
- 专用管理网口路径:
- BMC → SGMII0 → 交换芯片 → 外部网络(
eth2 可用)
验证点:PCIe 设备(SF100HT)已被 OS/BMC 正确识别,说明 PCIe 链路物理层连通。
2. NCSI 工作原理简述
NCSI(Network Controller Sideband Interface)是标准协议,允许 BMC 共享服务器主网卡实现带外管理,其核心流程如下:
- 设备发现:
network_adapter 组件通过 MCTP 扫描 PCIe 总线上支持 NCSI 的设备。
- NCSI 初始化:发送 AEN Enable、Host Notify 等命令建立控制通道。
- 通道使能(Enable Channel):启用指定 Channel(如 Channel 0),包括 TX 和 RX 方向。
- 注册 NCSI 网口:成功后通知
bmc_network 模块注册一个虚拟网口(通常为 eth0)。
- 网络配置:
bmc_network 为 eth0 分配 IP 并参与外网切换逻辑(手动或自适应模式)。
二、关键问题分析
当前现象:Web 界面仅显示 eth2 作为对外网口,无 eth0(NCSI)可用;尝试双网口配置后两者均失效。
说明 NCSI 链路尚未完成端到端适配,重点怀疑以下环节失败:
| 问题环节 |
可能原因 |
| 1. MCTP 通信未建立 |
PCIe 设备未正确响应 MCTP 枚举 |
| 2. NCSI 控制通道初始化失败 |
Enable Channel 失败(如 ncsi_channel.lua 报错 TX disabled) |
| 3. network_adapter 未上报 NCSI 网口 |
未调用 add_ncsi_interface() |
| 4. bmc_network 未注册 eth0 |
Bypassed due to missing signal or error |
| 5. CSR 定制配置缺失或错误 |
导致 eth0 被忽略或初始化异常 |
三、系统性排查步骤
Step 1:确认 PCIe NCSI 设备是否被 MCTP 成功枚举
建议命令:
# 查看当前 MCTP 端点信息
mctp-tool list
# 检查是否存在目标 PCIe 设备的 MCTP endpoint(BDF 地址需匹配)
# 示例输出应包含类似:
# EID: 15, Type: PCIe (0x04), Bound to: 0000:02:00.0
若无对应 endpoint,说明 MCTP 层未发现设备,需检查:
- PCIe 驱动是否加载(
lspci | grep -i net)
- MCTP Transport Driver 是否绑定该设备(检查
mctp-pcie 内核模块)
- BDF 地址是否正确(检查 CSR 中
RootBDF 配置)
Step 2:检查 network_adapter 是否识别并初始化 NCSI 网卡
检查日志(关键词):
journalctl -u network_adapter.service -f
# 或查看日志文件
grep -i "ncsi\|adapter" /var/log/messages
重点关注以下内容:
Found NCSI capability on device → 表示发现 NCSI 功能
Creating MCTP endpoint for NCSI → 创建通信通道
Sending NCSI Reset command / Enable Channel → 初始化流程
Calling bmc_network.register_interface() → 向上层注册接口
特别注意日志中是否出现:
ncsi_channel.lua: failed to enable channel TX
这表示虽然识别了设备,但 Enable Channel 命令执行失败(可能是固件不完整或命令参数不对)。
Step 3:验证 bmc_network 是否接收到 NCSI 网口注册信号
查看日志:
journalctl -u bmc_network.service -f
成功场景应包含以下信息:
ncsi_net_config.lua: register NCSI interface eth0
bmc_network: NCSI interface added successfully
而您的情况很可能完全没有相关日志,表明:
network_adapter 未调用注册接口
- 或
bmc_network 因配置原因忽略该请求(如 BMCSet_NET_Mode=mgnt 强制禁用 NCSI)
Step 4:检查 CSR 和定制化配置
4.1 核心 CSR 配置项(/opt/bmc/cfg/xxx.csr)
确保包含以下 NCSI 网口组定义:
"EthGroup_OutEthGroup1": {
"Name": "OutEthGroup1",
"GroupId": 1,
"OutType": 2,
"ActiveEthId": 0,
"AssociatedPortType": 1, // 1=NCSI, 2=专用口
"Channel": 0,
"Status": true,
"IpMode": "DHCP",
"IpAddr": "",
...
}
若 AssociatedPortType 设为 2(专用口),即便有 NCSI 网卡也无法使用。
4.2 装备定制化参数(BMCSet_xxx)
在装备阶段(如通过 UNT 或定制脚本)检查以下关键变量:
| 参数名 |
推荐值 |
说明 |
BMCSet_NET_Mode |
auto 或 pcie |
mgnt 会强制仅使用专用口 |
BMCSet_Eth0_Ipv4 |
on |
允许 eth0 使用 IPv4 |
Custom_NCSI_Port_Num |
0 |
指定使用第0个 NCSI 端口 |
BMCSet_NCSI_VLAN_ID |
0 |
初始测试建议关闭 VLAN |
您截图中显示 BMCSet_NET_Mode 为 mgnt(专用口模式),这正是导致 eth0 不启用的根本原因之一!
必须修改为:
"BMCSet_NET_Mode": "auto"
或
"BMCSet_NET_Mode": "pcie"
补充知识:
"mgnt":只启用专用口(eth2)
"auto":自动选择 link-up 且优先级高的口(eth2 > eth0)
"pcie":强制使用 PCIe NCSI 口(即使 link down)
Step 5:确认 Lua 脚本执行流程
相关文件:
/usr/lib/lua/bmc/kepler/network_adapter/ncsi_channel.lua
/usr/lib/lua/bmc/kepler/bmc_network/ncsi_net_config.lua
期望调用链:
network_adapter → start_ncsi_protocol()
→ send NCSI_RESET
→ send ENABLE_CHANNEL (channel 0)
→ 成功? → notify bmc_network via DBus
↓
bmc_network → receives signal → calls ncsi_net_config.lua:register_interface()
→ creates eth0
→ applies IP config
排查建议:
在 ncsi_channel.lua 添加日志打印,确认是否执行到 ENABLE_CHANNEL 并收到 ACK。
四、解决方案建议
修复步骤清单
| 步骤 |
操作 |
目标 |
| 1 |
修改 CSR 或装备参数:BMCSet_NET_Mode = "auto" |
允许启用 NCSI 网口 |
| 2 |
确保 EthGroup 中 AssociatedPortType = 1(NCSI) |
配置指向正确的网口类型 |
| 3 |
清除所有手动网络设置:ipmcset -d netmode -v 3(auto) |
重置为自适应模式 |
| 4 |
重启 network_adapter 和 bmc_network 服务 |
触发重新探测 |
| 5 |
使用 mctp-tool 验证 endpoint 是否存在 |
排除底层通信问题 |
| 6 |
抓取 journalctl -u network_adapter 日志 |
确定 Enable Channel 是否失败 |
| 7 |
如需强制测试,改为 BMCSet_NET_Mode = "pcie" |
强制使用 NCSI 口 |
五、附加调试建议
1. 日志增强建议
在 ncsi_channel.lua 和 ncsi_net_config.lua 中添加更多日志输出,尤其是:
logger.info("NCSI: about to enable channel %d", channel_id)
2. 使用 Redfish API 验证网口状态
curl -k -u admin:admin https://<bmc-ip>/redfish/v1/Managers/1/EthernetInterfaces
查看是否返回两个接口(eth0, eth2),若只有 eth2,说明注册失败。
3. 检查设备树或平台 SR 文件
确认 Hilink5 相关 PCIe 控制器(PCIe0)是否在 platform.sr 中正确定义,并启用 NCSI 支持标志位。
六、结论与优先级建议
根本原因高度怀疑:BMCSet_NET_Mode 设置为 mgnt 模式,导致系统完全忽略 NCSI 网口的注册与启用。
即使 network_adapter 成功探测到 NCSI 设备,若上层策略禁止使用,也不会创建 eth0。
推荐行动优先级:
- 立即修改
BMCSet_NET_Mode = "auto" 并重新启动服务
- 检查
network_adapter 日志中是否有 NCSI 设备识别和 Enable Channel 成功的日志
- 验证
bmc_network 是否创建 eth0 并分配 IP
- 如仍失败,抓取 MCTP 报文分析通信过程(可用
tcpdump -i mctpd 或专用工具)
一旦完成上述步骤,eth0 应能在 Web 界面中出现,并支持 ping 和远程访问。
七、参考文档与资源
如您能提供 network_adapter 的详细日志片段,可进一步判断是“未识别设备”还是“Enable Channel 失败”。
持续配合调试,有望快速定位问题根源。