bmc_upgrade

版本信息

项目内容
组件版本1.120.15
文档作者孙先敏
最后更新2026-08-11

1. 组件概述

1.1 组件简介

bmc_upgrade是BMC固件升级管理组件,负责BMC自身固件的具体升级执行。该组件响应firmware_mgmt发出的升级信号,执行实际的BMC固件升级操作,包括升级包解密、flash写入、分区切换等。

1.2 解决什么问题

bmc_upgrade组件主要解决BMC自身固件升级的具体执行问题,与firmware_mgmt协同工作:firmware_mgmt负责升级流程调度和协调,bmc_upgrade负责BMC固件升级的实际执行。主要解决以下问题:

  • BMC固件升级三阶段的具体实现(prepare、process、finish)
  • 升级包的解密和flash写入
  • 启动分区切换和回滚操作
  • BMC固件信息的管理和注册
  • 版本号定制化支持

1.3 核心功能

  • 固件升级

响应firmware_mgmt发出的UpgradePrepareSignal、UpgradeProcessSignal、UpgradeFinishSignal信号,执行BMC固件升级的三个阶段:

prepare阶段:

验证固件类型是否为BMC升级消息

解析升级配置文件(update.cfg)

解析扩展参数(RestoreFactorySettings、ActiveMode、Platform等)

回复PrepareReply给firmware_mgmt

process阶段:

解密升级包(AES CBC 128算法)

提取升级镜像文件

获取当前启动分区,计算目标写入分区

格式化目标分区并写入镜像

设置启动分区标志

回复ProcessReply给firmware_mgmt

finish阶段:

更新AvailableBMC固件信息到数据库

向firmware_mgmt注册生效动作(ActiveMode)

若需要恢复出厂设置,发送RestoreFactorySettings信号

回复FinishReply给firmware_mgmt

  • 固件回滚

响应firmware_mgmt发出的RollbackSignal信号,执行BMC固件回滚:

查询ActiveBMC和AvailableBMC的固件信息

更新AvailableBMC的版本信息

获取当前启动分区,设置启动分区为另一个分区

调用GracefulReset复位BMC

  • 固件信息管理

维护BMC固件信息表(BmcFwInfoTable),包括:

ActiveBMC:当前运行的BMC固件信息

AvailableBMC:可用分区的BMC固件信息

ActiveBMCSDK:当前运行的BMC SDK固件信息

向firmware_mgmt注册BMC固件信息

支持版本号定制化(根据Customer获取定制版本)

  • 升级管理配置

管理BMC升级相关的配置:

降级控制(DowngradeAllowed)

撤销版本管理(RevokedVersions)

恢复出厂设置选项

1.4 关键术语表

术语解释
BMC固件升级将新版本的BMC固件写入BMC的存储介质(eMMC Flash)的过程
固件回滚将BMC固件从当前版本恢复到之前的版本,通过切换启动分区实现
分区切换BMC通常有rofs-a和rofs-b两个rootfs分区,升级时写入非当前启动的分区
版本定制化根据客户信息(Customer)定制BMC版本号,支持多版本共存

1.5 外部交互边界图

BMC固件升级时序图

bmc_upgrade与firmware_mgmt的交互流程:

firmware_mgmt                    bmc_upgrade
     |                                  |
     |------ UpgradePrepareSignal ----->|
     |                                  |--- prepare阶段处理
     |<----- PrepareReply --------------|
     |                                  |
     |------ UpgradeProcessSignal ----->|
     |                                  |--- process阶段处理
     |<----- ProcessReply --------------|
     |                                  |
     |------ UpgradeFinishSignal ------>|
     |                                  |--- finish阶段处理
     |<----- FinishReply ---------------|
     |                                  |

2. API 使用说明与示例

2.1 资源协作接口概览

2.1.1 bmc.kepler.UpdateService.ManagerVersion

path: /bmc/kepler/UpdateService/ManagerVersion

properties

属性名数据类型只读emitsChangedSignal描述示例值
MajorVersionStringfalseBMC主版本号5
PlatformMajorVersionStringfalse平台主版本号,表征当前版本是iBMC3005
MinorVersionStringfalseBMC次版本号11
VersionStringfalseBMC完整版本号5.11.00.01

