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),维护首次上电时间、服务起始时间、服务年限
DICEDevice 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.jsongen/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产品别名仅接受字节值在 0x200x7e 范围内的字符串;写入需要 BasicSetting
ProductPicture输出s产品图片标识字符串。
ProductUniqueID输出s产品唯一标识字符串。
ProductId输出u产品 IDuint32
ProductVersion输入/输出s产品版本字符串;写入需要 BasicSetting
ProductVendorID输出s产品厂商 ID字符串。
LanguageSet输入/输出asWeb 语言集合仅允许 zhenjafrru;必须包含 zhen
RetireSystem输入a{ss}b调用上下文、是否保留日志需要 UserMgmt;仅在报废特性构建时注册。
GetRetirementStatus输入a{ss}调用上下文需要 ReadOnly;仅在报废特性构建时注册。

返回值与异常

返回值含义触发条件处理建议
RetireSystem: u任务 ID报废任务成功创建使用任务服务或 GetRetirementStatus 跟踪。
GetRetirementStatus: sya{ss}状态、进度和详情状态查询成功结合详情排查。
D-Bus 错误框架或业务校验失败权限、参数、特性或依赖异常记录错误名称并查看组件日志。

应用场景

供系统内管理接口读取产品展示信息、设置允许写入的属性,或在启用报废特性时发起报废流程。

限制条件

报废会执行数据处置并可能触发 BMC 恢复与复位,只应在授权的目标环境调用。属性写入还必须满足模型权限。

调试示例

命令行调试
bash
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 LanguageSet

2.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 天以内的短期上电按工厂操作处理;超过相应窗口后才形成首次上电日期。

调试示例

bash
busctl --user get-property bmc.kepler.product_mgmt \
  /bmc/kepler/Systems/1/Product \
  bmc.kepler.Systems.Product.DigitalWarranty FirstPowerOnTime

2.3 产品定制与设备信息接口

功能说明

提供 OEM 定制数据、厂商名称、短信名称、OID、Redfish 版本及只读设备身份信息。

参数说明

对象路径同为 /bmc/kepler/Systems/1/Product

接口名属性类型权限与说明
bmc.kepler.Systems.Product.CustomOemDataay字节数组,业务校验要求至少 1 字节;BasicSetting 可写。
同上ManufacturersBasicSetting 可写,装备定制映射可更新。
同上SmsNamesBasicSetting 可写。
同上ManufacturerOidsBasicSetting 可写;字符串中必须匹配五段十进制数字组成的 OID 片段。
同上CustomerRedfishVersionsBasicSetting 可写;当前仓库未定义额外格式约束。
bmc.kepler.Systems.Product.DeviceNameSerialNumberOwnerIds只读;模型对象从组件内部持久化/同步数据发布。

返回值与异常

属性写入失败时由框架返回权限、格式或属性值错误对象。

应用场景

用于装备定制、白牌定制和系统身份信息展示。

限制条件

可写属性需要 BasicSetting 权限,只读属性不能通过资源协作接口修改。

调试示例

bash
busctl --user get-property bmc.kepler.product_mgmt   /bmc/kepler/Systems/1/Product bmc.kepler.Systems.Product.Custom OemData

2.4 联系信息接口

功能说明

提供版权、邮箱、官网、支持网站、联系电话和 KVM 客户端下载地址等联系信息。

参数说明

对象路径为 /bmc/kepler/Systems/1/Contact,接口为 bmc.kepler.Systems.Contact

参数名方向类型描述取值范围
Copyright输入/输出s版权信息字符串;BasicSetting 可写。
Email输入/输出s联系邮箱字符串;BasicSetting 可写。
OfficalWeb输入/输出s官方网站字符串;名称是代码中的实际拼写。
SupportWeb输入/输出s支持网站字符串。
Phone输入/输出s联系电话字符串。
KVMClientDownloadLink输入/输出sKVM 客户端下载地址字符串。
QRCodeSupported输入/输出b是否支持二维码布尔值。

返回值与异常

写入校验失败时返回属性格式、权限或值域错误。

应用场景

用于展示和维护产品对外联系信息。

限制条件

这些属性均要求 ReadOnly 读权限、BasicSetting 写权限。

调试示例

