26.06上devmon反复重启(自己构建HPM、26.03上正常)

问题描述

新开发的PCIe网卡驱动Porting到OpenUBMC26.06后,devmon服务反复重启。(在26.03版本上是正常的)

**表象:**OpenUBMC的WebUI “系统管理” → “系统信息“ → “网络适配器“中的网卡信息全是空的。

定位发现是“devmon”不能正常运行,反复重启:

查看LOG,发现PCIe网卡初始化时devmon未能找到几个.so

在构建的manifest下确实没找到这些.so。

其他26.03版本没出现的问题:

2606版本是这样:

2603版本是这样:

环境信息

  • 操作系统:Ubuntu 24.04

  • 软件版本:OpenUBMC 2606

  • 硬件配置:MYIR开发板3093,自研PCIe网卡、使用NC-SI over MCTP over SMBus_OEM。

重现步骤

  1. 克隆component_drivers代码仓、切换到1.2.248 (OpenUBMC 26.06对应组件的版本),增加自研PCIe网卡的CSR、代码驱动,NC-SI MCPT驱动。然后binggo build构建dev版本。网卡CSR文件参见附件“14140130_20f91010_20f90066.sr”

  2. 克隆devmon代码仓、切换到1.2.58 (OpenUBMC 26.06对应组件的版本),修改mds/service.json,使用“conan”: “component_drivers/1.2.248@openubmc.dev/dev”。然后binggo build构建dev版本。

  3. 克隆vpd代码仓、切换到1.90.125 (OpenUBMC 26.06对应组件的版本),修改vendor/Huawei/Server/Kunpeng/openUBMC/root.sr,增加MYIR板上的I2C_8和Connector_SF的配置,参考附件“root.sr”。然后binggo build构建dev版本。

  4. 克隆manifest仓,切换到tag 26.06_2026.06.30,修改openubmc.lock、openubmc_sdk.lock解除锁定使用组件的版本,修改framework.yml和hardware.yml使用上面的dev版本,修改profile.txt增加包含自研网卡的14140130_20f91010_20f90066.sr,然后binggo build出包rootfs_openUBMC.hpm。

  5. 做米尔开发板OpenUBMC WebUI的“固件更新”更新刚出的HPM包,重启自研网卡和OpenUBMC。

期望结果

BMC与自研网卡之间MCTP over SMBus_OEM交互正常。

BMC的WebUI上网卡信息显示正常。

实际结果

:white_check_mark:】从网卡侧LOG和BMC的app.log中看MCTP over SMBus_OEM交互正常。

:cross_mark:】BMC的WebUI上无法显示网卡基本信息。

尝试过的解决方案

  1. 比对CX、Hisi和网讯的26.03和26.06 CSR变化,将自研网卡CSR中的PCIeNicCard_1.xxx改成PCIeNicCard_1[bmc.dev.PCIeDevice].xxx。因为看app.log中有“not found for PCIeNicCard_1.Slot”字眼。但还是没用。
  2. 看到drivers/meson.build有新增使用“unidev”编译宏,但看26.03上的“subdir(‘connector’)”,感觉用不着开启“unidev”。就没尝试。

分析结论

感觉是哪里构建步骤有问题,造成.so的缺失、devmon启动失败。

OpenUBMC26.06.zip (70.4 KB)

根据日志查看应当不是日志所述的so不存在导致重启,能否提供完整的一键收集内容呢

null_null_19700101-0800.tar.gz (6.9 MB)

附件是在OpenUBMC WebUI的“一键收集”后下载的日志。请帮忙看看,谢谢。

另外我看日志里,我们网卡驱动调用NC-SI标准命令发送NC-SI的 Clear Initial State命令,没日志:

下图是网卡start_ncsi_protocol()的过程:

(截图行号与app.log中的日志行号有点偏差、比对hisi同类文件刷了些头文件)

标记1:发送select package命令,日志有记录(我自己在i2c.cpp、chip.cpp、mctp.cpp增加log),网卡也收到后生成应答、BMC也读到了应答。129行的Log也出现了。

标记2:端口发送Clear Initial Status命令在app.log中就没看到了。

标记3:是创建网卡的mctp句柄。

