hwdiscovery

版本信息

项目内容
组件版本1.130.20
首发版本openUBMC 26.09
文档作者openUBMC 社区
最后更新2026-09-15
许可证Mulan PSL v2

1. 组件概述

1.1 组件简介

hwdiscovery 是 openUBMC 的硬件自发现组件,归属基础框架子系统,是南向硬件访问的一部分。它以独立 Skynet 应用运行,D-Bus 服务名为 bmc.kepler.hwdiscovery,工作目录 /opt/bmc/apps/hwdiscovery。组件解析机型 CSR(.sr)与 EEPROM 自描述数据,按对象组发布对象,并驱动下级板卡的并发发现与热插拔。

mds/service.jsontypeapplicationdescriptionhardware self-discovery componentdeployConfigframework.service。systemd 单元 hwdiscovery.servicemdb_mgmt.service 之后启动,依赖 mdb_mgmt.servicepersistence.service

组件不提供 IPMI 命令(仓库无 mds/ipmi.json)。对外资源协作接口来自本仓 mds/model.jsonmdb_interface 中的 bmc.kepler.ObjectGroupbmc.kepler.Connector。内部 Skynet 解析服务 .parser_service 不对外暴露 D-Bus 方法。

构建依赖 libmc4luapersistence;测试依赖 hwproxymacaipmi_coredtframeforluamdb_interfacelibmgmt_protocol。运行时还依赖 bmc.kepler.Chip.BlockIObmc.kepler.Accessorbmc.kepler.Scannerbmc.kepler.EepromDatabmc.kepler.Managers.Package(见 mds/service.jsonrequired)。

1.2 解决什么问题

BMC 上电后需要根据机型 CSR / EEPROM 自描述构建硬件对象树,并把对象按归属组件分发给 hwproxy 与各业务 App。hwdiscovery 把以下工作收敛到统一服务:

  • 从程序区、数据区、EEPROM 或客户定制目录加载 root.srplatform.sr 及下级部件 CSR。
  • 按 MDS Schema 解析对象、引用、同步、表达式与层级关系,完成对象重命名。
  • ObjectGroup 上树并提供按 Owner 拉取对象、按 Position 拉取拓扑的接口。
  • 根据 Connector 的识别模式与在位状态并发发现下级组件,并支持热插拔卸载/重载。

