固件验签、拆包解析定制要求及使用指导
更新时间: 2026/04/16
在Gitcode上查看源码

1. 固件验签、拆包解析定制要求

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

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

2. 流程

固件验签

  1. 客户新增 /opt/bmc/luaclib/xxx.so,作为定制hpm解析的接口库(xxx为定制so名称,下同)
  2. 客户自行实现 xxx.so内容,需要提供方法 parse_hpm_file供lua接口调用,入参file_path为hpm包路径;响应为状态码,通过约定返回的状态码标识,确定解析状态。当前实现返回状态码如下:
  • 正数表示解析成功,负数表示失败,返回负数则直接退出升级流程;
  • 返回状态码为1:解析验证固件成功,需要继续openUBMC的验签+解析+升级;
  • 返回状态码为2:解析验证固件成功,需要继续openUBMC的解析+升级;
  • 返回状态码为3:解析验证固件成功,直接结束固件解析,跳到后续升级

拆包解析

  1. 客户新增 /opt/bmc/luaclib/xxx.so,作为定制hpm解析的接口库(xxx为定制so名称,下同)
  2. 客户自行实现 xxx.so内容,需要提供方法 custom_parse_pkg供lua接口调用,入参file_path为hpm包路径,output_dir为拆包解析后数据存放目录;响应为true(解析成功)/false(解析失败),且在output_dir下存放必带文件。

3. 配置示例:

固件验签

json
"FirmwareCustomConfig": {
  "CustomVerifyEnabled": true, //客户签名定制使能
  "CustomVerifyLibraryName": "sign_verify" //客户签名定制库为sign_verify.so
}

拆包解析

json
"FirmwareCustomConfig": {
  "CustomParseEnabled": true, //客户拆包解析定制使能
  "CustomParseLibraryName": "hpm_parser" //客户拆包解析定制库为hpm_parser.so
}

4. 客户定制仓自行实现要求

固件验签定制库内容流程图

拆包解析定制库输入输出要求

固件管理标准流程调用客户定制库时,会传入file_path(hpm包路径),output_dir(拆包解析后数据存放目录),定制库自行对hpm包进行拆包解析,并将解析内容存放在output_dir下,output_dir必带数据如下:

  • beforeaction.sh(升级前自定义动作,内容可为空)
  • afteraction.sh(升级后自定义动作,内容可为空)
  • update.cfg(参考update.cfg规范)
  • 解压后的各个固件镜像的二进制数据(命名为FirmwareX,X为固件索引,起始值为1,随着固件数量递增,如Firmware1、Firmware2...,Firmware0用于将update.cfg这个文件作为固件进行描述)

5. update.cfg 规范

Basic 基础信息域

字段名称说明必选(M/O)约束样例
Version固件的内部版本号M按照各个不同的固件的版本规范进行定义。比如:BMC固件内部采用4段式版本号[Basic]
Version=X.XX.XX.XX
Revision固件的防回退登记号O当前固件配置了Revision并且是大于0的则生效。每个固件都可以定义自己的Revision,分为两种:
- RevisionNumber:硬件确定的防回退标记
- RevisionNumber4User:软件确定的防回退标记当固件配置的任何一个Revision小于待升级固件的Revision则不允许升级
[Basic]
Revision=20

Firmware 固件描述域

字段名称说明必选(M/O)约束样例
FileNum固件由多少个部分的子固件组成M最大32个[Firmware]
FileNum=2
FirmwareMode固件升级模式O取值:Multiple/Single 表示多firmware升级/单firmware升级[Firmware]
FirmwareMode=Multiple

FirmwareX 固件描述详细域

当前域会分为多个域进行描述。

