firmware_mgmt
更新时间: 2026/02/05
在Gitcode上查看源码

功能简介

固件管理为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描述示例值
UpgradeKeyDomainIdU32false固件升级解包使用的密钥的domain id4
UpgradingFlagBoolean-标识当前是否存在升级任务false
ParallelSupportedBoolean-标识当前版本是否支持并行升级true
UpgradeModeStringfalse标识当前升级模式(Serial/Parallel)Serial
TimeoutPolicyU8false升级管理对于升级超时之后的处理策略,0:无动作;1:复位BMC,默认00
ManufacturerValidateEnabledBooleanfalse是否支持升级时进行厂商校验false

methods

方法名权限描述请求参数响应参数
StartUpgradeBasicSetting启动固件升级接口FilePath: String - 升级包路径
AdditionalOptions: Dictionary - 固件升级可选参数,用于各种升级扩展场景
TaskId: U32 - 升级任务ID
ParallelUpdateBasicSetting启动固件并行升级接口UpgradeOptions: Dictionary - 固件并行升级可选参数,对所有Package都生效
Packages: Array - 固件并行升级请求列表,每个元素描述一个升级子任务
TaskId: U32 - 并行升级主任务ID
SubTaskIds: U32[] - 并行升级子升级任务ID列表
PrepareReplyBasicSetting回复prepare动作结果SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
VersionStr: String - 版本字符串
PrepareResult: S32 - 准备结果
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景
ProcessReplyBasicSetting回复process动作结果SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
ProcessResult: S32 - 处理结果
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景
FinishReplyBasicSetting回复finish动作结果SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
FinishResult: S32 - 完成结果
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景
UpdateUpgradeStatusBasicSetting固件子模块上报升级状态SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
ResultCode: S32 - int32结果码,取值:0-OK,-1代表失败
Progress: S32 - 升级进度,为0到100的值
ResultDetail: String - 结果详细表述,对结果码进行更详细的解释,最大长度512
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景
GetUpgradeStatusBasicSetting获取升级状态TaskId: U32 - 任务标识FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
ResultCode: S32 - 成功为0,失败为-1
Progress: S32 - 进度0-100
ResultDetail: String - 结果详细表述,对结果码进行更详细的解释
GetUpdateProgressReadOnly获取所有升级任务的进度信息UpgradeMode: String - 当前升级模式
UpgradeTasks: Array - 升级任务的进度信息
GetPendingFirmwareListReadOnly获取所有待生效固件信息PendingFirmwareList: Array - 待生效固件信息
RollbackBasicSetting回滚特定固件SystemId: S32 - 系统ID
Id: String - 固件名称,同类型固件名称相同
ExportBasicSetting导出特定固件SystemId: S32 - 系统ID
Id: String - 固件名称,同类型固件名称相同
CheckFirmwareTypeBasicSetting校验升级包的固件类型是否符合预期FilePath: String - 升级包的路径
FirmwareType: String - 升级包的预期固件类型
IsMatch: Boolean - 升级包与预期固件类型是否匹配
ParseFirmwarePackageBasicSetting完成FilePath下的hpm包的完整性校验以及CMS验签FilePath: String - 需要解压的hpm包的地址FirmwareType: String - 解压后的固件包的type
FirmwareDirectory: String - 解压后的固件升级文件的位置
ActiveStagedFirmwaresBasicSetting用于暂存生效FirmwareIds: String[] - 待暂存生效固件ID列表TaskId: U32 - 暂存生效的主任务ID
SubTaskIds: U32[] - 暂存生效的子升级任务ID列表
DiscardStagedFirmwaresBasicSetting弃用待暂存生效固件FirmwareIds: String[] - 待弃用的暂存生效固件ID列表TaskId: U32 - 弃用暂存生效的主任务ID
SubTaskIds: U32[] - 弃用暂存生效的子升级任务ID列表
  • ParallelUpgradePackages详细说明
字段类型描述
FilePathString升级包路径
AdditionalOptionsDictionary固件升级可选参数,用于升级需要的参数扩展
  • UpdateProgress详细说明
Key描述
TaskName升级任务名
Firmware升级固件描述
FirmwareInstance升级固件实例
FileName升级包名称
Percentage升级进度
TaskState升级状态
ErrorCode升级任务错误码
EstimatedRemainingTime固件预计升级的剩余时间
CurrentVersion升级固件当前版本号
TargetVersion升级固件目标版本号
ActivateMode固件生效方式,取值有:NoAction:自动生效、ResetBMC:复位BMC生效、PowerOff:下电生效
  • PendingFirmware详细说明
字段类型描述
SystemIdU8系统ID
FirmwareString待生效固件描述
FirmwareInstanceString待生效固件实例
ActiveStatusString生效状态,当前可有的取值有:'ToBeActivated', 'Activating', 'Activated'
ActiveActionString生效动作

signals

信号名描述参数
UpgradePrepareSignal升级准备信号SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
CfgPath: String - 固件包解析后的配置文件包路径信息
FilePath: String - 固件包的路径信息,用于BIOS/CPLD固件做flash转储场景使用
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于各种子固件扩展场景
UpgradeProcessSignal升级处理信号SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
FileName: String - 固件包的名称
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景
UpgradeFinishSignal升级完成信号SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
AdditionalOptions: Dictionary - 固件升级扩展可选参数字典,用于并行升级等扩展场景
RollbackSignal回滚信号SystemId: S32 - 系统ID
Id: String - 固件名称,同类型固件名称相同
ExportSignal导出信号SystemId: S32 - 系统ID
Id: String - 固件名称,同类型固件名称相同

bmc.kepler.UpdateService.FirmwareActive

path:/bmc/kepler/UpdateService/FirmwareActive methods

