代码仓
中
更新时间: 2026/11/03
在AtomGit上查看源码

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.jsonevent
指标定义<机型>/metric/metrics.json指标采集/可观测组件
装备定制化 schema<机型>/schema/*.jsonprofile_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 / ManagementTopologySR 的拓扑定义,Anchor 为根节点,其下按总线组织 Connectors、Chips
Chip / Accessor / Scanner器件、寄存器访问、周期扫描三类基础对象
SmcDfxInfoSMC 的 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 中列出的 .sropt/bmc/sr/<文件名>机型实际加载的自描述文件;目标目录由扩展名决定(.sr → opt/bmc/sr)
vendor/**(仅 board_name=common)include/vendor/公共部件库
<机型>/metric/metrics.jsonopt/bmc/metric/metrics.json指标定义
<机型>/schema/*.jsonopt/bmc/profile_schema/product/产品差异化定制 schema
vendor/event_def.json(按机型过滤)opt/bmc/conf/event_def.json裁剪后的事件定义
由 registry.py 生成的 ibmcevents.jsonopt/bmc/apps/event/ibmcevents.jsonevent 组件使用的注册文件
vendor/Huawei/BMCSoC/hi1711/kvm_padding_image/*.jpegopt/bmc/soc/kvm/KVM 填充图
vendor/Huawei/BMCSoC/hi1711/vce_dft_data/*.datopt/bmc/apps/remote_console/dft_data/VCE 测试数据
vendor/Huawei/BMCSoC/hi1711/logrotate_config/{frame,nginx}etc/logrotate.d/日志轮转配置
dist/permissions.ini包根目录文件权限清单;非 common 包会追加 ibmcevents.json 权限

运行期核对方式:

bash
# 固件里实际存在哪些 SR
ls /opt/bmc/sr | head

# 资源树上的连接器与部件对象(由 hwdiscovery 解析 SR 后创建)
busctl --user tree bmc.kepler.hwdiscovery | grep -i connector
mdbctl lsobj Connector

3. 组件扩展案例 ​

不适用。vpd 的"扩展"指新增机型或新增部件配置,操作步骤见 §4.9 新增机型或新增部件的接入步骤。

4. 配置介绍 ​

4.1 仓库目录组织 ​

plain
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/,只打包列出的内容:

plain
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 文件结构 ​

plain
{
  "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
    }
  }
}
字段说明
FormatVersionSR 格式版本,当前为 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):

plain
        "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 事件定义配置 ​

plain
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 配置 ​

plain
        "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 新增机型或新增部件的接入步骤 ​

  1. 新增机型:在 vendor/<厂商>/Server/<系列>/<机型>/ 下放 root.sr、platform.sr、PSR/*.sr 等,写 profile.txt,在 mds/service.json 的 board_name.option 中登记机型名;
  2. 新增部件:按厂商归类放 vendor/<厂商>/<类别>/<型号>/<Bom>_<标识>.sr,在该部件适用的机型 profile.txt 中追加一行;
  3. 事件:在 vendor/event_def.json 增加定义,并把 EventKeyId 加到目标机型的 event/eventDefList.txt;
  4. 定制项:需要机型差异化时在 <机型>/schema/ 增加对应 schema;
  5. 自检: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
bash
# 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: %serror组件 schema 加载失败核对 SR 中对象所属组件的 mds/schema.json 是否存在
Failed to create connector object: %serror连接器对象创建失败检查该 Connector 的 Bom/Slot/Position 与 SR 文件名是否匹配
arrange objects failed, err: multi-parent relationship in sr is forbiddenerror同一对象被多个父节点引用修正 ManagementTopology,一个对象只能有一个父节点
connector: %s check ref connector presence exitnotice引用连接器在位检查提前退出结合 Presence 与上层连接器拓扑核对
dump hwdiscovery information failedwarn一键收集写 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 未列该 EventKeyIdgrep <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