product_mgmt(产品信息管理)
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.140.3 |
| 首发版本 | 1.130.9 |
| 文档作者 | o1315548501 |
| 最后更新 | 2026-09-13 |
1. 组件概述
1.1 组件简介
product_mgmt 是 openUBMC 的产品信息管理应用。它以 Lua/Skynet 服务运行,维护产品、联系信息、BMC 软件信息和电子保单信息,并按构建特性提供资产清单、资产变更、可信供应链检查和系统报废能力。服务入口是 src/service/main.lua,主要初始化流程位于 src/lualib/product_mgmt_app.lua。
1.2 解决什么问题
该组件集中维护需要被其他系统组件读取的产品身份和定制信息,避免产品名、厂商信息、语言集合等数据分散管理;同时将电子保单、白牌升级、装备定制及可选资产安全能力接入同一服务生命周期。
1.3 核心功能
- 资产清单与可信资产变更:查询资产并维护信任记录;受
CONAN_DEFS_FEATURE_ASSET控制。
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| CSR | 模型中用于产品、联系信息等出厂/持久化数据的 usage 标记。 |
| 白牌定制 | 由 src/lualib/whilte_branding/ 处理的品牌资源和属性升级流程;目录名沿用代码中的 whilte_branding。 |
| 装备定制 | 由 src/lualib/custom/ 解析并应用定制设置的流程。 |
| 电子保单 | 产品接口维护的首次上电时间、服务起点和期限。 |
| 可信供应链 | 对选定系统配置生成基线并检测变化的可选功能。 |
| DFLC | 产品生命周期管理(Digital Warranty),维护首次上电时间、服务起始时间、服务年限 |
| DICE | Device Identifier Composition Engine,用于硬件组件完整性度量与签名 |
| RetireSystem | 报废处置流程,包含数据擦除与 BMC 恢复出厂 |
1.5 外部交互边界图
1.6 目录与模块职责
| 路径 | 职责 |
|---|---|
src/service/main.lua | 创建 Skynet 服务、构造应用,并在制造版本可用时加载制造扩展。 |
src/lualib/product_mgmt_app.lua | 初始化 D-Bus 模型、IPMI、电子保单、配置管理及可选特性。 |
src/lualib/obj_mgmt.lua | 注册 Product 属性变更回调,并记录 DecommissionMgnt 对象声明的报废能力。 |
src/lualib/digital_warranty/ | 服务起始时间、首次上电时间和服务期限逻辑。 |
src/lualib/asset_list/、src/lualib/asset_change/ | 资产清单查询和资产信任状态管理。 |
src/lualib/trusted_supply_chain/ | 配置基线、变化检查、告警及指纹生成。 |
src/lualib/retire_mgmt/ | BIOS、RAID、磁盘及 BMC 报废任务编排。 |
src/lualib/whilte_branding/ | 白牌包解析、文件部署、证书和模型属性定制。 |
src/lualib/custom/ | 装备定制输入解析、映射、执行和校验。 |
src/lualib/config_mgmt/ | Product、Contact、BMC、Package 配置导入导出及备份恢复。 |
src/lualib/ipmi/ | OEM IPMI 业务处理器。 |
mds/ | 服务元数据、D-Bus 模型、持久化模型及 IPMI 声明。 |
gen/ | 由模型生成的服务、客户端、ORM、类型和 IPMI 代码。 |
test/unit/、test/integration/、test/fuzz/ | 单元、集成和模糊测试。 |
2. API 使用说明与示例
服务名为 bmc.kepler.product_mgmt,生成代码使用 user bus。以下只列当前模型明确发布的主要 D-Bus API;完整定义以 mds/model.json 和 gen/product_mgmt/json_types/ 为准。示例需要服务已部署并在目标 openUBMC 环境运行。
2.1 产品信息接口
功能说明
在 /bmc/kepler/Systems/${SystemId}/Product 发布产品基本信息,以下示例使用 SystemId=1。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Systems.Product |
| 首发版本 | 1.130.9 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
ProductName | 输入/输出 | s | 产品名称 | 字符串;写入需要 BasicSetting。运行时还可能根据主板 FruData 的 SystemProductName 更新。 |
ProductAlias | 输入/输出 | s | 产品别名 | 仅接受字节值在 0x20~0x7e 范围内的字符串;写入需要 BasicSetting。 |
ProductPicture | 输出 | s | 产品图片标识 | 字符串。 |
ProductUniqueID | 输出 | s | 产品唯一标识 | 字符串。 |
ProductId | 输出 | u | 产品 ID | uint32。 |
ProductVersion | 输入/输出 | s | 产品版本 | 字符串;写入需要 BasicSetting。 |
ProductVendorID | 输出 | s | 产品厂商 ID | 字符串。 |
LanguageSet | 输入/输出 | as | Web 语言集合 | 仅允许 zh、en、ja、fr、ru;必须包含 zh 和 en。 |
RetireSystem | 输入 | a{ss}b | 调用上下文、是否保留日志 | 需要 UserMgmt;仅在报废特性构建时注册。 |
GetRetirementStatus | 输入 | a{ss} | 调用上下文 | 需要 ReadOnly;仅在报废特性构建时注册。 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
RetireSystem: u | 任务 ID | 报废任务成功创建 | 使用任务服务或 GetRetirementStatus 跟踪。 |
GetRetirementStatus: sya{ss} | 状态、进度和详情 | 状态查询成功 | 结合详情排查。 |
| D-Bus 错误 | 框架或业务校验失败 | 权限、参数、特性或依赖异常 | 记录错误名称并查看组件日志。 |
应用场景
供系统内管理接口读取产品展示信息、设置允许写入的属性,或在启用报废特性时发起报废流程。
限制条件
报废会执行数据处置并可能触发 BMC 恢复与复位,只应在授权的目标环境调用。属性写入还必须满足模型权限。
调试示例
命令行调试
busctl --user get-property bmc.kepler.product_mgmt \
/bmc/kepler/Systems/1/Product \
bmc.kepler.Systems.Product ProductName
busctl --user get-property bmc.kepler.product_mgmt \
/bmc/kepler/Systems/1/Product \
bmc.kepler.Systems.Product LanguageSet2.2 电子保单接口
功能说明
接口 bmc.kepler.Systems.Product.DigitalWarranty 与产品信息共用对象路径 /bmc/kepler/Systems/1/Product,提供首次上电日期和服务期限信息。
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
FirstPowerOnTime | 输出 | s | 首次上电日期 | 日期字符串;业务逻辑使用 %Y-%m-%d。 |
StartPoint | 输入/输出 | s | 服务起始日期 | 格式 YYYY-MM-DD;写入需要 UserMgmt。 |
Lifespan | 输入/输出 | y | 服务期限 | uint8,单位为月;写入需要 UserMgmt。 |
返回值与异常
写入异常由属性校验与框架以 D-Bus 错误返回,日期格式错误使用 PropertyValueFormatError。
应用场景
用于查询电子保单首次上电时间、服务起点和服务期限,并支持写入服务起止信息。
限制条件
首次上电和默认服务起点的规则如下:
- 服务起点仅在当前值为
N/A或默认值1996-04-10时根据制造日期初始化;制造日期必须晚于 2010-01-01,生成值为制造日期加 100 天。 - 首次上电日期每 2 小时检测一次,初始化异常时最多进行 10 轮拉起尝试。
- 制造日期早于 2010-01-01 时不记录;处于 2010-01-01 至 2020-01-01 之间时,记录制造日期加 365 天。
- 当前时间早于 2020-01-01、累计上电不足 48 小时,或上电时间早于制造日期前一天时不记录。
- 制造日期后 30 天以内的短期上电按工厂操作处理;超过相应窗口后才形成首次上电日期。
调试示例
busctl --user get-property bmc.kepler.product_mgmt \
/bmc/kepler/Systems/1/Product \
bmc.kepler.Systems.Product.DigitalWarranty FirstPowerOnTime2.3 产品定制与设备信息接口
功能说明
提供 OEM 定制数据、厂商名称、短信名称、OID、Redfish 版本及只读设备身份信息。
参数说明
对象路径同为 /bmc/kepler/Systems/1/Product。
| 接口名 | 属性 | 类型 | 权限与说明 |
|---|---|---|---|
bmc.kepler.Systems.Product.Custom | OemData | ay | 字节数组,业务校验要求至少 1 字节;BasicSetting 可写。 |
| 同上 | Manufacturer | s | BasicSetting 可写,装备定制映射可更新。 |
| 同上 | SmsName | s | BasicSetting 可写。 |
| 同上 | ManufacturerOid | s | BasicSetting 可写;字符串中必须匹配五段十进制数字组成的 OID 片段。 |
| 同上 | CustomerRedfishVersion | s | BasicSetting 可写;当前仓库未定义额外格式约束。 |
bmc.kepler.Systems.Product.Device | Name、SerialNumber、OwnerId | s | 只读;模型对象从组件内部持久化/同步数据发布。 |
返回值与异常
属性写入失败时由框架返回权限、格式或属性值错误对象。
应用场景
用于装备定制、白牌定制和系统身份信息展示。
限制条件
可写属性需要 BasicSetting 权限,只读属性不能通过资源协作接口修改。
调试示例
busctl --user get-property bmc.kepler.product_mgmt /bmc/kepler/Systems/1/Product bmc.kepler.Systems.Product.Custom OemData2.4 联系信息接口
功能说明
提供版权、邮箱、官网、支持网站、联系电话和 KVM 客户端下载地址等联系信息。
参数说明
对象路径为 /bmc/kepler/Systems/1/Contact,接口为 bmc.kepler.Systems.Contact。
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
Copyright | 输入/输出 | s | 版权信息 | 字符串;BasicSetting 可写。 |
Email | 输入/输出 | s | 联系邮箱 | 字符串;BasicSetting 可写。 |
OfficalWeb | 输入/输出 | s | 官方网站 | 字符串;名称是代码中的实际拼写。 |
SupportWeb | 输入/输出 | s | 支持网站 | 字符串。 |
Phone | 输入/输出 | s | 联系电话 | 字符串。 |
KVMClientDownloadLink | 输入/输出 | s | KVM 客户端下载地址 | 字符串。 |
QRCodeSupported | 输入/输出 | b | 是否支持二维码 | 布尔值。 |
返回值与异常
写入校验失败时返回属性格式、权限或值域错误。
应用场景
用于展示和维护产品对外联系信息。
限制条件
这些属性均要求 ReadOnly 读权限、BasicSetting 写权限。
调试示例
busctl --user get-property bmc.kepler.product_mgmt /bmc/kepler/Systems/1/Contact bmc.kepler.Systems.Contact Email2.5 BMC 软件信息接口
功能说明
提供 BMC 软件名称、软件类型和软件包名称。
参数说明
对象路径为 /bmc/kepler/Managers/1/BMC,接口为 bmc.kepler.Managers.BMC。
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
SoftwareName | 输入/输出 | s | BMC 软件名称 | 字符串;BasicSetting 可写。 |
SoftwareType | 输出 | y | 软件类型 | uint8。 |
PackageName | 输出 | s | 软件包名称 | 字符串。 |
返回值与异常
SoftwareName 写入失败时由框架返回权限或属性格式错误。
应用场景
用于产品信息展示和 BMC 版本信息查询。
限制条件
SoftwareName 写入需要 BasicSetting 权限,其余属性只读。
调试示例
busctl --user get-property bmc.kepler.product_mgmt \
/bmc/kepler/Managers/1/BMC bmc.kepler.Managers.BMC SoftwareName2.6 资产清单接口
功能说明
提供完整资产列表和按条件过滤的资产查询能力,受资产构建特性控制。
参数说明
| 属性 | 内容 |
|---|---|
| 对象路径 | /bmc/kepler/AssetService/AssetList |
| 接口名 | bmc.kepler.AssetService.AssetList |
| 首发版本 | 1.130.9 |
| 废弃状态 | 正常可用;但受资产构建特性控制 |
| 方法 | 输入签名 | 输出签名 | 说明 |
|---|---|---|---|
GetAssetList | a{ss} | s | 返回 JSON 字符串形式的全部资产列表。 |
GetSpecificAssetList | a{ss}ysas | s | 按 SystemId、AssetType 和属性名列表过滤。 |
AssetType 可留空或为 CPU、NetworkAdapter、NPU、GPU。上下文字典由调用框架传入,本仓库未提供可直接执行的 busctl call 示例。
GetSpecificAssetList 的 SystemId 仅接受 1 或 0xff;属性列表留空时返回全部可选字段。可选字段包括 AssetName、AssetType、AssetTag、SerialNumber、PartNumber、PCBVersion、FirmwareVersion、Manufacturer、ManufactureDate、Slot、Model、UUID 和 UniqueIdentifier。非法参数通过 PropertyValueNotInList 返回。
GetAssetList 按 AssetType、AssetName 排序。缺失字段在完整列表中以 N/A 填充;Redfish 上下文比其他调用上下文多返回 Slot 和资源对象 path。对于 GetSpecificAssetList,网卡的 UniqueIdentifier 来自主端口永久 MAC 地址,其他设备由序列号与 UUID 拼接。
返回值与异常
查询成功返回 JSON 字符串;非法字段、SystemId 或 AssetType 通过 PropertyValueNotInList 返回。
应用场景
供 Redfish、Web 和资产管理服务读取或筛选资产清单。
限制条件
接口只在资产特性启用时注册;本仓库未提供可直接执行的 busctl call 示例。
调试示例
优先通过上层资产管理接口查询;资源调试时先执行 busctl --user introspect bmc.kepler.product_mgmt /bmc/kepler/AssetService/AssetList。
2.7 资产变更与可信供应链接口
功能说明
维护资产签名与信任记录,并检测和确认可信供应链基线变化。
参数说明
| 对象路径 | 接口名 | 方法/属性 | 签名或类型 |
|---|---|---|---|
/bmc/kepler/AssetService/AssetChange | bmc.kepler.AssetService.AssetChange | UpdateTrustStatus、GetTrustRecord | a{ss} -> 无返回值、a{ss} -> s。 |
/bmc/kepler/AssetService/TrustedSupplyChain | bmc.kepler.AssetService.TrustedSupplyChain | GetChangedEvents、ConfirmChangedEvents | a{ss} -> s、a{ss} -> 无返回值。 |
| 同上 | 同上 | CheckEnabled | b,SecurityMgmt 可写。 |
这些对象只在对应源码模块被构建并成功加载时创建。方法结果中的 JSON 结构以实现和测试为准。
返回值与异常
方法成功时返回数据或空返回;模块未构建、依赖缺失或状态不支持时返回框架错误或对象不存在。
应用场景
用于可信资产变更检测、信任状态更新和供应链基线确认。
限制条件
ConfirmChangedEvents 会关闭检查、清空变化列表并请求清除指纹,不会自动重新生成基线;只能在授权流程中调用。
调试示例
先通过 busctl --user tree bmc.kepler.product_mgmt 确认对象是否存在,再使用上层可信供应链流程验证,不直接对生产数据执行确认操作。
资产变更模块从 Assembly/FruData 等对象收集部件信息,维护签名和信任记录;可信供应链模块将配置基线保存为 trusted_supply_chain_config.json,检测到变化后由 GetChangedEvents 返回。ConfirmChangedEvents 会关闭检查、清空变化列表、删除主备基线并请求安全资产服务清除指纹;代码不会在该方法内自动重新生成基线。具体文件位置由 src/lualib/trusted_supply_chain/trusted_supply_chain_check.lua 中的外部路径常量组合,部署时应以目标系统为准。
2.8 系统报废接口
功能说明
系统报废流程通过 2.1 节产品接口触发,并按 BIOS、RAID、Disk、BMC 子任务汇总进度。
参数说明
报废方法发布在 2.1 节产品接口上。实现会按 BIOS、RAID、Disk、BMC 四个子任务计算进度,权重分别为 10%、10%、70%、10%。
| 状态层级 | 可确认的状态值 | 说明 |
|---|---|---|
| 整体任务 | Idle、Executing、Successful、Failed、Timeout | GetRetirementStatus 对外返回的整体状态。 |
| 子任务 | Suspended、New、Starting、Running、Completed、Exception | 内部跟踪各处置阶段;Suspended 子任务不计入对外详情。 |
BIOS 擦除和 RAID 擦除超时均为 600 秒;SP 启动和业务上电超时均为 1800 秒。PreserveLog 只影响源码列出的 SEL、Maintenance、FaultDiagnosis 日志保留类型。
返回值与异常
RetireSystem 成功时返回任务 ID;状态查询返回状态、进度和详情。权限、状态或依赖异常通过任务状态或框架错误返回。
应用场景
用于产品生命周期结束时的授权报废和状态跟踪。
限制条件
该流程会控制电源、调用外部生命周期/存储服务并执行 BMC 恢复,不能在生产环境作为普通调试命令调用。
调试示例
仅在隔离环境验证;调用前确认 UserMgmt 权限、报废特性开关、电源状态和恢复路径。
2.9 OEM IPMI 接口
功能说明
mds/ipmi.json 定义产品、电子保单、白牌、装备定制、板卡采集和供应链等 OEM 命令,生成定义位于 gen/product_mgmt/ipmi/cmds/,业务实现位于 src/lualib/ipmi/。接口包含厂商 IANA、字节序、角色与选择器约束;为避免在真实设备上误操作,本文不提供执行命令。集成时应逐项依据 mds/ipmi.json 生成请求。
参数说明
| 命令 | NetFn/Cmd | 关键选择字段 | 权限 |
|---|---|---|---|
GetBmcSoftwareName | 0x30/0x92 | SubCmd=0x45 | ReadOnly |
GetServiceLifespan / SetServiceLifespan | 0x30/0x93 | SubCmd=0x5b/0x5a,Selector=0x0025 | ReadOnly / UserMgmt |
GetFirstPowerOnTime / SetFirstPowerOnTime | 0x30/0x93 | SubCmd=0x5b/0x5a,Selector=0x0036 | 两者在模型中均标记 ReadOnly |
GetProductUniqueId | 0x30/0x90 | SubCmd=0x59,Selector=0x12 | BasicSetting |
GetCustomBrandFlag / SetCustomBrandFlag | 0x30/0x90 | SubCmd=0x59/0x21,Selector=0x10 | BasicSetting |
SetCustomSettings / GetCustomSettings | 0x30/0x90 | SubCmd=0x21/0x22,Selector=0xF0 | BasicSetting |
CollectServerInformationControl | 0x30/0x93 | SubCmd=0x8A,Selector=0x00 | BasicSetting |
SetSupplyChainEnable / GetSupplyChainEnable | 0x30/0x93 | SubCmd=0x8E/0x8D | UserMgmt / ReadOnly |
表中权限与名称来自 mds/ipmi.json。其中 SetFirstPowerOnTime 的权限配置为 ReadOnly,集成时应按该定义进行权限校验。
返回值与异常
成功返回标准 OEM IPMI 完成码;参数、权限、长度和状态错误通过错误符号或非零完成码返回。
应用场景
供 IPMI 客户端使用产品、电子保单、白牌、装备定制、板卡采集和供应链管理命令。
限制条件
必须满足 IANA、字节序、角色、选择器和系统锁定策略;文档不提供可能影响生产数据的执行命令。
调试示例
在隔离环境通过 mds/ipmi.json 和 gen/product_mgmt/ipmi/cmds/ 核对请求字段后再执行。
3. 组件扩展案例
3.1 扩展能力概述
组件支持三类代码级扩展:在模型文件中增加 D-Bus 对象/成员并重新生成代码;在 mds/ipmi.json 增加 OEM IPMI 定义并实现处理器;在白牌、装备定制和配置管理映射中增加经过校验的配置项。它不是通用运行时插件系统。
3.2 扩展点说明
| 扩展点 | 位置 | 触发时机 |
|---|---|---|
| D-Bus 模型 | mds/model.json、mds/schema.json | 代码生成与服务初始化时。 |
3.3 二次开发指导
步骤一
D-Bus 接口变更应修改 mds/model.json 和 mds/schema.json,IPMI 变更应修改 mds/ipmi.json,配置扩展应修改对应映射与校验逻辑;同时确认权限、持久化 usage 和构建特性边界。
步骤二
使用仓库生成目标更新 gen/,实现业务回调并补充 test/unit/ 或 test/integration/ 用例。
示例代码
现有方法注册模式如下(摘自 src/lualib/product_mgmt_app.lua):
c_product_mgmt_service:ImplAssetListAssetListGetAssetList(function(object, ctx)
return asset_list.get_instance():get_asset_list()
end)验证方法
- 运行代码生成并确认生成文件与模型一致。
- 在已准备 Conan/Skynet 测试根目录的环境执行统一通过bingo test -it、bingo test -ut执行组件的it、ut测试
- 在隔离目标环境 introspect 对象,确认成员签名、权限和特性开关。
注意事项
- 不要直接手改生成文件作为长期方案,模型重新生成会覆盖变更。
- 新功能必须考虑
CMakeLists.txt中的特性裁剪。 - 报废、证书、持久化和 OEM IPMI 变更可能影响设备数据或安全边界,应只在隔离环境验证。
3.4 白牌定制案例
处理流程
白牌升级的组件类型为 WhiteBranding、组件 ID 为 17,实现分为三个阶段:
prepare:创建/data/opt/bmc/web/custom和/data/opt/bmc/conf/product_mgmt/oem/profile等定制目录。process:通过安全代理将包解压到/dev/shm/upgrade,解析filelist.conf,按文件表复制或清理目标资源。finish:发送完成信号,随后处理证书、web_custom.xml和模型属性。
随 BMC 镜像提供的白牌包路径为 /opt/bmc/white_branding/wbd_up_file.tar.gz。升级标志位 /data/opt/bmc/product_mgmt/upgrade_with_bmc_flag 用于避免重启后重复处理。安全解压调用传入的大小上限为 100 MiB、文件数上限为 512;复制前还会检查目标完整路径长度是否接近代码中的 256 字节缓冲区上限。
包内约束
filelist.conf的Basic.Version主版本必须为2。- 每个
FileN条目需要同时提供Name和Path。 - 名称为
CLEAR_ALL时清理指定白牌目录,否则以临时文件复制后原子替换目标文件。 - 所有路径仍需通过安全代理的真实路径和特殊字符检查;不能把这些路径约束理解为允许任意文件部署。
验证方法
- 检查日志是否依次出现
prepare upgrade、process upgrade和finish upgrade。 - 检查
[WBD] complete processing upgrade, ret=...;非零时根据 5.2 节返回值定位阶段。 - 读取受影响的 Product、Contact 或 BMC 属性,并检查包声明的目标资源是否存在。
3.5 装备定制案例
装备定制接收 /tmp/customset.ini,将其安全复制到 /dev/shm/tmp/product_mgmt/customset.ini 后解析,并把结果保存到 /data/opt/bmc/conf/product_mgmt/custom_settings.json。校验临时结果位于 /tmp/custom_settings_result.json,最长进度等待时间为 5 分钟。
当前 attribute_map 可处理以下键:
| 配置键 | 作用对象或属性 | 特殊规则 |
|---|---|---|
BMCSet_MACHINEALIAS | ProductAlias | null 表示显式清空,空字符串表示恢复 CSR 默认值。 |
BMCSet_Copyright | Copyright | null 表示清空,空字符串表示恢复 CSR 默认值。 |
BMCSet_OfficalWeb | OfficalWeb | 空字符串表示恢复 CSR 默认值。 |
BMCSet_RedfishCustomManuName | Manufacturer | 直接设置定制厂商名。 |
BMCSet_LanguageSet | LanguageSet | 逗号分隔,最终仍受语言集合校验。 |
BMCSet_PackageCustomer | Package Customer | 依赖 /bmc/kepler/Managers/1/Package。 |
BMCSet_PackageCustomerVersion | Package Version | 同上。 |
BMCSet_PackageProvider | Package Provider | 同上。 |
BMCSet_SNMPCustomManuOid | ManufacturerOid | 字符串中必须匹配五段数字 OID 片段。 |
BMCSet_CustomerRedfishVersion | CustomerRedfishVersion | 当前实现直接设置,未定义额外格式约束。 |
BMCSet_TrustedSupplyChainCheckEnabled | CheckEnabled | 仅供应链模块可用时注册;值为 on 或 off。 |
未识别的键会记录 Custom attribute name(...) is invalid 并跳过;Import=false 的条目不执行。应通过制造流程或测试桩提供输入,不建议在运行设备上手工写这些临时文件。
4. 日志说明
4.1 一键日志收集
组件通过 src/lualib/dump/init.lua 注册 on_dump 回调,生成 product_mgmt_dumpinfo、hardware_inventory.json 和 product_info.txt 等文件,分别记录电子保单/产品信息、资产清单和产品唯一标识。
4.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
[init] Start to init product mgmt | NOTICE | 主初始化协程开始。 | 若无完成日志,查看其后的首个错误。 |
[init] Product mgmt init finished | NOTICE | 主要模块及回调注册完成。 | 无需处理。 |
create app failed: %s | ERROR | app.new 失败,服务未完成创建。 | 检查紧邻错误和依赖/模型加载情况。 |
Get current time failed! | ERROR | 电子保单读取当前时间失败。 | 检查 bmc.kepler.Managers.Time 依赖对象。 |
[WBD] complete processing upgrade, ret=%s | NOTICE | 白牌升级处理结束。 | 非零时结合前序 WBD 错误定位。 |
waiting for sp timeout. | ERROR | 板卡信息采集等待 SP 超时。 | 检查 UMS SP 对象、上电状态和前序日志。 |
日志片段来自 src/service/main.lua、src/lualib/product_mgmt_app.lua、src/lualib/digital_warranty/service.lua、src/lualib/whilte_branding/upgrade_mgmt.lua 和 src/lualib/board_info/collector.lua。
5. 问题定界指南
5.1 典型问题定界
| 现象描述 | 是否为本组件问题 | 判断依据 | 关键证据收集方法 |
|---|---|---|---|
| 产品对象不存在 | 可能是 | 服务创建、模型对象创建或依赖检查失败均可能导致。 | 查看初始化日志并用 busctl --user tree bmc.kepler.product_mgmt 检查资源树。 |
| 资产/报废/供应链接口不存在 | 不一定 | 模块受 CMake 特性裁剪,并通过 pcall(require, ...) 可选加载。 | 核对构建选项、安装模块和初始化日志。 |
| 产品名与 FRU 数据不一致 | 不一定 | 产品对象与 FruData 产品/系统信息协作,源数据可能来自外部组件。 | 同时收集产品属性、FruData 属性和组件日志。 |
| 白牌升级失败 | 可能是 | 包版本、文件列表、路径检查、解压或证书导入可能失败。 | 搜索日志中的 [WBD] 及前后 ERROR/WARN。 |
| 板卡采集超时 | 不一定 | 本组件负责调度,但结果依赖 UMS SP 和硬件状态。 | 收集板卡采集日志、SP 状态和电源状态。 |
5.2 错误码速查表
| 错误码 | 含义 | 可能原因 | 排查建议 |
|---|---|---|---|
0 / E_OK | 白牌内部处理成功 | 正常完成 | 无需处理。 |
1 / E_FAILED | 白牌内部通用失败 | 配置解析、路径或文件处理失败 | 查看同阶段前序错误。 |
2 / E_VERSION_DISMATCH | filelist.conf 版本不匹配 | 文件列表版本不符合要求 | 核对 Basic.Version;当前代码要求主版本为 2。 |
3 / E_DECOMPRESS_FAILED | 白牌包解压失败 | 包损坏、格式不支持或安全代理拒绝 | 检查包格式、大小、文件数和解压日志。 |
4 / E_UPDATE_CFG_FAILED | update.cfg 解析失败 | 更新配置缺失或内容非法 | 检查包内 update.cfg 和前序解析日志。 |
36 / E_UPDATE_EXIST | 已有同类型升级任务 | 相同固件类型正在升级 | 等待现有任务结束后重试。 |
0x00 | OEM IPMI 成功完成码 | 命令正常完成 | 无需处理。 |
E_* 是白牌升级流程的内部返回值,不是 D-Bus 通用错误码。表中仅列出当前实现存在返回路径的值。OEM IPMI 处理成功时返回 0x00;失败路径通过 messages.base 或 messages.custom 中的错误符号交给框架转换。
业务错误符号
当前源码使用的主要错误符号如下。仓库未包含 messages.base 和 messages.custom 的定义文件,因此这里只记录本组件中的触发条件,不扩展未在本仓库定义的数值错误码。
| 错误符号 | 本组件中的典型触发条件 | 处理建议 |
|---|---|---|
InternalError | 依赖对象缺失、读取或写入内部状态失败 | 检查同一时间点的组件日志和依赖对象。 |
PropertyValueFormatError | 产品别名、服务起始日期或 OID 格式非法 | 按属性格式要求修正输入。 |
PropertyValueNotInList | 资产查询的 SystemId、AssetType 或字段名不受支持 | 使用 2.6 节列出的合法取值。 |
ActionNotSupported | 当前资产或报废状态不支持请求动作 | 检查目标对象状态和特性开关。 |
IPMIInvalidFieldRequest | IANA、选择器、偏移或请求字段非法 | 对照 mds/ipmi.json 检查请求字段。 |
IPMIOutOfRange | 请求长度或数值越界 | 检查对应处理器中的长度和范围校验。 |
IPMICommandCannotExecute | 当前状态不能执行板卡采集命令 | 检查 SP、上电状态和既有采集任务。 |
IPMICommandResponseCannotProvide | 可信供应链基线配置无法保存 | 检查基线文件处理日志和依赖服务状态。 |
LanguageNotSupport、LanguageZhAndEnRequired | 语言集合包含不支持项或缺少中英文 | 使用支持的语言,并同时包含 zh 和 en。 |
5.3 最小化复现与证据收集
- 记录接口或命令、对象路径、输入参数、权限和完整错误对象。
- 保存
product_mgmt_dumpinfo、hardware_inventory.json和product_info.txt。 - 白牌升级问题应记录包版本、
filelist.conf、阶段日志和升级标志位。 - 报废或供应链问题必须保留任务状态、子任务进度和外部依赖返回。
5.4 调试方法
- 使用
busctl --user introspect确认对象和接口是否随特性构建注册。 - 使用产品信息、资产和供应链的只读接口复现,修改类操作只在隔离环境执行。
- 对可选模块先检查
CONAN_DEFS_FEATURE_ASSET和CONAN_DEFS_FEATURE_TRUSTED_SUPPLY_CHAIN。
6. 常见问题解答
Q1:为什么服务存在,但资产或可信供应链接口不存在?
- 问题描述:
product_mgmt服务可用,但资产或供应链对象不存在。 - 一句话答案:这些是受构建特性控制的可选模块。
- 根因说明:
CONAN_DEFS_FEATURE_ASSET、CONAN_DEFS_FEATURE_TRUSTED_SUPPLY_CHAIN未启用,或模块加载时pcall(require, ...)失败。 - 解决方案:检查构建选项、安装结果和模块加载错误日志。
- 规避方案:在产品配置阶段明确可选能力,升级后使用
introspect验证对象。 - 适用版本:1.140.2。
Q2:为什么设置 LanguageSet 失败?
- 问题描述:写入
LanguageSet返回属性值错误。 - 一句话答案:语言集合必须同时包含
zh和en,且只能使用支持的语言。 - 根因说明:
src/lualib/language_mgmt/init.lua与src/lualib/config_mgmt/bmc_config.lua对语言集合执行白名单和完整性校验。 - 解决方案:仅使用
zh、en、ja、fr、ru,并同时提供zh与en。 - 规避方案:变更前读取当前语言集合并保存原值。
- 适用版本:1.140.2。
Q3:电子保单首次上电时间为什么没有记录?
- 问题描述:
FirstPowerOnTime为空或长期不更新。 - 一句话答案:制造日期、当前时间或累计上电时长尚未满足记录条件。
- 根因说明:代码会拒绝异常制造日期和当前日期,并要求满足上电时长和检测窗口。
- 解决方案:核对 FruData 制造日期、
Managers.Time当前时间和 WARN 日志。 - 规避方案:不要通过直接改写持久化数据绕过规则,等待条件满足后复核。
- 适用版本:1.140.2。
附录
附录 A 参考资料
mds/service.json:组件元数据、版本和外部依赖。mds/model.json、mds/schema.json:D-Bus 对象、权限、属性和方法模型。mds/ipmi.json:OEM IPMI 命令定义。CMakeLists.txt、conanfile.py、Makefile:安装、特性裁剪、打包和测试入口。src/service/main.lua、src/lualib/product_mgmt_app.lua:服务入口和初始化流程。test/unit/、test/integration/:单元与集成测试。docs/sfmea-failure-modes.md:仓库内失效模式分析资料。LICENSE:Mulan PSL v2 许可证文本。
附录 B 修订记录
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| 1.130.12 | 2026-08-26 | o1315548501 | 按当前代码核查,修正版本、权限和日志路径,重构 API、扩展与排障说明。 |