bash
busctl --user get-property bmc.kepler.product_mgmt   /bmc/kepler/Systems/1/Contact bmc.kepler.Systems.Contact Email

2.5 BMC 软件信息接口

功能说明

提供 BMC 软件名称、软件类型和软件包名称。

参数说明

对象路径为 /bmc/kepler/Managers/1/BMC,接口为 bmc.kepler.Managers.BMC

参数名方向类型描述取值范围
SoftwareName输入/输出sBMC 软件名称字符串;BasicSetting 可写。
SoftwareType输出y软件类型uint8
PackageName输出s软件包名称字符串。

返回值与异常

SoftwareName 写入失败时由框架返回权限或属性格式错误。

应用场景

用于产品信息展示和 BMC 版本信息查询。

限制条件

SoftwareName 写入需要 BasicSetting 权限,其余属性只读。

调试示例

bash
busctl --user get-property bmc.kepler.product_mgmt \
  /bmc/kepler/Managers/1/BMC bmc.kepler.Managers.BMC SoftwareName

2.6 资产清单接口

功能说明

提供完整资产列表和按条件过滤的资产查询能力,受资产构建特性控制。

参数说明

属性内容
对象路径/bmc/kepler/AssetService/AssetList
接口名bmc.kepler.AssetService.AssetList
首发版本1.130.9
废弃状态正常可用;但受资产构建特性控制
方法输入签名输出签名说明
GetAssetLista{ss}s返回 JSON 字符串形式的全部资产列表。
GetSpecificAssetLista{ss}ysassSystemIdAssetType 和属性名列表过滤。

AssetType 可留空或为 CPUNetworkAdapterNPUGPU。上下文字典由调用框架传入,本仓库未提供可直接执行的 busctl call 示例。

GetSpecificAssetListSystemId 仅接受 10xff;属性列表留空时返回全部可选字段。可选字段包括 AssetNameAssetTypeAssetTagSerialNumberPartNumberPCBVersionFirmwareVersionManufacturerManufactureDateSlotModelUUIDUniqueIdentifier。非法参数通过 PropertyValueNotInList 返回。

GetAssetListAssetTypeAssetName 排序。缺失字段在完整列表中以 N/A 填充;Redfish 上下文比其他调用上下文多返回 Slot 和资源对象 path。对于 GetSpecificAssetList,网卡的 UniqueIdentifier 来自主端口永久 MAC 地址,其他设备由序列号与 UUID 拼接。

返回值与异常

查询成功返回 JSON 字符串;非法字段、SystemIdAssetType 通过 PropertyValueNotInList 返回。

应用场景

供 Redfish、Web 和资产管理服务读取或筛选资产清单。

限制条件

接口只在资产特性启用时注册;本仓库未提供可直接执行的 busctl call 示例。

调试示例

优先通过上层资产管理接口查询;资源调试时先执行 busctl --user introspect bmc.kepler.product_mgmt /bmc/kepler/AssetService/AssetList

2.7 资产变更与可信供应链接口

功能说明

维护资产签名与信任记录,并检测和确认可信供应链基线变化。

参数说明

对象路径接口名方法/属性签名或类型
/bmc/kepler/AssetService/AssetChangebmc.kepler.AssetService.AssetChangeUpdateTrustStatusGetTrustRecorda{ss} -> 无返回值a{ss} -> s
/bmc/kepler/AssetService/TrustedSupplyChainbmc.kepler.AssetService.TrustedSupplyChainGetChangedEventsConfirmChangedEventsa{ss} -> sa{ss} -> 无返回值
同上同上CheckEnabledbSecurityMgmt 可写。

这些对象只在对应源码模块被构建并成功加载时创建。方法结果中的 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%。

状态层级可确认的状态值说明
整体任务IdleExecutingSuccessfulFailedTimeoutGetRetirementStatus 对外返回的整体状态。
子任务SuspendedNewStartingRunningCompletedException内部跟踪各处置阶段;Suspended 子任务不计入对外详情。

BIOS 擦除和 RAID 擦除超时均为 600 秒;SP 启动和业务上电超时均为 1800 秒。PreserveLog 只影响源码列出的 SELMaintenanceFaultDiagnosis 日志保留类型。