methods

方法名权限描述请求参数响应参数
GetReleaseVersionReadOnly获取BMC各分区版本号ActiveReleaseVersion: String - 主分区的版本号
BackupReleaseVersion: String - 备份分区的版本号
AvailableReleaseVersion: String - 可用分区的版本号

2.1.2 bmc.kepler.UpdateService.UpdateMgmt

path: /bmc/kepler/UpdateService/UpdateMgmt

properties

属性名数据类型只读emitsChangedSignal描述示例值
DowngradeAllowedBoolean-是否允许降级升级,CSR配置项false
RestoreFactorySettingsOptionU32-恢复出厂设置选项0
RevokedVersionsString-撤销版本列表,用于防回退""
RevokedVersionEnabledBoolean-撤销版本使能开关false
ActiveImageU8-当前活跃镜像分区编号0
LastActionU8-最后一次升级动作0
LastUpgradeResultS32-最后一次升级结果,0成功,负数失败0
OnetimeUpdateEnabledBoolean-一次性更新使能开关false
UpdateStageU8-更新阶段状态,CSR配置项0
LastUpgradeSuccessBoolean-最后一次升级是否成功true
ExpectedActivePartitionU8-预期活跃分区编号(持久化)0
ExpectedBackupPartitionU8-预期备份分区编号(持久化)0

methods

方法名权限描述请求参数响应参数
AddRevokedVersionsSecurityMgmt添加撤销版本Versions: String - 撤销版本号
RemoveRevokedVersionsSecurityMgmt移除撤销版本Versions: String - 撤销版本号
ClearRevokedVersionsSecurityMgmt清空撤销版本列表

signals

信号名描述参数
RestoreFactorySettings恢复出厂设置信号,升级后需要恢复出厂设置时发送PreserveList: 无

2.1.3 bmc.kepler.UpdateService.FirmwareInfo

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

bmc_upgrade组件负责维护和注册BMC相关的固件信息,包括:

Id描述
ActiveBMC当前运行的BMC固件信息
AvailableBMC可用分区的BMC固件信息(升级后写入的分区)
ActiveBMCSDK当前运行的BMC SDK固件信息

properties

属性名数据类型只读emitsChangedSignal描述示例值
IdStringconst固件标识ActiveBMC
NameStringconst固件名称ActiveBMC
VersionString-固件版本号5.11.00.01
BuildNumStringfalse固件构建版本001
ReleaseDateString-固件发布时间14:14:47 Sep 14 2025
LowestSupportedVersionStringfalse固件支持的最低版本,用于防回退5.00.00.01
SoftwareIdString-软件识别标签BMC-iBMC
ManufacturerString-固件发布厂商名Huawei
UpdateableBoolean-固件是否支持更新true
LocationString-固件加载的位置""
StateString-当前固件的使能状态,ActiveBMC为Enabled,AvailableBMC为StandbySpareEnabled
SeverityString-固件或硬件的健康状态Informational
ActiveModeString-生效方式Immediately
ActiveModeSupportedBoolean-是否支持延迟重启生效true
ActiveModeEnabledBoolean-延迟重启生效是否使能false
CapabilityU16-固件支持的能力位图5

此接口由bmc_upgrade组件通过调用firmware_mgmt的Add方法添加。

添加案例:

lua
local ctx = require('mc.context').get_context_or_default()
local datas = {
    Id = 'ActiveBMC',
    Name = 'ActiveBMC',
    Version = '5.11.00.01',
    BuildNum = '001',
    ReleaseDate = '14:14:47 Sep 14 2025',
    LowestSupportedVersion = '5.00.00.01',
    SoftwareId = 'BMC-iBMC',
    Manufacturer = 'Huawei',
    Location = '',
    State = 'Enabled',
    Severity = 'Informational',
    ComponentID = '25',
    SubComponentID = '4294967295',
    TargetUIDs = '',
    RelatedItem = '/redfish/v1/Managers/1'
}
obj:Add(ctx, datas, true, 5, 90)

添加成功后,存在关键日志:register firmware [ActiveBMC] successfully

