VPD 重要产品数据(vpd)
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.90.125 |
| 组件类型 | configuration(配置包,无运行时服务) |
| 文档作者 | openUBMC |
| 最后更新 | 2026-10-27 |
1. 组件概述
1.1 组件简介
vpd(vital product data)是 openUBMC 的配置包:mds/service.json 中 type 为 configuration,仓内没有 Lua 业务代码,也不注册 D-Bus 服务。它承载"与硬件、机型强相关的配置数据",构建时按机型打包进固件,运行期由自发现等组件读取消费。
| 配置类别 | 承载内容 | 消费方 |
|---|---|---|
| 整机与部件配置(SR/CSR) | 板卡与部件的拓扑、总线、寄存器(Chip/Accessor/Scanner)、业务对象 | hwdiscovery 解析后由 hwproxy 与各业务组件消费 |
| 机型软件配置 | 调速、上下电策略、开关类机型差异项(platform.sr 等) | 对应业务组件 |
| 事件定义 | event_def.json、按机型裁剪后生成的 ibmcevents.json | event |
| 指标定义 | <机型>/metric/metrics.json | 指标采集/可观测组件 |
| 装备定制化 schema | <机型>/schema/*.json | profile_schema |
| 附属资源 | KVM 填充图、VCE 测试数据、日志轮转配置 | bmc_soc、remote_console、logrotate |
1.2 核心功能
- 机型配置打包:
board_name选项决定打包哪个机型目录;机型目录下的profile.txt逐行声明该机型要打包的 SR/CSR,未列出的文件不会进固件。 - 公共部件库:
board_name=common时把整个vendor/打包到include/vendor,供上层产品包引用,不含产品 SR。 - 事件定义裁剪:用机型的
event/eventDefList.txt过滤vendor/event_def.json,并调用registry.py生成ibmcevents.json。 - 产品差异化 schema:
<机型>/schema/*.json打包到opt/bmc/profile_schema/product,实现机型级装备定制差异。 - 扫描周期规范:Scanner 的
Period按 19 类场景取值(见 §4.5 Scanner 扫描周期规范),新增 Scanner 必须落在已有分类内。
1.3 关键术语
| 术语 | 解释 |
|---|---|
| SR / CSR | 硬件自描述文件(.sr / .csr),JSON 格式,描述总线、器件、寄存器与业务对象 |
| PSR | 整机级配置(Port/Platform Self-Description),描述整机拓扑与整机策略 |
| SR 3.0 | 当前 SR 格式,FormatVersion: 3.00,含 Unit、ManagementTopology、Objects 三段 |
| Bom | 单板物料编码,SR 文件名与 Connector.Bom 用它匹配 |
| Position / GroupPosition | 对象组位置,由上级 Connector 的 GroupPosition 与本级 Position(两位十六进制)拼接,如 01+01=0101 |
| profile.txt | 机型级打包清单,逐行列出要打进固件的 SR/CSR |
| Anchor / ManagementTopology | SR 的拓扑定义,Anchor 为根节点,其下按总线组织 Connectors、Chips |
| Chip / Accessor / Scanner | 器件、寄存器访问、周期扫描三类基础对象 |
| SmcDfxInfo | SMC 的 DFX 寄存器布局描述,见仓根目录 SmcDfxInfo配置说明.md |
| event_def / ibmcevents | 事件定义源文件与 event 组件使用的事件注册文件 |
| profile_schema | 装备定制项 schema,机型差异通过 <机型>/schema/*.json 覆盖 |
| soft SR | *_soft.sr,同一单板的软件侧补充配置,随主 SR 一起加载 |
1.4 外部交互边界
| 阶段 | 交互方 | 说明 |
|---|---|---|
| 构建期 | conan / bingo | 按 board_name 选择机型目录,按 profile.txt 打包,生成 ibmcevents.json |
| 运行期 | hwdiscovery | 从 /opt/bmc/sr、/opt/bmc/csr 读取 SR,解析、重命名、按对象组发布到资源树 |
| 运行期 | hwproxy | 读取 SR 中 Chip/Accessor/Scanner 描述的寄存器访问信息 |
| 运行期 | 各业务组件 | 按 mds/schema.json 拉取归属本组件的对象 |
| 运行期 | event | 读取 opt/bmc/conf/event_def.json 与 opt/bmc/apps/event/ibmcevents.json |
2. 接口说明
2.1 不提供资源协作接口
依据:mds/service.json 中 type 为 configuration、required 为空,仓内无 Lua 服务代码,因此 vpd 不提供资源协作接口、RPC 方法、IPMI 命令与信号。本章只说明"配置交付到哪里、运行期怎么核对"。
2.2 交付物与固件内路径
打包逻辑在 conanfile.py,映射关系如下。
| 仓库内来源 | 固件内路径 | 说明 |
|---|---|---|
profile.txt 中列出的 .sr | opt/bmc/sr/<文件名> | 机型实际加载的自描述文件;目标目录由扩展名决定(.sr → opt/bmc/sr) |
vendor/**(仅 board_name=common) | include/vendor/ | 公共部件库 |
<机型>/metric/metrics.json | opt/bmc/metric/metrics.json | 指标定义 |
<机型>/schema/*.json | opt/bmc/profile_schema/product/ | 产品差异化定制 schema |
vendor/event_def.json(按机型过滤) | opt/bmc/conf/event_def.json | 裁剪后的事件定义 |
由 registry.py 生成的 ibmcevents.json | opt/bmc/apps/event/ibmcevents.json | event 组件使用的注册文件 |
vendor/Huawei/BMCSoC/hi1711/kvm_padding_image/*.jpeg | opt/bmc/soc/kvm/ | KVM 填充图 |
vendor/Huawei/BMCSoC/hi1711/vce_dft_data/*.dat | opt/bmc/apps/remote_console/dft_data/ | VCE 测试数据 |
vendor/Huawei/BMCSoC/hi1711/logrotate_config/{frame,nginx} | etc/logrotate.d/ | 日志轮转配置 |
dist/permissions.ini | 包根目录 | 文件权限清单;非 common 包会追加 ibmcevents.json 权限 |
运行期核对方式:
# 固件里实际存在哪些 SR
ls /opt/bmc/sr | head
# 资源树上的连接器与部件对象(由 hwdiscovery 解析 SR 后创建)
busctl --user tree bmc.kepler.hwdiscovery | grep -i connector
mdbctl lsobj Connector3. 组件扩展案例
不适用。vpd 的"扩展"指新增机型或新增部件配置,操作步骤见 §4.9 新增机型或新增部件的接入步骤。
4. 配置介绍
4.1 仓库目录组织
vpd/
├── mds/service.json # 组件元数据与 board_name 选项
├── conanfile.py # 打包逻辑(机型选择、profile.txt 解析、事件裁剪)
├── registry.py # event_def.json → ibmcevents.json 生成
├── dist/permissions.ini # 文件权限清单
├── SmcDfxInfo配置说明.md # SmcDfxInfo 字段说明
├── 硬盘、板卡兼容性说明.md # 网卡/硬盘/RAID 支持范围
└── vendor/
├── event_def.json # 全量事件定义
├── Huawei/Server/Kunpeng/<机型>/ # 整机配置:root.sr、platform/、PSR/、metric/、schema/、event/
├── Huawei/TianChi/… # 天池部件(所有机型通用)
├── <厂商>/Nic/… # 网卡、RAID、光模块等部件 SR
└── Customer/… # 客户定制board_name 取值:common、openUBMC、S920H20、S920X20、PR2715B(见 mds/service.json)。构建时 conanfile.py:get_board_path() 在 vendor/Huawei/Server/* 与 vendor/Powerleader/Server/* 下查找同名目录。
4.2 机型打包清单 profile.txt
profile.txt 每行一个文件,路径相对 vendor/,只打包列出的内容:
Huawei/Server/Kunpeng/S920H20/platform/platform.sr
Huawei/Server/Kunpeng/S920H20/root.sr
Huawei/Server/Kunpeng/S920H20/PSR/14100513_00000001040302023953_920.sr
Mellanox/CX-5/Optical/14140130_15b31017_15b30006.sr规则:
- 只写文件名、不写目标路径,目标目录由扩展名决定(
.sr→opt/bmc/sr); - 同一机型共用的部件配置放
vendor/Huawei/TianChi、vendor/<厂商>/Nic等目录,再在profile.txt里引用; board_name=common走另一条分支:不读profile.txt,直接把整个vendor/打进include/vendor。
4.3 SR 文件结构
{
"FormatVersion": "3.00",
"DataVersion": "3.17",
"Unit": {
"Type": "EXU",
"Name": "ExpBoard_1"
},
"ManagementTopology": {
"Anchor": {
"Buses": ["I2c_1", "I2c_2"]
},
"I2c_2": {
"Connectors": ["Connector_EXU_1"]
}
},
"Objects": {
"Connector_EXU_1": {
"Bom": "14100513",
"Slot": 1,
"Position": 1,
"Presence": 1,
"Buses": ["I2c_2"],
"SystemId": 1,
"ChassisId": "1",
"SilkText": "EXU",
"IdentifyMode": 2
}
}
}| 字段 | 说明 |
|---|---|
FormatVersion | SR 格式版本,当前为 3.00 |
DataVersion | 数据版本,随配置内容升级 |
Unit.Type / Unit.Name | 单板类型与名称,用于日志与对象命名 |
ManagementTopology | 拓扑:Anchor 为根,Buses 列出总线;每条总线下列出挂载的 Connectors/Chips |
Objects | 对象集合:key 为对象名,value 为该对象的属性 |
对象通用字段:
| 字段 | 说明 |
|---|---|
Bom | 单板物料编码,与 SR 文件名前缀对应 |
Slot / Position | 槽位号与位置号,参与 GroupPosition 计算 |
Presence | 在位标志(0 不在位 / 1 在位) |
Id / AuxId | 与 EEPROM 中记录的单板标识,用于匹配具体单板 |
Buses | 该连接器下挂的总线列表 |
SystemId / ChassisId / ManagerId | 所属系统、机框、管理系统,参与对象路径 |
SilkText | 丝印,用于日志与定位 |
IdentifyMode | 识别方式,对应 hwdiscovery 的 component_type:0 管理板、1 板卡 ID 可读、2 板卡 ID 不可读、3 标准组件(CSR 在 EEPROM)、4 标准组件(CSR 在 MCU)、5 非标组件 |
4.4 对象与引用语法
| 语法 | 含义 | 示例 |
|---|---|---|
#/对象名 | 同文件内引用其它对象(引用对象或属性) | "Chip": "#/Smc_ExpBoardSMC" |
<=/对象名.属性 | 同步属性:值跟随被引用属性变化 | "UidButtonScanner": "<=/Scanner_UIDButtonEvent.Value" |
${变量} | CSR 变量替换,如 ${Slot}、${SystemId}、${ChassisId}、${GroupPosition} | "Slot": "${GroupId}" |
|> expr(...) | 表达式,对同步值做运算 | "IntrusionACOn": "<=/Scanner_Gpio72.Value |> expr($1 == 0 ? 1 : 0)" |
典型对象片段(取自现网 SR):
"Connector_PSR_EEP": {
"Bom": "14100513", // 单板物料编码
"Slot": 1,
"Position": 10, // 参与 GroupPosition
"Presence": 1, // 在位
"Buses": ["I2c_8", "I2c_2"],
"SystemId": 1,
"ChassisId": "1",
"SilkText": "PSR",
"IdentifyMode": 3
},
"Accessor_PcbID": { // 寄存器访问
"Chip": "#/Smc_ExpBoardSMC", // 引用本文件内的 Chip 对象
"Offset": 1792,
"Size": 2,
"Mask": 15,
"Type": 0,
"Value": 0
},
"Scanner_SerdesLom1CardType": { // 周期扫描
"Chip": "#/Smc_ExpBoardSMC",
"Offset": 134235392,
"Size": 2,
"Mask": 1,
"Type": 0,
"Period": 2000, // 扫描周期,单位 ms
"Value": 0
},
"Chip_UsbCc_On": { // 器件
"Address": 66,
"OffsetWidth": 1,
"AddrWidth": 1,
"WriteTmout": 0,
"ReadTmout": 0,
"HealthStatus": 0
},4.5 Scanner 扫描周期规范
Period 必须落在下列分类内;新增 Scanner 不属于现有分类时,需先评审并刷新分类(出处:仓 README.md)。
| 场景 | 周期 |
|---|---|
| BCU/EXU 的 PowerGood 告警 | 100 ms |
| 影响业务的离散电压、时钟告警、CPU 故障告警 | 400 ms |
| 业务关键状态(系统复位、上电超时、异常掉电、ThermTrip) | 400 ms |
| 故障诊断的故障检测 | 1 s |
| 硬盘类状态扫描 | 5 s |
| 不影响业务的硬件状态 | 5 s |
| 热插拔部件在位状态 | 2 s |
| 非热插拔部件在位扫描 | 8 s |
| 门限类温度扫描 | 1 s |
| 门限类电压扫描 | 3 s |
| 纽扣电池扫描 | 10 s |
| 风扇转速扫描 | 1 s |
| RTC 时间同步 | 6 s |
| 按钮交互类(如 UID 按钮) | 1 s |
| 风扇、电源总功耗扫描 | 1 s |
| 光模块温度 | 10 s(连续 12 次失败判定异常) |
| 面板电源按钮 | 200 ms |
4.6 事件定义配置
vendor/event_def.json // 全量事件定义,含 EventDefinition 与 EventDescription
<机型>/event/eventDefList.txt // 该机型启用的事件 EventKeyId 清单,一行一个
<机型>/ibmcevents.json // 构建时由 registry.py 生成,打包到 opt/bmc/apps/event规则:
event_def.json中EventKeyId不允许重复,EventDescription引用的 ID 必须在EventDefinition中存在(conanfile.py:validate_event_json校验,重复或悬空会直接构建失败);- 机型没有
event/eventDefList.txt时,event_def.json会以空清单裁剪,只有该机型确实不需要事件时才可省略; ibmcevents.json是构建产物,不要手改。
4.7 产品定制化 schema
<机型>/schema/*.json 打包到 opt/bmc/profile_schema/product,用于机型级装备定制差异(示例:S920H20/schema/cooling.json、thermal_mgmt.json)。新增定制项时在该目录加同名 schema,不需要改 profile.txt。
4.8 SmcDfxInfo 配置
"SmcDfxInfo_EXU": {
"Chip": "#/Smc_ExpBoardSMC", // 采集所用 Chip
"Offset": 7424, // DFX 区起始偏移
"Size": 55, // 长度
"Period": 100, // 采集周期,单位 ms
"SmcVersion": 115, // 适用的 SMC 版本
"Config": { // 偏移 → 字段名/位宽映射
"1": { "cpld_ver": 255 },
"2": { "temp_lm75_front_low": 255 }
}
},字段含义与完整示例见仓根目录 SmcDfxInfo配置说明.md;Config 的 key 为字节序号(从 1 开始),value 为该字节内「信号名 → 掩码」的映射,Offset 为 SmcDfxInfo 区的偏移地址(一般为 7424)。
4.9 新增机型或新增部件的接入步骤
- 新增机型:在
vendor/<厂商>/Server/<系列>/<机型>/下放root.sr、platform.sr、PSR/*.sr等,写profile.txt,在mds/service.json的board_name.option中登记机型名; - 新增部件:按厂商归类放
vendor/<厂商>/<类别>/<型号>/<Bom>_<标识>.sr,在该部件适用的机型profile.txt中追加一行; - 事件:在
vendor/event_def.json增加定义,并把EventKeyId加到目标机型的event/eventDefList.txt; - 定制项:需要机型差异化时在
<机型>/schema/增加对应 schema; - 自检:
Bom/Slot/Position与硬件一致、Scanner 周期符合 §4.5 Scanner 扫描周期规范、SR 能被hwdiscovery正常解析(见 §5 日志说明)。
4.10 兼容性清单
网卡、硬盘、RAID 卡等部件的支持范围(型号、VID/DID、Sub VID/DID、是否支持 MCTP/NCSI、带外光模块信息、首次支持版本)维护在仓根目录 硬盘、板卡兼容性说明.md,新增部件时同步更新该表。
5. 日志说明
5.1 vpd 无运行日志
vpd 是配置包,运行期没有独立进程,因此不产生组件日志,也没有一键日志收集产物。配置是否生效,要看解析方(hwdiscovery)与消费方(业务组件)的日志。
5.2 SR 解析日志与一键收集
| 项 | 内容 |
|---|---|
| 解析日志 | /data/var/log/bmc/hwdiscovery.log(由 hwdiscovery/dist/config.cfg 的 logger 定义;轮转后可能是 hwdiscovery.log.1 等) |
| 一键收集 | dump_info/AppDump/hwdiscovery/connectors.txt:连接器层级与各连接器属性(不含 SR 文件路径) |
| 一键收集 | dump_info/AppDump/hwdiscovery/<Connector>.sr 或 .bin:该连接器实际加载的 SR,文件名即连接器名(.bin 表示 SR 来自 EEPROM) |
| 一键收集 | dump_info/AppDump/hwdiscovery/<Connector>_soft.sr:该连接器的软件侧补充 SR |
# 1) 确认日志文件与轮转情况
ls -l /data/var/log/bmc/hwdiscovery.log*
# 2) 查某个连接器加载的 SR:dump 时会打印
# "dump connector: <连接器> csr file: <源文件>, to <目标>"
CONN=Connector_EXU
grep -in "dump connector: .*${CONN}.*csr file" /data/var/log/bmc/hwdiscovery.log* | tail -3
# 3) 或在收集包解压目录里直接看:文件名就是连接器名
ls dump_info/AppDump/hwdiscovery/ | grep -i "$CONN"
CONN只是名称片段,grep -i做子串匹配(连接器名带位置后缀,如Connector_Exu_1_01),按实际连接器名替换。 SR 解析阶段本身按对象组position打日志(position: %s, load sr data successfully),需要结合connectors.txt的层级关系才能定位到具体连接器。
5.3 关键日志
| 日志片段 | 级别 | 含义 | 建议处理动作 |
|---|---|---|---|
failed to load schema: open path failed, path: %s, err: %s | error | 组件 schema 加载失败 | 核对 SR 中对象所属组件的 mds/schema.json 是否存在 |
Failed to create connector object: %s | error | 连接器对象创建失败 | 检查该 Connector 的 Bom/Slot/Position 与 SR 文件名是否匹配 |
arrange objects failed, err: multi-parent relationship in sr is forbidden | error | 同一对象被多个父节点引用 | 修正 ManagementTopology,一个对象只能有一个父节点 |
connector: %s check ref connector presence exit | notice | 引用连接器在位检查提前退出 | 结合 Presence 与上层连接器拓扑核对 |
dump hwdiscovery information failed | warn | 一键收集写 connectors.txt 失败 | 检查一键收集目录权限与磁盘空间 |
6. 问题定界
| 现象 | 是否本仓问题 | 判断依据 | 证据收集 |
|---|---|---|---|
| 改了 SR 但对象没变化 | 先查本仓 | 该 SR 是否在 profile.txt 中、是否打进固件 | ls /opt/bmc/sr | grep <Bom>;grep -n "<文件名>" <机型>/profile.txt |
| 部件对象缺失 | 先查本仓 | SR 是否正确、是否被解析 | dump_info/AppDump/hwdiscovery/connectors.txt 中是否有该连接器与其 SR |
| 传感器/风扇等数值不对 | 多半不是本仓 | SR 只描述寄存器,值由 hwproxy 采集 | 对同一 Chip/Offset 用 busctl 读 Accessor 值比对 |
| 事件上报缺项 | 本仓或机型清单 | 机型 eventDefList.txt 未列该 EventKeyId | grep <EventKeyId> <机型>/event/eventDefList.txt vendor/event_def.json |
| 机型打包后少了配置 | 本仓 | profile.txt 漏配或 board_name 不是该机型 | bingo build 时确认 board_name,检查包内 opt/bmc/sr 清单 |
7. 常见问题解答
| 问题 | 处理 |
|---|---|
| 新增一个部件的 SR,放哪个目录? | 按"厂商/类别/型号"放 vendor/<厂商>/…,再在用到它的机型 profile.txt 里加一行;天池通用件放 vendor/Huawei/TianChi |
为什么 common 包里没有产品 SR? | board_name=common 只打包 include/vendor 公共库,产品 SR 由上层定制包引入 |
| 改完 SR 要重新出包吗? | 要。SR 是构建期打包进固件的,改完需重新构建并升级 |
_soft.sr 是什么? | 同一单板的软件侧补充配置,随主 SR 一起加载;一键收集中以 <Connector>_soft.sr 出现 |
| Scanner 周期能随便填吗? | 不能,必须落在 §4.5 Scanner 扫描周期规范 的分类内;新增场景需先评审分类 |
ibmcevents.json 能直接改吗? | 不能,它是 registry.py 依据 event_def.json + eventDefList.txt 生成的构建产物 |
附录
附录A 参考资料
- 仓内文档:
README.md(目录规划与 Scanner 周期)、SmcDfxInfo配置说明.md、硬盘、板卡兼容性说明.md - SR 解析与对象发布:hwdiscovery 接口规格
- 组件对象模型:
mdb_interface(json/intf/mdb/bmc/kepler/)与各组件mds/schema.json - 组件源码仓库:
https://gitcode.com/openUBMC/vpd