返回值与异常

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关键选择字段权限
GetBmcSoftwareName0x30/0x92SubCmd=0x45ReadOnly
GetServiceLifespan / SetServiceLifespan0x30/0x93SubCmd=0x5b/0x5aSelector=0x0025ReadOnly / UserMgmt
GetFirstPowerOnTime / SetFirstPowerOnTime0x30/0x93SubCmd=0x5b/0x5aSelector=0x0036两者在模型中均标记 ReadOnly
GetProductUniqueId0x30/0x90SubCmd=0x59Selector=0x12BasicSetting
GetCustomBrandFlag / SetCustomBrandFlag0x30/0x90SubCmd=0x59/0x21Selector=0x10BasicSetting
SetCustomSettings / GetCustomSettings0x30/0x90SubCmd=0x21/0x22Selector=0xF0BasicSetting
CollectServerInformationControl0x30/0x93SubCmd=0x8ASelector=0x00BasicSetting
SetSupplyChainEnable / GetSupplyChainEnable0x30/0x93SubCmd=0x8E/0x8DUserMgmt / ReadOnly

表中权限与名称来自 mds/ipmi.json。其中 SetFirstPowerOnTime 的权限配置为 ReadOnly,集成时应按该定义进行权限校验。

返回值与异常

成功返回标准 OEM IPMI 完成码;参数、权限、长度和状态错误通过错误符号或非零完成码返回。

应用场景

供 IPMI 客户端使用产品、电子保单、白牌、装备定制、板卡采集和供应链管理命令。

限制条件

必须满足 IANA、字节序、角色、选择器和系统锁定策略;文档不提供可能影响生产数据的执行命令。

调试示例

在隔离环境通过 mds/ipmi.jsongen/product_mgmt/ipmi/cmds/ 核对请求字段后再执行。

3. 组件扩展案例

3.1 扩展能力概述

组件支持三类代码级扩展:在模型文件中增加 D-Bus 对象/成员并重新生成代码;在 mds/ipmi.json 增加 OEM IPMI 定义并实现处理器;在白牌、装备定制和配置管理映射中增加经过校验的配置项。它不是通用运行时插件系统。

3.2 扩展点说明

扩展点位置触发时机
D-Bus 模型mds/model.jsonmds/schema.json代码生成与服务初始化时。

3.3 二次开发指导

步骤一

D-Bus 接口变更应修改 mds/model.jsonmds/schema.json,IPMI 变更应修改 mds/ipmi.json,配置扩展应修改对应映射与校验逻辑;同时确认权限、持久化 usage 和构建特性边界。

步骤二

使用仓库生成目标更新 gen/,实现业务回调并补充 test/unit/test/integration/ 用例。

示例代码

现有方法注册模式如下(摘自 src/lualib/product_mgmt_app.lua):

lua
c_product_mgmt_service:ImplAssetListAssetListGetAssetList(function(object, ctx)
    return asset_list.get_instance():get_asset_list()
end)

验证方法

  1. 运行代码生成并确认生成文件与模型一致。
  2. 在已准备 Conan/Skynet 测试根目录的环境执行统一通过bingo test -it、bingo test -ut执行组件的it、ut测试
  3. 在隔离目标环境 introspect 对象,确认成员签名、权限和特性开关。

注意事项

  • 不要直接手改生成文件作为长期方案,模型重新生成会覆盖变更。
  • 新功能必须考虑 CMakeLists.txt 中的特性裁剪。
  • 报废、证书、持久化和 OEM IPMI 变更可能影响设备数据或安全边界,应只在隔离环境验证。

3.4 白牌定制案例

处理流程

白牌升级的组件类型为 WhiteBranding、组件 ID 为 17,实现分为三个阶段:

  1. prepare:创建 /data/opt/bmc/web/custom/data/opt/bmc/conf/product_mgmt/oem/profile 等定制目录。
  2. process:通过安全代理将包解压到 /dev/shm/upgrade,解析 filelist.conf,按文件表复制或清理目标资源。
  3. 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.confBasic.Version 主版本必须为 2
  • 每个 FileN 条目需要同时提供 NamePath
  • 名称为 CLEAR_ALL 时清理指定白牌目录,否则以临时文件复制后原子替换目标文件。
  • 所有路径仍需通过安全代理的真实路径和特殊字符检查;不能把这些路径约束理解为允许任意文件部署。