字段名称说明必选(M/O)约束样例补充说明
ProductID固件适用的产品标识M2字节的数字,配置必须是10进制,默认是65535。如果不为默认值并且和当前product的低字节不匹配或者完全不匹配则阻止升级[Firmware1]
ProductID=65535
BoardID固件适用的单板标识M2字节的数字,配置必须是10进制,默认是65535。如果不为默认值并且和当前product的低字节不匹配或者完全不匹配则阻止升级[Firmware1]
BoardID=65535
Model固件适用的硬盘型号列表O字符串,用英文逗号(,)分隔的多个硬盘型号元素,每个元素是具体的硬盘型号[Firmware1]
Model=XXX,YYY,ZZZ
ComponentID固件适用的固件类型标识M1字节的数字,配置必须是10进制,通配是255。根据 ComponentID 和 ComponentIDEx 共同确认一个具体的固件类型。具体参考《IPMI接口说明》附录《固件ID管理》[Firmware1]
ComponentID=0
IPMI接口说明
ComponentIDEx固件适用的固件扩展标识O4字节的数字,配置必须是10进制,通配是4,294,967,295(0xFFFFFFFF)。根据 ComponentID 和 ComponentIDEx 共同确认一个具体的固件类型。如果 ComponentIDEx 是通配则仅由 ComponentID 确认具体的固件类型。具体参考《IPMI接口说明》附录《固件ID管理》[Firmware1]
ComponentIDEx=0
IPMI接口说明
Uid固件适用的UIDO24字节的字符串,由 Vendor(8) + Type(2) + ComponentID(14) 组成。仅天池机型固件使用
UIDDPU固件的UIDO仅DPU使用
ProductUIDList固件适用的产品UID列表O字符串,用英文逗号(,)分隔的多个 ProductUID 元素,每个元素是4字节的16进制数字,默认为空。如果产品 Product 配置中 ProductVendorID 不为 0xFFFFFFFF 则联合 ProductUniqueID 判定固件的匹配;否则单独采用ProductUniqueID 判定固件的匹配,不匹配则阻止升级。和下文中的 BoardIDList 作用同样,优先判定 ProductUIDList[Firmware1]
ProductUIDList=0xXXXXXXXX,0xXXXXXXXX,...
BoardIDList固件适用的单板UID列表O字符串,用英文逗号(,)分隔的多个 BoardID 元素,每个元素是2字节的数字,配置为10进制。如果上文中 BoardID 配置不为 65535 则优先匹配FRU0的 BoardId,不匹配则阻止升级。然后遍历当前 BoardIDList,如果元素不为65535 则匹配FRU0的 BoardId,不匹配则阻止升级[Firmware1]
BoardIDList=XXX,XXX
Version当前固件包此Firmware的内部版本号O按照各个不同的固件的版本规范进行定义。比如:BMC固件内部采用4段式版本号[Firmware1]
Version=X.XX.XX.XX
2026/1/8新增,用于版本一致则跳过升级的特性
SubComponentNum当前固件下对应的Firmware适用的子固件O仅openUBMC升级使用,compute和bios使用
CPLDChipNummbers多供应商模式下的CPLD芯片数量O仅cpld升级使用,和MultipleSuppliersMode配套使用
ColdValidList固件适用的冷升级片选标识O仅cpld升级使用
HotValidList固件适用的热升级片选标识O仅cpld升级使用
MultipleSuppliersMode多供应商模式O仅cpld升级使用
UpdateLinkCPLD升级的链路O仅cpld升级使用
UpdateFileTypeCPLD升级的格式O仅cpld升级使用

Custom 自定义域

可选域,对于固件的自定义描述,如果固件不涉及自定义可不写。

字段名称说明必选(M/O)约束样例
VersionXXX自定义对外版本号,其中 XXX 是具体的客户标识,不同的客户可以有多个1、Version之后的描述产品包构建时根据不同的客户动态写入,必须和定制化客户保持一致
2、该属性如果没有则认为不需要自定义对外版本号,默认采用BMC的内部版本号,取自Basic域的Version属性
[Custom]
VersionCustomerA=X.X.X
VersionCustomerB=X.XX

BMC固件升级update.cfg示例

升级时默认从Firmware1开始读取除update.cfg文件之外的固件相关信息

ini
[Basic]
Version=X.XX.XX.XX
Revision=31

[Firmware]
FileNum=2

[Firmware0]
ProductID=0 # 天池机型的productId为0
ComponentID=0
BoardID=255
ProductUIDList=0xXXXXXXXX,0xXXXXXXXX

[Firmware1]
ProductID=0
ComponentID=25
BoardID=255
ProductUIDList=0xXXXXXXXX,0xXXXXXXXX

[Custom]
VersionCustomerA=X.XX.XX
VersionCustomerB=X.XX.XXXXXXXX