2.2 GetReleaseVersion

功能说明

获取BMC各分区的版本号信息。

属性内容
接口名bmc.kepler.UpdateService.ManagerVersion
首发版本bmcsdk 25.03
废弃状态正常可用

参数说明

无输入参数。

返回值与异常

返回值含义触发条件处理建议
ActiveReleaseVersion主分区版本号正常执行完成
BackupReleaseVersion备份分区版本号正常执行完成
AvailableReleaseVersion可用分区版本号正常执行完成

应用场景

查询BMC各分区的固件版本号,用于升级前确认版本信息或升级后验证版本。

调试示例

命令行调试
text
busctl --user call bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/ManagerVersion bmc.kepler.UpdateService.ManagerVersion GetReleaseVersion

响应:sss "5.11.00.01" "5.11.00.01" "5.10.00.01"

2.3 AddRevokedVersions

功能说明

添加撤销版本,用于防止固件回退到指定版本。

属性内容
接口名bmc.kepler.UpdateService.UpdateMgmt
首发版本bmcsdk 25.03
废弃状态正常可用

参数说明

参数名方向类型描述取值范围
Versions输入String撤销版本号字符串

返回值与异常

无返回值。

应用场景

防止固件回退到已知存在安全漏洞的版本,配合RevokedVersionEnabled使用。

调试示例

命令行调试
text
busctl --user call bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/UpdateMgmt bmc.kepler.UpdateService.UpdateMgmt AddRevokedVersions s "5.00.00.01"

3. 组件扩展案例

3.1 扩展能力概述

bmc_upgrade组件支持以下扩展能力:

  • 版本号定制化:根据Customer信息获取定制版本号
  • 恢复出厂设置:升级后可触发恢复出厂设置流程

3.2 版本号定制化

扩展点说明

BMC版本号支持定制化,根据客户信息(Customer)获取对应的定制版本号。

二次开发指导

步骤一

在Package对象中配置Customer属性,指定客户名称。

步骤二

/opt/bmc/extend/<Customer>/目录下创建version.json文件,内容示例:

json
{
    "Version": "5.11.00.01-Custom"
}

验证方法

场景预期日志
Customer有效且version.json存在使用定制版本号customer version is ignored
Customer无效使用原始版本号customer [%s] is invalid. customer version is ignored

3.3 恢复出厂设置

扩展点说明

升级时可通过AdditionalOptions参数指定升级后恢复出厂设置。

使用方式

在升级参数中设置RestoreFactorySettings=true

lua
local para_tab = {
    RestoreFactorySettings = "true"
}

升级完成后,bmc_upgrade会发送RestoreFactorySettings信号给oms组件处理。

4 CSR配置介绍

4.1 UpdateMgmt对象配置介绍

此对象用于配置BMC升级管理相关参数。

属性名数据类型只读emitsChangedSignal描述示例值
DowngradeAllowedBoolean-是否允许降级升级,true允许,false禁止false
UpdateStageU8-更新阶段状态0

4.2 BmcFwInfoTable对象配置介绍

此对象用于持久化BMC固件信息,由bmc_upgrade组件内部维护。

属性名数据类型只读emitsChangedSignal描述示例值
IdString-固件标识,主键ActiveBMC
NameString-固件名称ActiveBMC
VersionString-固件版本号5.11.00.01
BuildNumString-固件构建版本001
ReleaseDateString-固件发布时间14:14:47 Sep 14 2025
LowestSupportedVersionString-固件支持的最低版本5.00.00.01
SoftwareIdString-软件识别标签BMC-iBMC
ManufacturerString-固件发布厂商名Huawei
UpdateableBoolean-固件是否支持更新true
LocationString-固件加载的位置""
CapabilityU16-固件支持的能力位图5
StateString-当前固件的使能状态Enabled
ActiveModeString-生效方式Immediately
ActiveModeSupportedBoolean-是否支持延迟重启生效true
ActiveModeEnabledBoolean-延迟重启生效是否使能false
SeverityString-固件或硬件的健康状态Informational

3. 组件扩展案例

3.1 扩展能力概述

提供客户定制验签、拆包解析方式。