验证方法

  1. 检查日志是否依次出现 prepare upgradeprocess upgradefinish upgrade
  2. 检查 [WBD] complete processing upgrade, ret=...;非零时根据 5.2 节返回值定位阶段。
  3. 读取受影响的 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_MACHINEALIASProductAliasnull 表示显式清空,空字符串表示恢复 CSR 默认值。
BMCSet_CopyrightCopyrightnull 表示清空,空字符串表示恢复 CSR 默认值。
BMCSet_OfficalWebOfficalWeb空字符串表示恢复 CSR 默认值。
BMCSet_RedfishCustomManuNameManufacturer直接设置定制厂商名。
BMCSet_LanguageSetLanguageSet逗号分隔,最终仍受语言集合校验。
BMCSet_PackageCustomerPackage Customer依赖 /bmc/kepler/Managers/1/Package
BMCSet_PackageCustomerVersionPackage Version同上。
BMCSet_PackageProviderPackage Provider同上。
BMCSet_SNMPCustomManuOidManufacturerOid字符串中必须匹配五段数字 OID 片段。
BMCSet_CustomerRedfishVersionCustomerRedfishVersion当前实现直接设置,未定义额外格式约束。
BMCSet_TrustedSupplyChainCheckEnabledCheckEnabled仅供应链模块可用时注册;值为 onoff

未识别的键会记录 Custom attribute name(...) is invalid 并跳过;Import=false 的条目不执行。应通过制造流程或测试桩提供输入,不建议在运行设备上手工写这些临时文件。

4. 日志说明

4.1 一键日志收集

组件通过 src/lualib/dump/init.lua 注册 on_dump 回调,生成 product_mgmt_dumpinfohardware_inventory.jsonproduct_info.txt 等文件,分别记录电子保单/产品信息、资产清单和产品唯一标识。

4.2 关键日志信息

日志片段日志级别含义解读建议处理动作
[init] Start to init product mgmtNOTICE主初始化协程开始。若无完成日志,查看其后的首个错误。
[init] Product mgmt init finishedNOTICE主要模块及回调注册完成。无需处理。
create app failed: %sERRORapp.new 失败,服务未完成创建。检查紧邻错误和依赖/模型加载情况。
Get current time failed!ERROR电子保单读取当前时间失败。检查 bmc.kepler.Managers.Time 依赖对象。
[WBD] complete processing upgrade, ret=%sNOTICE白牌升级处理结束。非零时结合前序 WBD 错误定位。
waiting for sp timeout.ERROR板卡信息采集等待 SP 超时。检查 UMS SP 对象、上电状态和前序日志。

日志片段来自 src/service/main.luasrc/lualib/product_mgmt_app.luasrc/lualib/digital_warranty/service.luasrc/lualib/whilte_branding/upgrade_mgmt.luasrc/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_DISMATCHfilelist.conf 版本不匹配文件列表版本不符合要求核对 Basic.Version;当前代码要求主版本为 2
3 / E_DECOMPRESS_FAILED白牌包解压失败包损坏、格式不支持或安全代理拒绝检查包格式、大小、文件数和解压日志。
4 / E_UPDATE_CFG_FAILEDupdate.cfg 解析失败更新配置缺失或内容非法检查包内 update.cfg 和前序解析日志。
36 / E_UPDATE_EXIST已有同类型升级任务相同固件类型正在升级等待现有任务结束后重试。
0x00OEM IPMI 成功完成码命令正常完成无需处理。

E_* 是白牌升级流程的内部返回值,不是 D-Bus 通用错误码。表中仅列出当前实现存在返回路径的值。OEM IPMI 处理成功时返回 0x00;失败路径通过 messages.basemessages.custom 中的错误符号交给框架转换。

业务错误符号

当前源码使用的主要错误符号如下。仓库未包含 messages.basemessages.custom 的定义文件,因此这里只记录本组件中的触发条件,不扩展未在本仓库定义的数值错误码。