1.3 核心功能

  • 核心功能一:对象组发布

    每个 SR 硬件组件对应一个 ObjectGroup,路径 /bmc/kepler/ObjectGroup/${Position}。业务组件与 hwproxy 收到上树信号后,调用 GetObjects / GetBinaryObjects / GetTopology 拉取归属本 App 的对象或拓扑链路。

  • 核心功能二:连接器与下级发现

    Connector 描述下级板卡的 Bom、槽位、在位、BoardId、总线和识别方式。Presence 变化时触发加载或卸载;Reload 可按指定身份强制重载。

  • 核心功能三:CSR 解析流水线

    解析服务按 match → rename → append → arrange → analyse 处理 CSR。支持变量、同步(<=/)、引用(#/)、层级(@Parent)、表达式(|>),以及客户定制 CSR 与 index.json 索引。

1.4 关键术语表

术语解释
CSR / SRComponent Self-description Record,JSON 格式自描述文件,扩展名 .sr
ObjectGroup某一 Position 上全部对象的发布单元,业务按 Owner 拉取。
Connector连接器对象,描述下级板卡身份、在位与总线,路径 /bmc/kepler/Connector/${ID}
Position / GroupPosition对象组位置。由上级 Connector 的 GroupPosition 与本级 Connector Position(两位十六进制)拼接。00platform.sr01root.sr02 为 PSR。
IdentifyMode下级板卡识别方式,见 2.5。
Owner对象归属的业务 App 名,如 hwproxyhwdiscoverybmc_soc
LifeCycleId对象组生命周期标识;变化时框架需重新拉取对象。
AnchorCSR ManagementTopology 中的锚点,声明本部件总线列表。
PSR虚拟组件,Position 为 02,用于 UID-Slot 等配置映射。

1.5 外部交互边界图

进程日志默认写入 dist/config.cfg 中的 /data/var/log/bmc/hwdiscovery.log。组件自身没有独立监听端口。


2. API 使用说明与示例

对外发布的 API 为资源协作接口,服务名 bmc.kepler.hwdiscovery。方法首参 a{ss} 为框架调用上下文;命令行调试可传空字典 0。均可通过 busctl / mdbctl 调试。

bash
# 查看资源协作接口
busctl --user tree bmc.kepler.hwdiscovery

典型树形结构(对象名随机型变化):

text
/bmc/kepler/Connector/...
/bmc/kepler/ObjectGroup/00
/bmc/kepler/ObjectGroup/01
/bmc/kepler/ObjectGroup/0101
/bmc/kepler/hwdiscovery/MicroComponent

业务组件通常不直接解析 CSR,而是通过 mc.mdb.object_manage 订阅对象组上树信号,再调用本节接口。这是 libmc4lua 侧的消费方式,不是 hwdiscovery 导出的 Lua 模块。

2.1 bmc.kepler.ObjectGroup

功能说明

某一 Position 上的对象组。硬件自发现完成某级 SR 解析后创建该对象,供业务按 Owner 拉取对象,供 hwproxy 拉取拓扑。

路径/bmc/kepler/ObjectGroup/${Id}Id 即 Position,如 010101

参数说明

属性类型读写说明
Positions只读对象组位置。
Ownersas只读本对象组包含对象的归属 App 名列表。
OnlineTimestampt只读对象组上树时刻。来源为进程内 tick 差,单位毫秒;不发射 emits-change。框架按该时间升序拉取对象组。
Sloty只读对象组对应的槽位号,来自上级锚点 Slot

接口定义见 mdb_interfacebmc.kepler.ObjectGroup,hwdiscovery 在 src/lualib/module/component/component.luasetup 中赋值。

返回值与异常

属性只读。对象组不存在时路径不在资源树上。

应用场景

确认某 Position 是否已完成自发现、有哪些 Owner、上树先后顺序。

限制条件

Owners 来自解析结果中的 app_name 计数。设备树格式路径会把 devmon 记入 Owners(见 hwcomponent:process)。

调试示例

bash
busctl --user introspect bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/01
busctl --user get-property bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/01 \
    bmc.kepler.ObjectGroup Position

2.2 GetObjects

功能说明

按 Owner 返回该 Position 下归属指定 App 的对象列表。属性与扩展属性以 JSON 字符串给出。

属性内容
首发版本openUBMC 26.09
废弃状态正常可用

D-Bus 签名:a{ss}ssa(ssss)u

参数说明

参数名方向类型描述取值范围
上下文输入a{ss}框架调用上下文。调试可传 0
Owner输入s对象所有者 App 名称。非空;需与 MDS / Owners 中的名称一致,如 hwdiscoveryhwproxy
Position输出s组件 Position。与对象组路径中的 Id 相同;对象组未登记时仍返回路径上的 Position。
Objects输出a(ssss)对象数组,每项见下表。无匹配对象时为空数组。
LifeCycleId输出u生命周期标识。对象组不存在时实现返回默认值 1

Objects 单项(ObjectInfo):

字段类型描述
ClassNames类名,如 ConnectorChip
ObjectNames重命名后的对象名,通常带 _${Position} 后缀。
ObjectPropss对象属性 JSON 字符串。内部先按 serialize 解码再 cjson.encode
ObjectExtendss扩展属性 JSON 字符串。解析阶段写入的字段包括 PathBomBoardIdAuxId@Parent@ChildrenFramework

Frameworktrue 表示该对象被标记为框架依赖对象(本组件对象及其引用闭包)。

返回值与异常

成功返回上述三元组。Position 在组件表中不存在时返回该 Position、空数组和 LifeCycleId=1,不抛 D-Bus 错误。mds/errors.json 仅定义 kepler.hwdiscovery.Unkown(拼写与源码一致),本方法成功路径不使用该错误。

应用场景

业务 App 在对象组上树后拉取本组件对象;hwdiscovery 自身也用 Owner=hwdiscovery 把 Connector 等框架对象交给 object_manage

限制条件

  • Owner 必须与对象 app_name 精确匹配。
  • ObjectProps / ObjectExtendsserialize 解码失败,对应字符串为空(日志 transfer serialize string failed)。
  • 调用会计入硬件初始化完成等待的 GetObjects 静默窗口(见 2.7)。

调试示例

bash
busctl --user call bmc.kepler.hwdiscovery \
    /bmc/kepler/ObjectGroup/01 \
    bmc.kepler.ObjectGroup GetObjects a{ss}s 0 hwdiscovery

Lua 侧(业务进程内,需已声明对 bmc.kepler.ObjectGroup 的依赖):

lua
local mdb = require 'mc.mdb'
local ctx = require('mc.context').get_context_or_default()
local obj_group = mdb.get_object(bus, '/bmc/kepler/ObjectGroup/01', 'bmc.kepler.ObjectGroup')
local position, objects, life_cycle_id = obj_group:GetObjects(ctx, 'hwproxy')

2.3 GetBinaryObjects

功能说明

GetObjects 相同的过滤逻辑,但 ObjectProps / ObjectExtendsserialize 二进制(D-Bus ay)返回,避免 JSON 往返。hwdiscovery 在 setup 时用 Owner=hwdiscovery 调用本方法,再交给 object_manage.add_objects

属性内容
首发版本openUBMC 26.09
废弃状态正常可用

D-Bus 签名:a{ss}ssa(ssayay)u

参数说明

参数名方向类型描述
上下文输入a{ss}框架调用上下文。
Owner输入s对象所有者 App 名称。
Position输出s组件 Position。
Objects输出a(ssayay)ClassNameObjectName、二进制 ObjectProps、二进制 ObjectExtends
LifeCycleId输出u生命周期标识;对象组不存在时为 1

返回值与异常

与 2.2 相同:对象组不存在时返回空数组和 LifeCycleId=1

应用场景

框架高性能对象分发;需要自行 serialize.decode 的调用方。

限制条件

二进制内容是 Lua serialize 编码,不是 JSON、也不是普通 UTF-8 文本。

调试示例

bash
busctl --user call bmc.kepler.hwdiscovery \
    /bmc/kepler/ObjectGroup/01 \
    bmc.kepler.ObjectGroup GetBinaryObjects a{ss}s 0 hwdiscovery

2.4 GetTopology

功能说明

返回该对象组的管理拓扑字符串,供 hwproxy 建立芯片/总线链路。拓扑在 CSR 流水线 append 阶段由 ManagementTopology 展开生成,并以 serialize 编码后存入组件记录。

属性内容
首发版本openUBMC 26.09
废弃状态正常可用

D-Bus 签名:a{ss}s

参数说明

参数名方向类型描述
上下文输入a{ss}框架调用上下文。
Topology输出s拓扑数据。传统 CSR 路径为 serialize 编码的层级表;设备树路径见限制条件。

返回值与异常

  • 传统路径(FormatVersion 小于 3.1):返回持久化的拓扑字符串。
  • 设备树路径(FormatVersion3.15.0 之间且 device_processed=true):实现会调用 add_devmon_object,经 .parser_servicebmc.kepler.devmonbmc.dev.AddDevice 转发 CSR,本方法返回空字符串
  • Position 不在组件表中:返回空字符串。

应用场景

hwproxy 在对象组上树后获取总线、Chip、Connector 层级关系。

限制条件

不要把返回值当作 JSON 解析。设备树格式不要期望本方法返回可用拓扑文本。

调试示例

bash
busctl --user call bmc.kepler.hwdiscovery \
    /bmc/kepler/ObjectGroup/01 \
    bmc.kepler.ObjectGroup GetTopology a{ss} 0

2.5 bmc.kepler.Connector

功能说明

连接器对象,描述下级板卡身份、在位、总线和识别方式。对象由 CSR 中的 Connector_* 上树,路径中的 ID 为重命名后的对象名。

路径/bmc/kepler/Connector/${ID}

模型中仅出现在接口上的属性如下。ChipContainerPositionIdChipAddrCSRVersion 定义在 mds/model.json / schema.json 中,usage 含 CSR,用于自描述解析,不在 bmc.kepler.Connector 接口属性表上。

参数说明

属性类型读写默认值说明
Boms只读""下级板卡 Bom 标识。
Sloty可写0下级板卡槽位号。
Presencey可写0在位状态:0 不在位,1 在位,255 初始化(接口描述)。变化会触发下级发现/卸载。
Ids可写""下级板卡 BoardId / UID。
AuxIds可写""下级板卡辅助标识。
Busesas只读[]与下级板卡关联的总线名列表。
SystemIdy只读1系统标识。
ManagerIds只读"1"管理标识。
SilkTexts只读""丝印。
IdentifyModey只读0识别方式,见下表。
Types只读""后端设备类型,如 PCIeSlotExpandBoard
ChassisIds只读""机框标识。
HotPluggableb只读true是否支持热插拔;下级 CSR Anchor.HotPluggable 会回写。上树时实现先置为 true
GroupIdu只读0对象组 Id。
GroupPositions只读""下级组件 Position,由本级 Position 后缀与 Connector Position 拼接。
LoadStatusy只读255下级加载状态,见 5.2。

IdentifyModesrc/lualib/common/define.luacomponent_type):