3.2 扩展点说明

客户可以定制hpm解析的接口库(xxx.so),自行实现xxx.so中的内容。详见《固件验签、拆包解析定制要求及使用指导》

3.3 二次开发指导

步骤一

定制固件验签、拆包解析需要配置CSR,需要在FirmwareCustomConfig对象中配置CustomVerifyEnabled、CustomVerifyLibraryName、CustomParseEnabled、CustomParseLibraryName属性。属性说明见下表:

属性名属性类型取值说明
CustomVerifyEnabledBoolean客户验签流程定制使能,true:使能;false:禁用,默认值为false
CustomVerifyLibraryNameString客户验签流程定制库名称,默认值为"hpm_parser"
CustomParseEnabledBoolean客户拆包解析流程定制使能,true:使能;false:禁用,默认值为false
CustomParseLibraryNameString客户拆包解析流程定制库名称,默认值为"hpm_parser",字符串长度约束1~32

步骤二

  • 验签定制:客户新增定制库/opt/bmc/luaclib/xxx.so,并实现xxx.so库中的内容,提供方法parse_hpm_file供lua接口调用。
  • 拆包解析定制:客户新增定制库/opt/bmc/luaclib/xxx.so,并实现xxx.so库中的内容,提供方法 custom_parse_pkg供lua接口调用。

示例代码

