功能简介
固件管理为BMC基本功能特性,客户使用场景中主要涉及固件升级、固件生效、固件信息查询、固件回滚等。
关键特性
1 基本功能
1.1 固件升级
固件升级是客户使用过程中常见场景,如对BMC、BIOS、CPLD等固件进行升级。此功能使用频率较高。当前固件管理提供了串行升级和并行升级两种升级方式,功能上包括本地升级和远程升级。
本地升级:固件升级包已存在于BMC本地文件系统(位于
/tmp目录下),升级时直接从本地路径读取固件包进行升级。远程升级:固件升级包存储在远程服务器上,BMC通过网络协议(如FTP、TFTP、HTTP、NFS、SCP等)下载固件包到本地后再进行升级。适用于固件包存储在远程服务器,需要通过网络传输获取的场景。
1.2 固件生效
当前固件生效存在两种生效方式,一种是被动生效,一种是主动生效。 被动生效为固件管理模块检测到生效条件满足后自动触发生效任务,主动生效为客户通过BMC界面进行生效操作。 当前较危险的生效动作,如BMC升级后重启或者CPLD生效后进行掉电处理,此类操作可能会影响固件之间的生效,导致异常情况,因此由固件管理统一管理。
1.3 固件信息查询
当客户需要查询当前系统的固件信息时,如各固件的名称、类型、版本、发布时间等基本信息,此特性可以提供对所有固件信息进行统一管理,方便查询。
1.4 镜像回滚
当客户需要回滚到之前的固件版本时,此特性可以提供回滚操作,如BMC主备分区倒换功能。
资源协作接口
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 - 固件名称,同类型固件名称相同 |
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 - 固件的类型信息,由固件管理统一分配管理 |
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 ......
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 | 固件信息 |
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会将字符串转换为资源协作接口定义的类型)
CSR配置介绍
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 |
ActiveComponentInfo对象配置介绍
此对象用于配置允许生效的固件名称
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| Name | String | ✓ | false | 允许生效的固件名 | "CPLD" |
| ComponentInitTime | U16 | ✓ | false | 待生效固件初始化时间,达到准备时间后触发生效,默认:0 | 0 |
MutuallyExclusiveFirmwares对象配置介绍
此对象用于配置禁止固件同时升级的互斥关系,Id的构成方式为ComponentID与ComponentIDEx的组合的U64类型转换成字符串,其中ComponentID占高四字节,举例:"0x0000000505000001"
| 属性名 | 数据类型 | 只读 | emitsChangedSignal | 描述 | 示例值 |
|---|---|---|---|---|---|
| CurrentFirmwareId | String | ✓ | false | 正在升级的固件ID | 0x0000000500000001 |
| ExclusiveFirmwareIds | String[] | ✓ | false | 禁止升级的固件ID列表 | ["0x0000000500000002", "0x0000000500000003"] |
高频常见问题与关键日志介绍
场景:社区包与原始包互相升级场景
关键日志:verify signature error, code xxxxxxxxx 常见验签失败code及原因介绍。
关键日志:88200004: 证书发布者不存在。该code出现原因是升级包签名与根证书不对应。处理方法:换用正确的根证书重新签名升级包。
关键日志:add pss root certificate failed,code ffffffffffffffff: 此处常见原因为:由于社区的hpm包为不签名不加密方案,当环境上为社区包时,因此直接升级原始包会上报添加根证书失败。
关键日志:rsa_decrypt failed 该问题出现场景一般是因为环境上为原始hpm包,但是升级的包为签名+不加密的hpm包(出包有误),因此升级包解密失败。处理方案:重新出包 manifest仓库的.bmcgo/config若存在配置[hpm_encrypt]且enable=false,或者不存在[hpm_encrypt]配置,则表示该包为不加密包。
关键日志:secure_tar_unzip failed: -3003 此关键日志与rsa_decrypt failed原因有类似之处。此日志出现场景一般是环境上为社区hpm包,但是升级的包已加密,即[hpm_encrypt]下enable=true。处理方案:重新出包