取值符号含义
0COM_ROOTBMC 芯片所在管理板(root.sr)。
1COM_ID_READBoardId 可读,通常用 Accessor 引用。
2COM_ID_REPORTBoardId 不可读,由多样化硬件上报;初始 Presence 须为 0
3COM_E2P标准组件,CSR 在 EEPROM 中。
4COM_MCU标准组件,CSR 在 MCU 中。
5COM_FLASH非标组件,传统硬件。

返回值与异常

读写走 bmc.kepler.Object.Properties。非法类型由框架校验抛错。

应用场景

查询板卡在位与加载结果;IdentifyMode=2 时由外部写 Presence / Id / AuxId 触发发现。

限制条件

  • EEPROM 标准组件(IdentifyMode=3)在读取 Presence 时会先访问关联 Chip.Read,Chip 未上树会导致本次读取失败并沿用上次缓存 Presence。
  • 同一 SR 内不同 Connector 的 Position 不能相同(决定 GroupPosition 唯一性)。
  • 上级 Connector.Buses 与下级 Anchor.Buses 按顺序配对;当前实现对数量不一致打 WARN(unmatched anchor buses)后仍继续,缺少的项无法建立映射。

调试示例

bash
busctl --user introspect bmc.kepler.hwdiscovery \
    /bmc/kepler/Connector/Connector_EXU_1_01

