firmware_mgmt
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.120.15 |
| 文档作者 | mkdlf |
| 最后更新 | 2026-05-08 |
1. 组件概述
1.1 组件简介
固件管理为BMC基本功能特性,客户使用场景中主要涉及固件升级、固件生效、固件信息查询、固件回滚等。
1.2 解决什么问题
firmware_mgmt组件主要解决固件升级流程的统一调度与协同问题、智能管理多固件升级的并发与冲突问题、升级过程的安全与信任问题、固件信息与状态的集中化管理问题、升级过程中的资源与异常管理问题以及装备定制化配置的注入问题。
1.3 核心功能
- 固件升级
固件升级是客户使用过程中常见场景,如对BMC、BIOS、CPLD等固件进行升级。此功能使用频率较高。当前固件管理提供了串行升级和并行升级两种升级方式,功能上包括本地升级和远程升级。
本地升级:固件升级包已存在于BMC本地文件系统(位于 /tmp 目录下),升级时直接从本地路径读取固件包进行升级。
远程升级:固件升级包存储在远程服务器上,BMC通过网络协议(如FTP、TFTP、HTTP、NFS、SCP等)下载固件包到本地后再进行升级。适用于固件包存储在远程服务器,需要通过网络传输获取的场景。
- 固件生效
当前固件生效存在两种生效方式,一种是被动生效,一种是主动生效。 被动生效为固件管理模块检测到生效条件满足后自动触发生效任务,主动生效为客户通过BMC界面进行生效操作。 当前较危险的生效动作,如BMC升级后重启或者CPLD生效后进行掉电处理,此类操作可能会影响固件之间的生效,导致异常情况,因此由固件管理统一管理。
- 固件信息查询
当客户需要查询当前系统的固件信息时,如各固件的名称、类型、版本、发布时间等基本信息,此特性可以提供对所有固件信息进行统一管理,方便查询。
- 镜像回滚
当客户需要回滚到之前的固件版本时,此特性可以提供回滚操作,如BMC主备分区倒换功能。
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| 固件升级 | 固件升级是指将新版本的固件文件写入目标硬件设备的存储介质(如Flash、EEPROM)的过程 |
| 固件生效 | 固件生效是使已写入存储的新固件实际运行的过程,通常需特定动作(如复位、下电)来切换硬件运行状态 |
| 验签 | 验签(Signature Verification)是指使用公钥对数字签名进行解密和计算,以验证数据完整性和签名者身份的过程。其核心目的是确认数据在传输或存储过程中未被篡改,且确实来自声称的发送方 |
| 并行升级 | 并行升级是一种通过同时执行多个升级任务,以显著缩短总体升级时间、提升效率的系统升级策略 |
1.5 外部交互边界图
固件升级功能时序图
并行升级功能时序图
白牌包升级时序图
2. API 使用说明与示例
2.1 资源协作接口概览
2.1.1 bmc.kepler.UpdateService
path:/bmc/kepler/UpdateService
properties
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| UpgradeKeyDomainId | U32 | ✓ | false | 固件升级解包使用的密钥的domain id | 4 |
| UpgradingFlag | Boolean | ✓ | - | 标识当前是否存在升级任务 | false |
| ParallelSupported | Boolean | ✓ | - | 标识当前版本是否支持并行升级 | true |
| UpgradeMode | String | ✓ | false | 标识当前升级模式(Serial/Parallel) | Serial |
| TimeoutPolicy | U8 | ✓ | false | 升级管理对于升级超时之后的处理策略,0:无动作;1:复位BMC,默认0 | 0 |
| ManufacturerValidateEnabled | Boolean | ✗ | false | 是否支持升级时进行厂商校验 | false |
methods
| 方法名 | 权限 | 描述 | 请求参数 | 响应参数 |
|---|---|---|---|---|
| StartUpgrade | BasicSetting | 启动固件升级接口 | FilePath: String - 升级包路径AdditionalOptions: Dictionary - 固件升级可选参数,用于各种升级扩展场景 | TaskId: U32 - 升级任务ID |
| ParallelUpdate | BasicSetting | 启动固件并行升级接口 | UpgradeOptions: Dictionary - 固件并行升级可选参数,对所有Package都生效Packages: Array - 固件并行升级请求列表,每个元素描述一个升级子任务 | TaskId: U32 - 并行升级主任务IDSubTaskIds: U32[] - 并行升级子升级任务ID列表 |
| PrepareReply | BasicSetting | 回复prepare动作结果 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理VersionStr: String - 版本字符串PrepareResult: S32 - 准备结果AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景 | 无 |
| ProcessReply | BasicSetting | 回复process动作结果 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理ProcessResult: S32 - 处理结果AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景 | 无 |
| FinishReply | BasicSetting | 回复finish动作结果 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理FinishResult: S32 - 完成结果AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景 | 无 |
| UpdateUpgradeStatus | BasicSetting | 固件子模块上报升级状态 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理ResultCode: S32 - int32结果码,取值:0-OK,-1代表失败Progress: S32 - 升级进度,为0到100的值ResultDetail: String - 结果详细表述,对结果码进行更详细的解释,最大长度512AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景 | 无 |
| GetUpgradeStatus | BasicSetting | 获取升级状态 | TaskId: U32 - 任务标识 | FirmwareType: String - 固件的类型信息,由固件管理统一分配管理ResultCode: S32 - 成功为0,失败为-1Progress: S32 - 进度0-100ResultDetail: String - 结果详细表述,对结果码进行更详细的解释 |
| GetUpdateProgress | ReadOnly | 获取所有升级任务的进度信息 | 无 | UpgradeMode: String - 当前升级模式UpgradeTasks: Array - 升级任务的进度信息 |
| GetPendingFirmwareList | ReadOnly | 获取所有待生效固件信息 | 无 | PendingFirmwareList: Array - 待生效固件信息 |
| Rollback | BasicSetting | 回滚特定固件 | SystemId: S32 - 系统IDId: String - 固件名称,同类型固件名称相同 | 无 |
| Export | BasicSetting | 导出特定固件 | SystemId: S32 - 系统IDId: String - 固件名称,同类型固件名称相同 | 无 |
| CheckFirmwareType | BasicSetting | 校验升级包的固件类型是否符合预期 | FilePath: String - 升级包的路径FirmwareType: String - 升级包的预期固件类型 | IsMatch: Boolean - 升级包与预期固件类型是否匹配 |
| ParseFirmwarePackage | BasicSetting | 完成FilePath下的hpm包的完整性校验以及CMS验签 | FilePath: String - 需要解压的hpm包的路径 | FirmwareType: String - 解压后的固件包的typeFirmwareDirectory: String - 解压后的固件升级文件的位置 |
| ActiveStagedFirmwares | BasicSetting | 用于暂存生效 | FirmwareIds: String[] - 待暂存生效固件ID列表 | TaskId: U32 - 暂存生效的主任务IDSubTaskIds: U32[] - 暂存生效的子升级任务ID列表 |
| DiscardStagedFirmwares | BasicSetting | 弃用待暂存生效固件 | FirmwareIds: String[] - 待弃用的暂存生效固件ID列表 | TaskId: U32 - 弃用暂存生效的主任务IDSubTaskIds: U32[] - 弃用暂存生效的子升级任务ID列表 |
- ParallelUpgradePackages详细说明
| 字段 | 类型 | 描述 |
|---|---|---|
| FilePath | String | 升级包路径 |
| AdditionalOptions | Dictionary | 固件升级可选参数,用于升级需要的参数扩展 |
- UpdateProgress详细说明
| Key | 描述 |
|---|---|
| TaskName | 升级任务名 |
| Firmware | 升级固件描述 |
| FirmwareInstance | 升级固件实例 |
| FileName | 升级包名称 |
| Percentage | 升级进度 |
| TaskState | 升级状态 |
| ErrorCode | 升级任务错误码 |
| EstimatedRemainingTime | 固件预计升级的剩余时间 |
| CurrentVersion | 升级固件当前版本号 |
| TargetVersion | 升级固件目标版本号 |
| ActivateMode | 固件生效方式,取值有:NoAction:自动生效、ResetBMC:复位BMC生效、PowerOff:下电生效 |
- PendingFirmware详细说明
| 字段 | 类型 | 描述 |
|---|---|---|
| SystemId | U8 | 系统ID |
| Firmware | String | 待生效固件描述 |
| FirmwareInstance | String | 待生效固件实例 |
| ActiveStatus | String | 生效状态,当前可有的取值有:'ToBeActivated', 'Activating', 'Activated' |
| ActiveAction | String | 生效动作 |
signals
| 信号名 | 描述 | 参数 |
|---|---|---|
| UpgradePrepareSignal | 升级准备信号 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理CfgPath: String - 固件包解析后的配置文件包路径信息FilePath: String - 固件包的路径信息,用于BIOS/CPLD固件做flash转储场景使用AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于各种子固件扩展场景 |
| UpgradeProcessSignal | 升级处理信号 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理FileName: String - 固件包的名称AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景 |
| UpgradeFinishSignal | 升级完成信号 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景 |
| RollbackSignal | 回滚信号 | SystemId: S32 - 系统IDId: String - 固件名称,同类型固件名称相同 |
| ExportSignal | 导出信号 | SystemId: S32 - 系统IDId: String - 固件名称,同类型固件名称相同 |
2.1.2 bmc.kepler.UpdateService.FirmwareActive
path:/bmc/kepler/UpdateService/FirmwareActive
methods
| 方法名 | 权限 | 描述 | 请求参数 | 响应参数 |
|---|---|---|---|---|
| StartActive | BasicSetting | 启动固件生效 | SystemId: S32 - 系统ID | TaskId: U32 - 生效任务标识 |
| StartActiveWithPolicy | BasicSetting | 根据策略启动固件生效 | SystemId: S32 - 系统IDAdditionalOptions: Dictionary - 固件生效可选参数字典,用于传递生效策略 | TaskId: U32 - 生效任务标识 |
| RegisterActiveAction | BasicSetting | 注册生效动作 | ActiveAction: Array[KeyValueTable] - 各固件调用此方法向 firmware_mgmt 注册生效条件、生效动作 | 无 |
| UpdateActiveStatus | BasicSetting | 更新生效状态 | ActiveStatus: Array[KeyValueTable] - 各固件调用此方法向 firmware_mgmt 更新生效状态 | 无 |
| ActiveProcessReply | BasicSetting | 回复生效处理结果 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理ProcessResult: S32 - 处理结果 | 无 |
signals
| 信号名 | 描述 | 参数 |
|---|---|---|
| ActiveProcessSignal | 生效处理信号 | SystemId: S32 - 系统IDFirmwareType: String - 固件的类型信息,由固件管理统一分配管理 |
2.1.3 bmc.kepler.UpdateService.FirmwareActiveInfo
path:/bmc/kepler/UpdateService/FirmwareActive/:Id
properties
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| FirmwareId | String | ✓ | - | SystemId+固件类型 | - |
| FirmwareType | String | ✓ | - | 固件类型 | - |
| ActiveCondition | String | ✓ | - | 生效条件 | - |
| ActiveMode | String | ✓ | - | 生效模式 | - |
| ActiveStatus | String | ✗ | - | 生效状态 | - |
| SystemId | String | ✓ | - | 系统host id | - |
此接口内容通常是通过bmc.kepler.UpdateService.FirmwareActive下RegisterActiveAction方法添加。
添加案例:
local param = {}
param[#param+1] = {Key = 'FirmwareId', Value = 'CPLD'}
param[#param+1] = {Key = 'FirmwareType', Value = 'CPLD'}
param[#param+1] = {Key = 'ActiveCondition', Value = active_condition}
param[#param+1] = {Key = 'ActiveMode', Value = active_mode}
param[#param+1] = {Key = 'ActiveStatus', Value = active_status}
client:FirmwareActiveFirmwareActiveRegisterActiveAction(context.new(), param)添加成功后,firmware_mgmt 存在关键日志:register: FirmwareId = xxx ......
2.1.4 bmc.kepler.UpdateService.FirmwareInventory
path:/bmc/kepler/UpdateService/FirmwareInventory
methods
| 方法名 | 权限 | 描述 | 请求参数 | 响应参数 |
|---|---|---|---|---|
| Add | BasicSetting | 添加固件列表 | FirmwareInfoTable: Dictionary - 固件基本信息Updateable: Boolean - 固件是否支持更新Capability: U16 - 固件支持的能力,每个bit标识一种能力,1 支持,0 不支持:固件信息查询、固件升级生效、固件回滚、固件导出、升级生效分离MaxPackageSizeMiB: S32 - 此固件升级所需tmp目录最小空间,单位 | 无 |
| Delete | BasicSetting | 删除固件 | Id: String - 固件名称,同类型固件名称相同 | 无 |
| GetAllFirmwareInfo | ReadOnly | 获取所有固件信息 | 无 | FirmwareInfoList: Array[FirmwareInfoItem] |
| GetFirmwareList | ReadOnly | 根据筛选条件获取指定固件信息 | Options: Dictionary - 固件筛选条件 | FirmwareInfoList: Array[FirmwareInfoItem] |
- FirmwareInfoItem详细说明
| 字段 | 类型 | 描述 |
|---|---|---|
| FirmwareId | String | 固件标识 |
| FirmwareInfo | Dictionary | 固件信息 |
2.1.5 bmc.kepler.UpdateService.FirmwareInfo
path:/bmc/kepler/UpdateService/FirmwareInventory/:Id
properties
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| Id | String | ✓ | const | 固件名称,同类型固件名称相同 | ActiveBMC |
| Name | String | ✓ | const | 相同固件名称的固件可能有多个,在Description中区分 | ActiveBMC |
| Version | String | ✗ | - | 固件版本号 | 5.11.00.01 |
| BuildNum | String | ✓ | false | 固件构建版本 | 001 |
| ReleaseDate | String | ✗ | - | 固件发布时间 | 14:14:47 Sep 14 2025 |
| LowestSupportedVersion | String | ✓ | false | 固件支持的最低版本,可用于防回退 | 5.00.00.01 |
| SoftwareId | String | ✓ | - | 软件识别标签 | BMC-openUBMC |
| Manufacturer | String | ✓ | - | 固件发布厂商名 | Manufacturer |
| Updateable | Boolean | ✓ | - | 固件是否支持更新 | true |
| Location | String | ✓ | - | 固件加载的位置 | - |
| RollbackStatus | String | ✗ | false | 回滚状态 | Idle |
| ActiveMode | String | ✗ | - | 生效方式 | Immediately |
| Parameters | Dictionary | ✗ | - | 升级任务的附加参数 | 0 |
| State | String | ✗ | - | 当前固件的使能状态 | Enabled |
| Severity | String | ✗ | - | 固件或硬件的健康状态 | Informational |
| MaxPackageSizeMiB | S32 | ✓ | - | 固件升级所需tmp目录最小空间,单位(MB) | 90 |
| EstimatedDuration | U32 | ✓ | false | 固件预计升级的总时间,单位:秒 | 90 |
| FirmwareType | String | ✓ | - | 固件类型 | Disk |
| StageSupported | Boolean | ✓ | false | 固件是否支持暂存升级 | false |
| RelatedItem | String[] | ✓ | false | 固件应用的设备 | [] |
此接口通常是通过 bmc.kepler.UpdateService.FirmwareInventory 下 Add 方法添加。
添加案例:
local FWINVENTORY_PATH = '/bmc/kepler/UpdateService/FirmwareInventory/'
local FIRMWARE_INFO_INTERFACE = 'bmc.kepler.UpdateService.FirmwareInfo'
...
local obj = mdb.get_object(bus, FWINVENTORY_PATH, FIRMWARE_INFO_INTERFACE)
local param = {
Id = id,
Name = name,
Version = version,
BuildNum = build_num or '',
ReleaseDate = release_date or '',
LowestSupportedVersion = lowest_supported_version or '',
SoftwareId = software_id or '',
Manufacturer = manufacturer or '',
Location = location or '',
State = state or 'Enabled',
Severity = severity or 'Informational'
}
obj:Add(context.new(), param, true, 1, 90)
...添加成功后,firmware_mgmt 存在关键日志:Add firmware inventory successfully, Id:xxx, ......。
如果添加失败,常见原因:
固件名称重复,添加失败,关键日志:
Already exist the same Id:[xxx] to path xxx固件信息参数不正确,方法调用失败。Add方法的
FirmwareInfoTable签名为a{ss},因此通过FirmwareInfoTable传参给firmware_mgmt需要保证内容为字符串(firmware_mgmt会将字符串转换为资源协作接口定义的类型)
2.2 StartUpgrade
功能说明
启动固件升级。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.UpdateService |
| 首发版本 | bmcsdk 25.03 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| FilePath | 输入 | String | 升级包路径 | String |
| AdditionalOptions | 输入 | Dictionary | key:String,value:String | |
| TaskId | 输出 | U32 | 升级任务ID | U32 |
AdditionalOptions键值对举例
| 键 | 值范围 | 说明 |
|---|---|---|
| ForceUpdate | “true”:版本号一致的固件升级 “false”:版本号一致的固件不升级 | 固件是否强制升级 |
| Stage | “true”:暂存 “false”:不暂存 | 固件是否暂存 |
| RestoreFactorySettings | “true”(升级完成之后恢复出厂设置) “false”(升级完成后不恢复出厂设置) | 是否恢复出厂设置 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| U32 | 升级成功 | 正常执行完成 | 无 |
应用场景
启动固件升级。
调试示例
命令行调试
busctl --user call bmc.kepler.firmware_mgmt /bmc/kepler/UpdateService bmc.kepler.UpdateService StartUpgrade a{ss}is 3 Interface Busctl UserName Administrator ClientAddr <ip> 1 /tmp/openUBMC.hpm
响应:u 32.3 ParallelUpdate
功能说明
启动固件并行升级。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.UpdateService |
| 首发版本 | bmcsdk 25.06 |
| 废弃状态 | 正常可用 |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| UpgradeOptions | 输入 | Dictionary | 固件并行升级可选参数,对所有Package都生效 | key:String,value:String |
| Packages | 输入 | Array | 固件并行升级请求列表,每个元素描述一个升级子任务 | FilePath:String,升级包路径 AdditionalOptions:Dictionary,件升级可选参数,用于升级需要的参数扩展 |
UpgradeOptions键值对举例
| 键 | 值范围 | 说明 |
|---|---|---|
| ForceUpdate | “true”:版本号一致的固件升级 “false”:版本号一致的固件不升级 | 固件是否强制升级 |
| UpdateMode | “FullImage”或“OptionalFullImage” | 升级模式 |
| FullImagePath | String | FullImage模式的升级路径 |
| RestoreFactorySettings | “true”(升级完成之后恢复出厂设置) “false”(升级完成后不恢复出厂设置) | 是否恢复出厂设置 |
AdditionalOptions键值对举例
| 键 | 值范围 | 说明 |
|---|---|---|
| ForceUpdate | “true”:版本号一致的固件升级 “false”:版本号一致的固件不升级 | 固件是否强制升级 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 抛错FirmwareUpgradeError | 入参校验失败 | UpgradeOptions或Packages不是表 | 检查入参UpgradeOptions和Packages格式 |
| 抛错ActionNotSupported | 当前版本不支持并行升级 | 当前版本不支持并行升级 | 更换支持并行升级的版本 |
| 抛错ConcurrentReachedLimit | 当前并行的任务数超过了允许的上限值 | 当前并行的任务数超过了允许的上限值 | 停掉不必要的任务 |
应用场景
启动固件并行升级。
调试示例
命令行调试
注意: 不建议通过busctl命令直接进行并行升级,推荐使用redfish接口:/redfish/v1/UpdateService/Actions/Oem/{{OemIdentifier}}/UpdateService.ParallelUpdate。
3. 组件扩展案例
3.1 扩展能力概述
提供客户定制验签方式。
3.2 扩展点说明
客户可以定制hpm解析的接口库(xxx.so),自行实现xxx.so中的内容。详见《固件验签定制要求及使用指导》。
3.3 二次开发指导
步骤一
FirmwareCustomConfig对象中配置CustomVerifyEnabled和CustomVerifyLibraryName属性,分别表示客户验签流程定制使能和客户验签流程定制库名称。
步骤二
客户新增定制库/opt/bmc/luaclib/xxx.so,并实现xxx.so库中的内容,提供方法parse_hpm_file供lua接口调用。
示例代码
"FirmwareCustomConfig": {
"CustomVerifyEnabled": true, //客户签名定制使能
"CustomVerifyLibraryName": "sign_verify" //客户签名定制库为sign_verify.so
}验证方法
| 场景 | 预期 | 日志 |
|---|---|---|
| 客户定制包解析验证固件成功,需要继续BMC的验签+解析+升级 | 客户验签后,再次验签+解密升级包,最后升级成功 | the custom validate signature module is exist, load it custom verify signature successfully, code 1 |
| 客户定制包解析验证固件成功,需要继续BMC解析+升级 | 客户验签后,仅需解密升级包,最后升级成功 | the custom validate signature module is exist, load it custom verify signature successfully, code 2 |
| 客户定制包解析验证固件成功,需要继续升级 | 客户验签后,无需解密升级包,最后升级成功 | the custom validate signature module is exist, load it Custom Verify Code 3, skip decrypt file |
| 客户定制包解析验证固件失败(返回负数) | 客户验签后,退出升级流程,升级失败 | the custom validate signature module is exist, load it custom verify signature error, code ffffffffffffffff |
| 客户定制包解析验证流程异常(so库异常) | 验签+解密升级包,最后升级成功 | - |
日志说明
| 日志 | 说明 |
|---|---|
| the custom validate signature module is exist, load it | 客户定制的OS库导入正常 |
| the custom validate func is abnormal, can not skip verify. err:%s | 定制的方法内有异常 |
| custom verify signature error, code %x | 定制方法解析失败 |
| custom verify signature successfully, code %x | 定制方法解析成功 |
注意事项
- 确保在指定路径
/opt/bmc/luaclib下新增定制库;- 定制库
xxx.so库中需提供方法parse_hpm_file供lua接口调用,并且入参file_path为hpm包路径;响应返回约定的状态码标识。
4 CSR配置介绍
4.1 FirmwareComponentInfo对象配置介绍
此对象用于配置允许升级的固件,由ComponentID与ComponentIDEx确定唯一的固件,Name用于描述固件的名称
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| ComponentID | U8 | ✓ | false | 固件ID,用于区分固件, 范围:0-255 | 25 |
| ComponentIDEx | U32 | ✓ | false | 固件扩展ID,用于细分固件,ComponentID和ComponentIDEx用于区分唯一固件,默认:4294967295 | 1 |
| Name | String | ✓ | false | 固件名称 | "BMC" |
| RevisionNumber | U8 | ✓ | false | 软件sr配置的Revision,用于防回退,0代表无防回退 | 0 |
| RevisionNumber4User | U8 | ✓ | false | 用户设置的Revision,非CSR配置值,用于防回退,0代表无防回退,默认:0 | 0 |
| FirmwareResumeSupported | Boolean | ✓ | false | 是否支持恢复升级,默认:true | true |
| ComponentInitTime | U16 | ✓ | false | 固件初始化时间,达到准备时间后触发升级,默认:0 | 0 |
| TimeoutThreshold | U16 | ✓ | false | 升级管理监控每个固件升级任务的最大超时时间,范围:0-240,默认:120 | 120 |
4.2 ActiveComponentInfo对象配置介绍
此对象用于配置允许生效的固件名称。
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| Name | String | ✓ | false | 允许生效的固件名 | "CPLD" |
| ComponentInitTime | U16 | ✓ | false | 待生效固件初始化时间,达到准备时间后触发生效,默认:0 | 0 |
4.3 MutuallyExclusiveFirmwares对象配置介绍
此对象用于配置禁止固件同时升级的互斥关系,Id的构成方式为ComponentID与ComponentIDEx的组合的U64类型转换成字符串,其中ComponentID占高四字节,举例:"0x0000000505000001"。
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| CurrentFirmwareId | String | ✓ | false | 正在升级的固件ID | 0x0000000500000001 |
| ExclusiveFirmwareIds | String[] | ✓ | false | 禁止升级的固件ID列表 | ["0x0000000500000002", "0x0000000500000003"] |
5. 日志说明
5.1 一键日志收集
| 文件路径 | 内容说明 |
|---|---|
| AppDump/firmware_mgmt/firmware_mgmt_info.txt | 记录FirmwareInventory信息,包括Id、名称、版本好、构建次数、发布日期、最低支持版本、软件Id、厂商、是否可更新、位置 |
5.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
| verify signature error, code xxxxxxxxx | ERROR | 常见验签失败code及原因 | 根据错误码定位失败原因 |
| rsa_decrypt failed | ERROR | 环境上为原始hpm包,但是升级的包为签名+不加密的hpm包(出包有误),因此升级包解密失败(manifest仓库的.bmcgo/config若存在配置[hpm_encrypt]且enable=false,或者不存在[hpm_encrypt]配置,则表示该包为不加密包) | 重新出包 |
| add pss root certificate failed, code ffffffff | ERROR | 常见原因:社区的hpm包为不签名不加密方案,当环境上为社区包时,直接升级原始包会上报添加根证书失败 | 如果环境上是社区包,在升级回原始包前需要先升过渡包 |
| secure_tar_unzip failed: -3003 | ERROR | 一般是环境上为社区hpm包,但是升级的包已加密,即[hpm_encrypt]下enable=true | 重新出包 |
6. 问题定界指南
6.1 典型问题定界
| 现象描述 | 是否为本组件问题 | 判断依据 | 关键证据收集方法 |
|---|---|---|---|
| 升级包版本太低/过旧的升级包失败,环境上允许降级升级属性DowngradeAllowed被置成了false | 否 | 人为修改了环境配置 | 执行busctl --user get-property bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/UpdateMgmt bmc.kepler.UpdateService.UpdateMgmt DowngradeAllowed命令, DowngradeAllowed查询出的值为false |
| 升级报错:无效升级包,打印日志:FirmwareType is nil, invalid package config | 否 | 没有在vpd仓定义需要升级的固件类型,自发现没分发此固件的对象给firmware_mgmt,导致firmware_mgmt无法识别此固件 | 查看vpd仓中对应的机型的platform.sr中是否定义了要升级的固件类型,没有的话要新增 |
6.2 错误码速查表
| 错误码 | 含义 | 可能原因 | 排查建议 |
|---|---|---|---|
| 88200004 | 证书发布者不存在 | 升级包签名与根证书不对应 | 换用正确的根证书重新签名升级包 |
6.3 调试方法
开启调试日志
busctl资源协作接口方法调试见文档第二章节。
7. 常见问题解答
常见问题解答请查阅《MCU、VRD、CSR、CPLD升级与板卡管理问题指南》、《升级常见问题指南》。
附录
附录A 参考资料
附录B 修订记录
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| v1.0 | 2026-05-08 | mkdlf | 修改文档格式,补充API、日志说明、常见问题解答 |