根据一键收集日志中的journalctl.log日志可以观察到,devmon反复重启应该是收到了ABRT信号导致程序重启,但是app.log中已缺少那个时刻的日志。根据第一个截图看到的话,逻辑已经走到了sn200_card.cpp里的逻辑,可以复现的话在其中通过添加日志等方式来定位是哪一个逻辑导致了程序abrt

用AI检查了一下,发现是sn200_card::start()里在新版本同步修改时,少增加了init_optical_module()相关的内容。改了之后devmon服务正常存在了。

但是从资源树看,网卡相关的内容还是没上树:

缺少:

/bmc/dev/ObjectGroup/0103
/bmc/dev/Systems/1/PCIeNicCard/PCIeNicCard_1_0103 及其子对象
/bmc/kepler/Systems/1/Mctp/Transport/0103_50 及其子对象


通过mdbctl查看,对象都在、但都查不了属性。

image

从app.log看,这些对象都成功创建了,也没看到哪里报上树失败。

【参考】之前26.03版本上正常的应该是这个样子:

【怀疑点】app.log中显示在init_sn200_card()时报了找不到目标(如下图),这个问题查了几次.sr、尝试修改都没消掉

image

:white_check_mark:】网卡的MCTP over SMBus_OME的mctp endpoint创建、上树都成功:

请问这种情况怎么定位。

null_null_19700101-0800 (1).tar.gz (7.5 MB)

刚刚的“一键收集”日志。

26.06签名更换方法能共享一下吗?我下载26.06后,更改manifast.yml会报如下错误,之前在25.06版本可以正常编译

我是基于ubunut 24.04 + OpenUBMC的容器,直接原版构建的。没更换签名密钥,没遇到这个问题。

准备资源

Docker版本:sudo docker pull swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_26.06
bmc_sdk版本:https://repo.openubmc.cn/26.06/sdk/bmc_sdk.zip

sudo docker run -itd --privileged=true
–mount type=bind,source=/mnt/pciecard/openUBMC/workspace-26.06,target=/home/workspace
–restart=always --name openubmc-26.06 swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_26.06 /bin/bash

进入容器

sudo docker exec -it openubmc-26.06 /bin/bash

配置git

balabal…

克隆manifest 2606版本

git clone git@gitcode.com:openUBMC/manifest.git
cd manifest
git checkout 26.06_2026.06.30

初始化项目

python3 init.py -path ../../bmc_sdk.tar.gz -user -psw

构建

bingo build

不更换签名的话官方的确实没有问题,我们在25.06版本上调整过签名,也想用相同方法进行签名替换,结果就是上述报错

我继续尝试了一些,发现2组现象:

现象1:不启动网卡,只是启动构建好的BMC,在BMC探测网卡(MCTP发送SetID)时网卡无响应,这个场景下网卡SR配置的资源是上树的。

然后启动网卡,通过busctl --user call … 命令通过MCTP over SMBus_OEM是正常的。

现象2:先启动网卡、重启BMC。BMC探测网卡(MCTP发送SetID)时正常,但是发送NC-SI over MCTP命令时 MCTPD任务超时(查看app.log)

a. 【正常】mctpd注册网卡信息