busctl --user get-property bmc.kepler.hwdiscovery \
    /bmc/kepler/Connector/Connector_EXU_1_01 \
    bmc.kepler.Connector Presence

2.6 Reload

功能说明

按给定 Bom / Id / AuxId / IdentifyMode 重新加载该连接器的下级组件:先在 LoadStatus==0 时卸载已加载子树,再按新身份发现。

属性内容
首发版本openUBMC 26.09
废弃状态正常可用

D-Bus 签名:a{ss}sssy → 空。权限:BasicSettingmds/model.json)。

参数说明

参数名方向类型描述
上下文输入a{ss}调用上下文;成功/失败写操作日志。
Bom输入s连接器 Bom。
Id输入s连接器 BoardId。
AuxId输入s连接器 AuxId。
IdentifyMode输入y写入 Connector 的识别方式。

方法无出参。实际加载在 skynet.fork_once 中排队执行(skynet.queue),调用返回不表示发现已完成。

返回值与异常

成功无返回。对象路径无法解析出 ObjectName / Position 时,Lua 侧 mdb.get_object 会失败。加载结果体现在后续 LoadStatus 与操作日志 Reload %s successfully / Reload %s failed

应用场景

维护场景强制按指定身份重新发现板卡;集成测试中模拟更换 CSR。