json
"FirmwareCustomConfig": {
    "CustomVerifyEnabled": true, //客户签名定制使能
    "CustomVerifyLibraryName": "sign_verify", //客户签名定制库为sign_verify.so
    "CustomParseEnabled": true, //客户拆包解析定制使能
    "CustomParseLibraryName": "hpm_parser" //客户拆包解析定制库为hpm_parser.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定制方法解析成功
注意事项
  1. 确保在指定路径/opt/bmc/luaclib下新增定制库;
  2. 定制库xxx.so库中需提供方法parse_hpm_file供lua接口调用,并且入参file_path为hpm包路径;响应返回约定的状态码标识。
拆包解析
场景预期日志
CustomParseEnabled=true,自定义拆包解析库存在且功能正常升级成功custom parse pkg successfully
CustomParseEnabled=true,自定义拆包解析库不存在回退标准拆包流程,若包格式与标准格式相同,则升级成功,否则升级失败fallback to standard parse
CustomParseEnabled=true,自定义拆包解析库异常升级失败custom parse pkg func is abnormal
CustomParseEnabled=true,自定义拆包解析失败,返回false升级失败custom parse pkg fail
CustomParseEnabled=true,自定义拆包解析后输出目录下缺少必带文件升级失败required file not found after custom parse
CustomParseEnabled=true,自定义拆包解析后update.cfg格式错误升级失败Get Basic Version failed
Update file num is invalid
parse update.cfg content failed

日志说明

日志说明
custom parse pkg successfully拆包解析流程正常
fallback to standard parse回退标准拆包流程
custom parse pkg func is abnormal定制的方法内有异常
custom parse pkg fail定制方法解析失败
required file not found after custom parse定制方法解析出的数据不全
Get Basic Version failed
Update file num is invalid
parse update.cfg content failed
update.cfg格式解析失败
注意事项
  1. 确保在指定路径/opt/bmc/luaclib下新增定制库;
  2. 定制库xxx.so库中需提供方法custom_parse_pkg供lua接口调用,并且入参file_path为hpm包路径,output_dir为拆包解析后数据存放目录;响应为true(解析成功)/false(解析失败),且在output_dir下存放必带文件。

4 CSR配置介绍

4.1 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

4.2 ActiveComponentInfo对象配置介绍

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

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

4.3 MutuallyExclusiveFirmwares对象配置介绍

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

属性名数据类型只读emitsChangedSignal描述示例值
CurrentFirmwareIdStringfalse正在升级的固件ID0x0000000500000001
ExclusiveFirmwareIdsString[]false禁止升级的固件ID列表["0x0000000500000002", "0x0000000500000003"]

5. 日志说明

5.1 一键日志收集

文件路径内容说明
AppDump/bmc_upgrade/bmc_upgrade_info.txt记录BMC固件信息,包括ActiveBMC、AvailableBMC、ActiveBMCSDK的版本信息

5.2 关键日志信息

日志片段日志级别含义解读建议处理动作
prepare upgrade: system_id=%d, firmware_type=%sINFO收到升级prepare信号正常流程日志
process upgrade failed, err(%s)ERROR升级process阶段失败检查升级包是否损坏、flash空间是否充足
update AvailableBMC info failed, ret(%s)ERROR更新AvailableBMC信息失败检查数据库操作是否正常
Register active action successfullyNOTICE成功向firmware_mgmt注册生效动作正常流程日志
BMC begin to rollback, version from %s to %sNOTICE开始BMC回滚流程正常流程日志
Reboot BMC successfullyNOTICEBMC重启成功正常流程日志
unzip failed, err(%s)ERROR解压升级包失败检查升级包格式是否正确
secure_tar_unzip failed: -3003ERROR解压升级包失败,通常是包格式不匹配检查升级包是否正确
customer version is ignoredNOTICE忽略客户定制版本,使用原始版本正常流程日志
init_update_mgmt: DowngradeAllowed = %sNOTICE初始化UpdateMgmt配置确认降级配置是否正确

6. 问题定界指南

6.1 典型问题定界

现象描述是否为本组件问题判断依据关键证据收集方法
BMC升级失败,提示解压失败bmc_upgrade组件负责升级包解压检查日志中的unzip/secure_tar_unzip错误信息
BMC升级失败,提示写入flash失败bmc_upgrade组件负责flash写入检查日志中的分区格式化、镜像写入错误信息
BMC升级成功但版本号未更新版本号显示由firmware_mgmt管理检查firmware_mgmt日志
BMC回滚失败bmc_upgrade组件负责回滚执行检查日志中的rollback相关信息
升级后BMC无法启动可能是镜像写入不完整或分区设置错误检查升级日志、分区状态
不允许降级升级DowngradeAllowed由CSR配置或用户设置执行busctl --user get-property bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/UpdateMgmt bmc.kepler.UpdateService.UpdateMgmt DowngradeAllowed命令查询

6.2 错误码速查表

错误码含义可能原因排查建议
E_FAILED (-1)升级失败升级包解密、解压或写入失败检查升级包完整性和flash空间
-3003解压失败升级包格式不匹配或损坏检查升级包是否为正确格式

6.3 调试方法

开启调试日志

可通过查看bmc_upgrade服务日志获取调试信息:

bash
journalctl -u bmc_upgrade -f

查询版本信息

bash
# 查询ManagerVersion属性
busctl --user get-property bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/ManagerVersion bmc.kepler.UpdateService.ManagerVersion Version

# 查询各分区版本号
busctl --user call bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/ManagerVersion bmc.kepler.UpdateService.ManagerVersion GetReleaseVersion

查询升级管理配置

bash
# 查询是否允许降级
busctl --user get-property bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/UpdateMgmt bmc.kepler.UpdateService.UpdateMgmt DowngradeAllowed

# 查询撤销版本配置
busctl --user get-property bmc.kepler.bmc_upgrade /bmc/kepler/UpdateService/UpdateMgmt bmc.kepler.UpdateService.UpdateMgmt RevokedVersions

7. 常见问题解答

7.1 BMC升级失败如何排查?

  1. 检查升级包格式是否正确
  2. 检查flash空间是否充足(需预留90MB以上tmp空间)
  3. 查看bmc_upgrade日志定位具体失败阶段
  4. 确认是否允许降级(DowngradeAllowed配置)

7.2 如何配置防回退?

通过CSR配置DowngradeAllowed=false禁止降级,或通过RevokedVersions配置撤销版本列表。

7.3 如何查看BMC各分区版本?

调用GetReleaseVersion方法或查询ManagerVersion属性。

更多问题请查阅《升级常见问题指南》

附录

附录A 参考资料

附录B 修订记录

版本日期修订人修订内容
v1.02026-05-08mkdlf修改文档格式,补充API、日志说明、常见问题解答
v1.12026-08-11mkdlf更正文档内容为bmc_upgrade组件实际功能