错误符号本组件中的典型触发条件处理建议
InternalError依赖对象缺失、读取或写入内部状态失败检查同一时间点的组件日志和依赖对象。
PropertyValueFormatError产品别名、服务起始日期或 OID 格式非法按属性格式要求修正输入。
PropertyValueNotInList资产查询的 SystemId、AssetType 或字段名不受支持使用 2.6 节列出的合法取值。
ActionNotSupported当前资产或报废状态不支持请求动作检查目标对象状态和特性开关。
IPMIInvalidFieldRequestIANA、选择器、偏移或请求字段非法对照 mds/ipmi.json 检查请求字段。
IPMIOutOfRange请求长度或数值越界检查对应处理器中的长度和范围校验。
IPMICommandCannotExecute当前状态不能执行板卡采集命令检查 SP、上电状态和既有采集任务。
IPMICommandResponseCannotProvide可信供应链基线配置无法保存检查基线文件处理日志和依赖服务状态。
LanguageNotSupportLanguageZhAndEnRequired语言集合包含不支持项或缺少中英文使用支持的语言,并同时包含 zhen

5.3 最小化复现与证据收集

  1. 记录接口或命令、对象路径、输入参数、权限和完整错误对象。
  2. 保存 product_mgmt_dumpinfohardware_inventory.jsonproduct_info.txt
  3. 白牌升级问题应记录包版本、filelist.conf、阶段日志和升级标志位。
  4. 报废或供应链问题必须保留任务状态、子任务进度和外部依赖返回。

5.4 调试方法

  • 使用 busctl --user introspect 确认对象和接口是否随特性构建注册。
  • 使用产品信息、资产和供应链的只读接口复现,修改类操作只在隔离环境执行。
  • 对可选模块先检查 CONAN_DEFS_FEATURE_ASSETCONAN_DEFS_FEATURE_TRUSTED_SUPPLY_CHAIN

6. 常见问题解答

Q1:为什么服务存在,但资产或可信供应链接口不存在?

  • 问题描述:product_mgmt 服务可用,但资产或供应链对象不存在。
  • 一句话答案:这些是受构建特性控制的可选模块。
  • 根因说明:CONAN_DEFS_FEATURE_ASSETCONAN_DEFS_FEATURE_TRUSTED_SUPPLY_CHAIN 未启用,或模块加载时 pcall(require, ...) 失败。
  • 解决方案:检查构建选项、安装结果和模块加载错误日志。
  • 规避方案:在产品配置阶段明确可选能力,升级后使用 introspect 验证对象。
  • 适用版本:1.140.2。

Q2:为什么设置 LanguageSet 失败?

  • 问题描述:写入 LanguageSet 返回属性值错误。
  • 一句话答案:语言集合必须同时包含 zhen,且只能使用支持的语言。
  • 根因说明:src/lualib/language_mgmt/init.luasrc/lualib/config_mgmt/bmc_config.lua 对语言集合执行白名单和完整性校验。
  • 解决方案:仅使用 zhenjafrru,并同时提供 zhen
  • 规避方案:变更前读取当前语言集合并保存原值。
  • 适用版本:1.140.2。

Q3:电子保单首次上电时间为什么没有记录?

  • 问题描述:FirstPowerOnTime 为空或长期不更新。
  • 一句话答案:制造日期、当前时间或累计上电时长尚未满足记录条件。
  • 根因说明:代码会拒绝异常制造日期和当前日期,并要求满足上电时长和检测窗口。
  • 解决方案:核对 FruData 制造日期、Managers.Time 当前时间和 WARN 日志。
  • 规避方案:不要通过直接改写持久化数据绕过规则,等待条件满足后复核。
  • 适用版本:1.140.2。

附录

附录 A 参考资料

  • mds/service.json:组件元数据、版本和外部依赖。
  • mds/model.jsonmds/schema.json:D-Bus 对象、权限、属性和方法模型。
  • mds/ipmi.json:OEM IPMI 命令定义。
  • CMakeLists.txtconanfile.pyMakefile:安装、特性裁剪、打包和测试入口。
  • src/service/main.luasrc/lualib/product_mgmt_app.lua:服务入口和初始化流程。
  • test/unit/test/integration/:单元与集成测试。
  • docs/sfmea-failure-modes.md:仓库内失效模式分析资料。
  • LICENSE:Mulan PSL v2 许可证文本。

附录 B 修订记录

版本日期修订人修订内容
1.130.122026-08-26o1315548501按当前代码核查,修正版本、权限和日志路径,重构 API、扩展与排障说明。