限制条件

  • 仅当原组件 LoadStatus 为成功(0)时先执行卸载。
  • 不支持热插拔的连接器,Presence 下降时不会卸载(日志 hotplug NOT supported, skip unload);Reload 仍走 connector_reload
  • 发现失败最多重试 MAX_RETRY_COUNT2)次。

调试示例

bash
busctl --user call bmc.kepler.hwdiscovery \
    /bmc/kepler/Connector/Connector_EXU_1_01 \
    bmc.kepler.Connector Reload a{ss}sssy \
    0 12345678 00000001010100000001 0 3

2.7 MicroComponent 与硬件初始化状态

功能说明

框架在 /bmc/kepler/hwdiscovery/MicroComponent 注册标准微组件接口。hwdiscovery 额外实现:

  • discovery:start 将状态设为硬件初始化(HW_INIT_DES),完成后设为硬件初始化完成(HW_INIT_COMPLETED_DES)。
  • debug.on_dump:一键收集,见第 4 章。
  • debug.dlog_level_change / dlog_type_change:转发到 .parser_service
  • reboot.on_action:返回 0

完成等待由环境变量控制(discovery.lua):

环境变量默认含义
HW_INIT_COMPLETE_QUIET_SECOND10无连接器任务/解析活动后的静默秒数。
HW_INIT_COMPLETE_GET_OBJECTS_QUIET_SECOND0距最近一次 GetObjects/GetBinaryObjects 的静默秒数。
HW_INIT_COMPLETE_MAX_WAIT_SECONDS120最长等待,超时仍标记完成。

参数说明

标准 HealthCheck / Dump / SetDlogLevel 签名由 libmc4lua 框架提供,本组件未再声明自定义方法。

返回值与异常

HealthCheck 返回值约定见 libmc4lua 文档。Dump 目录由调用方传入。

应用场景

判断自发现是否已走出硬件初始化;收集 connectors 与 CSR 快照。

限制条件

超时完成只表示等待结束,不保证所有 Position 的 LoadStatus 为 0。

调试示例

bash
busctl --user introspect bmc.kepler.hwdiscovery \
    /bmc/kepler/hwdiscovery/MicroComponent

2.8 无 IPMI 命令、无独立 Lua 公开模块

功能说明

仓库没有 mds/ipmi.json。解析、发现、插件均为进程内 Lua 实现,不通过 require('hwdiscovery') 向其他 App 导出稳定 Lua API。其他组件应使用本节 D-Bus 接口及 mc.mdb.object_manage

参数说明

不适用。

返回值与异常

不适用。

应用场景

避免把内部模块(discoveryparser_workmodule.sdr.*)当作跨组件 API。

限制条件

.parser_serviceparser_msg 仅供本进程使用。

调试示例

无。


3. 组件扩展案例

3.1 扩展能力概述

hwdiscovery 的主要扩展面是机型 CSR 与客户定制,而不是新增 D-Bus 方法。运行时插件目前核实到 PSR 路径上的 unit_configuration(UID → Slot)。热修复通过 plugins.fix.load_all_patches('hwdiscovery') 加载。不要手工修改带生成标记的 gen/ 文件。

3.2 扩展点说明