方法名权限描述请求参数响应参数
StartActiveBasicSetting启动固件生效SystemId: S32 - 系统IDTaskId: U32 - 生效任务标识
StartActiveWithPolicyBasicSetting根据策略启动固件生效SystemId: S32 - 系统ID
AdditionalOptions: Dictionary - 固件生效可选参数字典,用于传递生效策略
TaskId: U32 - 生效任务标识
RegisterActiveActionBasicSetting注册生效动作ActiveAction: Array[KeyValueTable] - 各固件调用此方法向 firmware_mgmt 注册生效条件、生效动作
UpdateActiveStatusBasicSetting更新生效状态ActiveStatus: Array[KeyValueTable] - 各固件调用此方法向 firmware_mgmt 更新生效状态
ActiveProcessReplyBasicSetting回复生效处理结果SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理
ProcessResult: S32 - 处理结果

signals

信号名描述参数
ActiveProcessSignal生效处理信号SystemId: S32 - 系统ID
FirmwareType: String - 固件的类型信息,由固件管理统一分配管理

bmc.kepler.UpdateService.FirmwareActiveInfo

path:/bmc/kepler/UpdateService/FirmwareActive/:Id properties

属性名数据类型只读emitsChangedSignal描述示例值
FirmwareIdString-SystemId+固件类型-
FirmwareTypeString-固件类型-
ActiveConditionString-生效条件-
ActiveModeString-生效模式-
ActiveStatusString-生效状态-
SystemIdString-系统host id-

此接口内容通常是通过bmc.kepler.UpdateService.FirmwareActive下RegisterActiveAction方法添加 添加案例:

lua
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

方法名权限描述请求参数响应参数
AddBasicSetting添加固件列表FirmwareInfoTable: Dictionary - 固件基本信息
Updateable: Boolean - 固件是否支持更新
Capability: U16 - 固件支持的能力,每个bit标识一种能力,1 支持,0 不支持:固件信息查询、固件升级生效、固件回滚、固件导出、升级生效分离
MaxPackageSizeMiB: S32 - 此固件升级所需tmp目录最小空间,单位
DeleteBasicSetting删除固件Id: String - 固件名称,同类型固件名称相同
GetAllFirmwareInfoReadOnly获取所有固件信息FirmwareInfoList: Array[FirmwareInfoItem]
GetFirmwareListReadOnly根据筛选条件获取指定固件信息Options: Dictionary - 固件筛选条件FirmwareInfoList: Array[FirmwareInfoItem]
  • FirmwareInfoItem详细说明
字段类型描述
FirmwareIdString固件标识
FirmwareInfoDictionary固件信息

bmc.kepler.UpdateService.FirmwareInfo

path:/bmc/kepler/UpdateService/FirmwareInventory/:Id

properties

属性名数据类型只读emitsChangedSignal描述示例值
IdStringconst固件名称,同类型固件名称相同ActiveBMC
NameStringconst相同固件名称的固件可能有多个,在Description中区分ActiveBMC
VersionString-固件版本号5.11.00.01
BuildNumStringfalse固件构建版本001
ReleaseDateString-固件发布时间14:14:47 Sep 14 2025
LowestSupportedVersionStringfalse固件支持的最低版本,可用于防回退5.00.00.01
SoftwareIdString-软件识别标签BMC-openUBMC
ManufacturerString-固件发布厂商名Manufacturer
UpdateableBoolean-固件是否支持更新true
LocationString-固件加载的位置-
RollbackStatusStringfalse回滚状态Idle
ActiveModeString-生效方式Immediately
ParametersDictionary-升级任务的附加参数0
StateString-当前固件的使能状态Enabled
SeverityString-固件或硬件的健康状态Informational
MaxPackageSizeMiBS32-固件升级所需tmp目录最小空间,单位(MB)90
EstimatedDurationU32false固件预计升级的总时间,单位:秒90
FirmwareTypeString-固件类型Disk
StageSupportedBooleanfalse固件是否支持暂存升级false
RelatedItemString[]false固件应用的设备[]

此接口通常是通过 bmc.kepler.UpdateService.FirmwareInventory 下 Add 方法添加 添加案例:

lua
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描述示例值
ComponentIDU8false固件ID,用于区分固件, 范围:0-25525
ComponentIDExU32false固件扩展ID,用于细分固件,ComponentID和ComponentIDEx用于区分唯一固件,默认:42949672951
NameStringfalse固件名称"BMC"
RevisionNumberU8false软件sr配置的Revision,用于防回退,0代表无防回退0
RevisionNumber4UserU8false用户设置的Revision,非CSR配置值,用于防回退,0代表无防回退,默认:00
FirmwareResumeSupportedBooleanfalse是否支持恢复升级,默认:truetrue
ComponentInitTimeU16false固件初始化时间,达到准备时间后触发升级,默认:00
TimeoutThresholdU16false升级管理监控每个固件升级任务的最大超时时间,范围:0-240,默认:120120

ActiveComponentInfo对象配置介绍

此对象用于配置允许生效的固件名称

属性名数据类型只读emitsChangedSignal描述示例值
NameStringfalse允许生效的固件名"CPLD"
ComponentInitTimeU16false待生效固件初始化时间,达到准备时间后触发生效,默认:00

MutuallyExclusiveFirmwares对象配置介绍

此对象用于配置禁止固件同时升级的互斥关系,Id的构成方式为ComponentID与ComponentIDEx的组合的U64类型转换成字符串,其中ComponentID占高四字节,举例:"0x0000000505000001"

属性名数据类型只读emitsChangedSignal描述示例值
CurrentFirmwareIdStringfalse正在升级的固件ID0x0000000500000001
ExclusiveFirmwareIdsString[]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。处理方案:重新出包