app.log中 2026-07-27 10:04:02.232733。 (省略图片/否则没法发帖:broken_heart:

b. 【正常】mctpd设置BMC smbus owner信息

app.log中 2026-07-27 10:04:04.341818。(省略图片/否则没法发帖:broken_heart:

c. 【正常】BMC探测网卡(发送SetEID命令),网卡返回信息、BMC创建网卡MCTP endpoint

备注:我在component_drivers的chip.cpp和i2c.cpp添加了nlog()

c.1 BMC发送SetEID request:

app.log中 2026-07-27 10:04:04.374074。(省略图片/否则没法发帖:broken_heart:

c.2 BMC读取SetEID的response:

app.log中 2026-07-27 10:04:04.642777。 (省略图片/否则没法发帖:broken_heart:

c.3 BMC读到正确的reponse后创建网卡的MCTP endpoint:

d. 【超时】 然后进入sn200网卡start和init过程,发送Select Package request、读取response后mctpd超时:

d.1 BMC上sn200网卡驱动通过NC-SI over MCTP 发送Select package request(第1次发送, NC-SI ID是0x01):

d.2 BMC上MCTP层250ms后读Response, chip层已读到网卡提供的应答数据:(app.log中 2026-07-27 10:04:05.037449)(省略图片/否则没法发帖:broken_heart:

d.3 【超时】然后一直持续到NC-SI over MCTP的call超时到(设置的15秒)

image

d.4 BMC又尝试第2次发送Select Package的Request、并读取Response,也还是chip层已经读到。(省略图片/否则没法发帖:broken_heart:

d.5 【超时】component_drivers的mctp.cpp报出超时错误:

在NC-SI层设置的超时是15s,这里的超时与第1次Request已过去30秒、与第2次Request已过去15秒,搞不清到底报的是哪次超时、还是丢了一次超时。

image

d.6 BMC尝试第3次发送Select Package的Request、并读取Response,也还是chip层已经读到。(省略图片/否则没法发帖:broken_heart:

请帮看看是MCTP哪里检查Response报文内容有错么?

之前调试26.03版本时,一开始计算“应答报文”的SMBus PEC是按照MCTP规范算的,后来改成SMBus Block Read的PEC计算方法就OK了。 不知道新版本哪里是不是有变动

《原贴 【求助】NC-SIoverMCTPoverSMBus超时(米尔3093开发板I2C-8) - #18,来自 huangzhiyu

null_null_20260727-1017.tar.gz (7.8 MB)

网卡有收到报文吗?收到报文后有回复吗?BMC有收到网卡的回复吗?日志搜下smbus看看有没有什么打印。

BMC就发了2次命令:

第1次:MCTP的Set EID;网卡收到、生成应答,BMC也读走、创建的对应的MCTP endpoint。

第2次:网卡驱动调用disable_hardware_arbittration()发送 NC-SI 标准命令 Select Packet,网卡收到、生成应答,BMC也读走了。 在我加的BMC chip/bus模块log看,bus/chip都拿到网卡应答了。但有时MCTP正常返回,有时超时。

搜过log,没发现SMBus层报啥错误。

另外我在BMC命令行使用busctrl命令写命令/读应答,在读应答时发现一个问题:在读命令配置的读取长度小于网卡生成的长度时,就报错了。

例如 Set EID命令:

BMC写Request:

busctl --user call bmc.kepler.devmon /bmc/dev/topology/I2c_8_dev/Complex/Chip_SmbusChip_0103_dev bmc.dev.Chip BlockIOWrite

BMC读Response:

busctl --user call bmc.kepler.devmon /bmc/dev/topology/I2c_8_dev/Complex/Chip_SmbusChip_0103_dev bmc.dev.Chip BlockIORead uu 0x1F 0x0e

如果把上面命令最后一个表示读的字节数0x0e,改成小于0x0e的,然后就报bus错误,然后资源树上这个网卡相关的信息就全丢了。

我尝试过网卡固件不变,BMC固件换成26.03版本就没有这个问题。

26.06上busctl SmbusChip BlockIORead异常:

步骤1: 先启动MYIR BMC到命令行,再启动网卡。

步骤2:查询资源树,正常

步骤3:busctl 命令通过smbus chip发送MCTP的 EID Request、 读取 Response,正常

BMC侧命令行:

网卡侧log:

步骤4:【少读字节】 busctl 命令通过smbus chip发送MCTP的 EID Request、 读取 Response时最后1个参数少与实际应答长度,异常

BMC侧命令行:

网卡侧log:

再查看devmon的资源树,丢了很多节点

在我加的BMC chip/bus模块log看,bus/chip都拿到网卡应答了。但有时MCTP正常返回,有时超时。
这个你有日志记录吗,看看回的是什么。

你这个异常估计是coredump重启了,没有资源树节点是已知问题,之前修了

超时就出现过一回,当时没抓log。其他都是直接资源树没了,component_driver下的mctp也没报超时,不知道卡在哪里了。

不好复现吗

对,超时不好复现。就是直接卡死了,component_driver里的mctp中的读接口直接没走下去。

这个问题 后续还有其他进展吗