扩展点位置触发时机
机型 CSRPROG_CSR_PATH(默认 /opt/bmc/sr)的 root.sr / platform.sr / {Bom}_{Id}_{AuxId}.sr上电自发现
客户定制 CSR/opt/bmc/extend/{customer}/sr/{name}_cust.sr与基础 CSR 的 Objects 合并
定制索引同目录 index.jsonRules仅客户定制层;机型定制目录不读索引
机型定制目录CUSTOMER_CSR_PATH{platform_id}_{board_id}/sr/产品级覆盖
IdentifyMode / ConnectorCSR Objects 中的 Connector_*下级发现
PSR 插件src/lualib/module/plugin/unit_configuration.luaPSR 对象上树后更新 Connector.Slot
对象组/连接器接口mds/model.json + mdb_interfacebingo gen新增 D-Bus 方法时
Dumpsrc/lualib/common/dump.luaMicroComponent.Debug.Dump

CSR 变量(define.csr_variable):${Slot}${SystemId}${ManagerId}${Container}${GroupId}${ChassisId}${GroupPosition}${SilkText}${Bom}

3.3 二次开发指导

3.3.1 机型增加一块可发现板卡

  1. 在上级 SR 增加 Connector_*,配置 BomPositionBusesIdentifyModePresence(及 Mode=1 时的 Id 引用,Mode=3 时的 Chip 引用)。
  2. 在下级 SR 的 ManagementTopology.Anchor.Buses 中按顺序对应上级 Buses
  3. 将下级 SR 放到程序区或由 EEPROM 承载,文件名与 {Bom}_{Id}_{AuxId} 规则一致。
  4. 重启 hwdiscovery 或对连接器 Reload

验证方法busctl --user tree bmc.kepler.hwdiscovery 出现新的 ObjectGroup;LoadStatus0;业务服务树上出现带 Position 后缀的对象。

注意事项:Mode=2 时 Presence 初始必须为 0,否则无法正确触发上报式发现。

3.3.2 客户定制 CSR

{name}_cust.sr 放到 /opt/bmc/extend/{customer}/sr/。同名对象合并属性,新对象加入。删除软件对象时使用顶层 Customization.DeletedObjects。不要删除 I2c_*Eeprom_*Connector_*Scanner_* 等硬件/拓扑对象。

一批部件共用同一份定制时,使用 index.jsonPrefix / SuffixMatchedFile 不含路径分隔符或 ..)。规则优先级:Prefix 优于 Suffix;同类中 Pattern 更长者胜。

3.3.3 新增资源协作方法

  1. mdb_interface 与本仓 mds/model.json 声明方法。
  2. bingo gen 生成 Impl*
  3. hwdiscovery_app:register_callback 中绑定实现。
  4. 同步更新本文第 2、4、5、6 章。

示例:现有 Reload 绑定:

lua
self:ImplConnectorConnectorReload(function(obj, ctx, ...)
    self.discovery:reload(obj, ctx, ...)
end)

4. 日志说明

组件使用 mc.loggingdist/config.cfg 设置 logger = "/data/var/log/bmc/hwdiscovery.log"。另有 log:hw_stream_*log:operation

4.1 一键日志收集

HwdiscoveryApp 注册 mc.mdb.micro_component.debug.on_dump,回调 discovery:dump。收集目录(相对 Dump 传入路径)主要包括:

文件内容
connectors.txt连接器树与属性快照
root.sr / platform.sr实际加载的根 / 平台 CSR 副本
{connector}.sr.bin各连接器 CSR;可能另有 {connector}_soft.sr
额外 EEPROM 二进制必要文件复制后再读,最多 65 份(MAX_EEPROM_DUMP_NUM

写文件失败时打 dump hwdiscovery information failed

4.2 关键日志信息

日志片段日志级别含义解读建议处理动作
app start to hardware self-discoveryNOTICE开始自发现
position: 01, get root sr failedERROR读不到 root.sr检查 PROG_CSR_PATH 与机型文件
position: 00, get platform sr failedWARN读不到 platform.sr确认是否需要软件对象
start to process sr dataNOTICE开始解析某 Position记录 source / FormatVersion / DataVersion
process sr data failedERROR解析流水线失败结合紧随的 err 与 5.1
process sr data successfully / setup resource tree successfullyNOTICE解析并上树完成
analyse sr data failedERROR解析服务失败.parser_service 与 CSR JSON
unmatched anchor busesWARN上下级 Buses 数量不一致核对 Connector 与 Anchor
get current anchor buses failedERROR缺少 ManagementTopology.Anchor.Buses补齐 CSR
expression level exceeds limitERROR表达式超过 10 级简化 `
circular references of object definition in sr are forbiddenERROR对象定义成环检查 @Parent / 引用
no valid CSR sourceERROR各数据源都未读到合法 CSR对照 5.1 数据源
Reload %s successfully / failedoperationReload 结果LoadStatus
HW init completion wait finished, status: ready/timeoutNOTICE硬件初始化等待结束timeout 时逐 Position 查 LoadStatus
Connector task failedERROR连接器发现协程异常保存 err 与 connector 名

5. 问题定界指南

5.1 典型问题定界

问题描述是否为本组件问题判断依据关键证据收集方法
业务树上没有预期对象可能是ObjectGroup 未上树或 Owner 不匹配busctl treeGetObjects 指定 Owner;日志 setup resource tree
GetObjects 返回空但 Owners 含该 App可能是生命周期未更新或对象 app_name 不一致对比 MDS 应用名与 Owners
LoadStatus 非 0是或硬件/CSR加载阶段失败码见 5.2Dump connectors.txt、Chip/EEPROM、CSR 版本
Presence 已 1 但未发现可能是Mode=3 时 Chip 未上线;Mode=2 初始 Presence 非 0introspect Connector 与关联 Chip
GetTopology 为空可能是预期行为设备树格式会转发 devmon 并返回空串查 FormatVersion 与 devmon
IPMI 命令失败本组件无 IPMI 接口转向业务组件 / ipmi_core
require 找不到 hwdiscovery Lua API无跨进程 Lua 模块改用 D-Bus 与 object_manage

5.2 错误码速查表

Connector.LoadStatusinclude/hwproxy/plugins/eeprom/status.lua):

符号含义
0SUCCESS加载成功
1DEVICE_ACCESS_ERROR器件访问失败
2SIGN_VERIFY_ERROR签名校验失败
3DATA_FORMAT_ERROR数据格式非法
4LOCAL_FILES_ERROR本地文件未找到
5OBJECT_PARSING_ERROR对象解析失败
6INTEGRITY_VERIFY_ERROR完整性校验失败
7FORMAT_VERSION_ERROR格式版本检查失败
255INITIAL_STATUS初始化 / 已卸载重置

资源协作错误mds/errors.json):

名称HTTPIPMI含义
kepler.hwdiscovery.Unkown4000xFF源码消息为 Unkown error.(拼写与仓内一致)

ObjectGroup 三个 Get 方法在实现中不以该错误名返回失败,缺对象组时返回空数据。

5.3 最小化复现与证据收集

  1. 记录 Position、Connector 对象名、IdentifyMode、Presence、LoadStatus、Owner。
  2. busctl --user tree bmc.kepler.hwdiscovery,确认 ObjectGroup 与 Connector。
  3. 对目标 ObjectGroup 调用 GetObjects / GetTopology
  4. 检索 hwdiscovery 日志中的 Position 关键字与 4.2 节片段。
  5. 执行一键收集,保存 connectors.txt 与复制出的 .sr

5.4 调试方法

bash
busctl --user tree bmc.kepler.hwdiscovery
busctl --user introspect bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/01
busctl --user call bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/01 \
    bmc.kepler.ObjectGroup GetObjects a{ss}s 0 hwproxy
  • 单元测试:test/unit/(如 test_discovery.luatest_sdr/test_hwcomponent_hotplug.lua)。
  • 集成测试:test/integration/test_hwdiscovery.lua
  • 不要在生产环境改 Presence / Reload 做破坏性试验。

CSR 数据源(dist/config.cfg / manage.csr_paths):

路径环境变量用途
/opt/bmc/srPROG_CSR_PATH程序区内置 CSR
/data/opt/bmc/srDATA_CSR_PATH数据区
/data/opt/bmc/sr/goldFLASH_GOLD_CSR_PATHFlash 金区
/data/opt/bmc/sr/tempFLASH_TEMP_CSR_PATHFlash 临时区
/opt/bmc/extendCUSTOMER_CSR_PATH客户/机型扩展
/dev/shm/importIMPORT_CSR_PATH导入 CSR

6. 常见问题解答

框架侧排障步骤(对象未分发、CSR 版本比较、Connector 配置样例等)见 FAQ 文档 zh/development/faq/framework/hwdiscovery.md,本节只覆盖资源协作接口使用问题。

Q1:如何确认某 App 是否已从对象组拿到对象?

  • 问题描述:业务服务树缺少带 Position 后缀的对象。
  • 一句话答案:先看 ObjectGroup 是否上树、Owners 是否包含该 App,再用 GetObjects 按 Owner 拉取。
  • 根因说明:对象只在解析后的 app_name 与 Owner 一致时返回;未上树或 Owner 拼写不同都会表现为“没对象”。
  • 解决方案:busctl tree 找到 /bmc/kepler/ObjectGroup/<position>,读取 Owners,调用 GetObjects
  • 规避方案:业务 service.json 声明对 bmc.kepler.ObjectGroup 的依赖,并用 object_manage.on_add_object 消费,而不是轮询猜测路径。
  • 适用版本:1.130.20。

Q2:GetObjectsGetBinaryObjects 应如何选择?

  • 问题描述:调试时二进制结果不可读。
  • 一句话答案:人工调试用 GetObjects(JSON 字符串);框架分发用 GetBinaryObjectsserialize 字节)。
  • 根因说明:二者过滤逻辑相同,编码不同。
  • 解决方案:busctl 调试使用 2.2;不要对 ay 做 JSON 解析。
  • 规避方案:Lua 业务优先走 object_manage,避免手写解码。
  • 适用版本:1.130.20。

Q3:Reload 调用立刻返回,板卡却未换上新 CSR?

  • 问题描述:方法无出参,调用成功但 LoadStatus 仍旧。
  • 一句话答案:Reload 只把任务投入队列,完成与否看后续 LoadStatus 和操作日志。
  • 根因说明:discovery:reload 使用 skynet.fork_once + queue,D-Bus 返回早于发现结束。
  • 解决方案:等待 LoadStatus255 变为 0 或其他失败码;检索 Start to reload / Reload %s successfully
  • 规避方案:自动化里轮询 LoadStatus,不要把 D-Bus 返回当作发现完成。
  • 适用版本:1.130.20。

Q4:IdentifyMode=2 的板卡为什么一直不发现?

  • 问题描述:上报型连接器下级 ObjectGroup 不出现。
  • 一句话答案:该模式依赖外部把 Presence 从 0 写成在位,并填写 Id/AuxId
  • 根因说明:实现把 Mode=2 的初始 Presence 约定为 0;非 0 会跳过上报触发。身份也不是从 EEPROM 读取。
  • 解决方案:由多样化硬件或调试写入 Presence=1 及 BoardId;必要时再 Reload
  • 规避方案:CSR 中 Mode=2 的 Presence 固定写 0
  • 适用版本:1.130.20。

Q5:GetTopology 返回空,hwproxy 拓扑是否失败?

  • 问题描述:传统机型能拿到拓扑,新格式返回空字符串。
  • 一句话答案:FormatVersion 落在 3.1~5.0 时走设备树路径,拓扑改为 devmon.AddDevice,本方法返回空。
  • 根因说明:device_processed 为真时 get_topology 调用 add_devmon_object 后返回 ''
  • 解决方案:查 CSR FormatVersion 与 devmon 是否收到 AddDevice;传统 CSR 再查 process sr data failed
  • 规避方案:不要用 GetTopology 非空作为设备树机型的成功判据。
  • 适用版本:1.130.20。