背景
针对现有流程中厂商定制频繁(涉及DIMM、DRAM、NVMe、TPM、OS、Flash、SATA等,多为字符串修改且不影响功能)但需经华为BIOS重新发版导致的周期长、成本高痛点,客户诉求BMC侧新增BIOS兼容性配置文件导入与传递接口。该功能旨在让客户直接上传定制化配置,绕过冗长的BIOS版本迭代流程,从而缩短兼容性验证周期,降低研发与交付成本,快速响应市场需求。
关联ISSUE
[需求]: 【LTS】支持服务器BIOS定制化配置导入 - openUBMC/bios - AtomGit
整体方案
1.用户通过配置导入接口将自定义配置文件上传到BMC,BMC将其持久化保存。
2.服务器BIOS启动后,通过ipmi命令主动从BMC读取该文件,用于配置启动行为。
3.服务器BIOS读取完毕后,调用已有的接口上报导入结果的操作日志。
以redfish接口配置导入为例:
兼容性分析:
配置导入:
当前profile_schema配置bios组件的additionalProperties为true,在新版本导出的配置,老版本导入不会使配置导入导出报错,相关代码如下:
profile_schema/schema/bios.json-代码预览-profile_schema:基于 JSON Schema 的配置数据模型管理项目 - AtomGit
IPMI读文件:
老BIOS+新BMC:
该命令提供给BIOS读取,老版本BIOS不会下发该ipmi命令,无功能影响。
老BMC+新BIOS:
老版本BMC收到暂未支持的file selector后响应特定错误码,新版本BIOS检测到该错误码后跳过兼容性配置导入流程,不影响其他功能。
备件更换:
1.更换BMC插卡,通过配置导入导出一键还原
2.更换基础板,BMC会将导入的配置持久化,BIOS重启后重新发送ipmi命令读取并恢复配置
评审点1
新增配置导入导出项支持服务器BIOS定制化配置
详细描述
| 配置项名称 | 配置项类别 | 配置项 | 归属组件 | 取值类型 | 取值说明 | 导入导出类型 | 说明 |
|---|---|---|---|---|---|---|---|
| 服务器BIOS定制化配置 | SystemBiosCustomSettings | 为json对象,与服务器BIOS约定 | bios | object | 详情如下 | ImportAndExport | 详情如下 |
JSON 整体结构
{
"JEDEC": {
"Version": "<版本号>",
"List": [ { "<字段1>": "<值>", "<字段2>": "<值>" }, ... ]
},
"PCISIG": {
"Version": "<版本号>",
"List": [ { "<字段1>": "<值>", "<字段2>": "<值>" }, ... ]
},
"OS_BOOT": {
"Version": "<版本号>",
"List": [ { "<字段1>": "<值>", "<字段2>": "<值>" }, ... ]
}
}
JEDEC 类
| JSON 键 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
JEDEC.Version |
string | 是 | 最大长度 15 字符,不可为空 | 版本号,变化时触发 NVRAM 写入 |
JEDEC.List[].MfgId |
string | 是 | "0x" 前缀的十六进制字符串,范围 0x0000~0xFFFF |
内存厂商 ID |
JEDEC.List[].MfgName |
string | 是 | 非空,最大长度 16 字符 | 内存厂商名称 |
示例:
{
"JEDEC": {
"Version": "1.0.0",
"List": [
{ "MfgId": "0x1234", "MfgName": "AAA" },
{ "MfgId": "0x5678", "MfgName": "BBB" }
]
}
}
PCISIG 类
| JSON 键 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
PCISIG.Version |
string | 是 | 最大长度 15 字符,不可为空 | 版本号 |
PCISIG.List[].MfgId |
string | 是 | "0x" 前缀的十六进制字符串,范围 0x0000~0xFFFF |
PCI 厂商 ID |
PCISIG.List[].MfgName |
string | 是 | 非空,最大长度 11 字符 | PCI 厂商名称 |
示例:
{
"PCISIG": {
"Version": "2.0.0",
"List": [
{ "MfgId": "0x1234", "MfgName": "CCC" },
{ "MfgId": "0x5678", "MfgName": "DDD" }
]
}
}
OS_BOOT 类
| JSON 键 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
OS_BOOT.Version |
string | 是 | 最大长度 15 字符,不可为空 | 版本号 |
OS_BOOT.List[].BootFilePath |
string | 是 | 非空,最大长度 63 字符 | OS 启动文件路径 |
OS_BOOT.List[].BootDesc |
string | 是 | 非空,最大长度 63 字符 | OS 启动项描述 |
示例:
{
"OS_BOOT": {
"Version": "1.0.0",
"List": [
{ "BootFilePath": "\\AAA\\BBB\\Bootxxx.efi", "BootDesc": "xxx Shell" },
{ "BootFilePath": "\\CCC\\DDD\\Bootyyy.efi", "BootDesc": "yyy" }
]
}
}
评审点2
NetFn 0x30 cmd 0x92 subcmd 0x0a的BIOS从BMC读文件的IPMI拓展File Selector字段含义,新增0x30表示读取服务器BIOS定制化配置文件
详细描述
命令名称: Read File From BMC
命令说明: BIOS从BMC读取批量配置数据(BT超长帧)。
命令权限: ReadOnly
是否锁定之后可以访问: 是
是否有敏感数据: 否
命令样式:
● 请求:ipmitool raw 0x30 0x92 0xdb 0x07 0x00 0x0a 0x00 < file_selector > < operation > < offset > < lens >
● 响应:
命令请求参数:
| 字节顺序 | 域取值说明 |
|---|---|
| NetFn | 30h |
| Cmd | 92h |
| 1:3 | Manufacturer ID,LB Byte first。长度固定 3 个字节,例如,某厂家ID时 2011,对应十六进制为0x0007DB,则字节序为第1个字节为 DBh,第二个字节为 07h,第三个字节为 00h。 |
| 4 | SubCmd,固定为 0Ah |
| 5 | BIOS ID:预留给多host场景,单host场景固定填0 |
| 6 | File Selector |
| 00h-Display.ini | |
| 01h-Options.ini | |
| 2Ah-silkconfig.json | |
| 2Bh-new_secureboot.json | |
| 2Fh-电源信息查询,PsuInfo.json | |
| 30h-服务器bios定制化配置文件,bios_custom_settings.json======》》》》》(本次新增) | |
| other-Reserved | |
| 备注:File Selector分配表参见IPMI文档。 | |
| 7 | Operation: |
| 00h Read Prepare | |
| 01h Read Data | |
| 03h Read Finish | |
| (8:11) | Offset to Read,LSB First |
| 数据段相对于File开始位置的偏移。 | |
| 说明:本字段可选,仅当Operation为Read Data时需要提供本字段。 | |
| (12) | Read Length |
| 说明:本字段可选,仅当Operation为Read Data时需要提供本字段。 |
命令响应参数:
| 字节顺序 | 域取值说明 |
|---|---|
| 1 | Completion Code |
| 00h Command Completed Normally | |
| 80h Operation In Progress | |
| 当Prepare数据好没准备好时需要返回该错误码。 | |
| 此时发起端应该再次发起Prepare操作,直到返回00h完成码为止。 | |
| D5h Invalid Status | |
| 2:4 | Manufacturer ID,LB Byte first。长度固定 3 个字节,例如,某厂家ID时 2011,对应十六进制为0x0007DB,则字节序为第1个字节为 DBh,第二个字节为 07h,第三个字节为 00h。 |
| 5 | 7:1-Reserved |
| 1 - No More Data Flag | |
| 00h Still have data | |
| 01h No More Data | |
| 6 | 当Operation为Read Data时:File data最后1个字节为本段数据5:N-1的累加和。当Operation为Read Finish时:只有1个字节,返回本文件的累加和。约束条件为:总的IPMI命令长度不能超过254字节,也就是n不大于247(不包含checksum校验) |
命令示例:
样例1:读取服务器BIOS定制化配置文件内容
1、Read Prepare
● 请求:ipmitool raw 0x30 0x92 0xdb 0x07 0x00 0x0a 0x00 0x30 0x00
● 响应:db 07 00 00 07(data len) 00 00 00
2、Read Data
● 请求:ipmitool raw 0x30 0x92 0xdb 0x07 0x00 0x0a 0x00 0x30 0x01 0x00 0x00 0x00 0x00 0x07
● 响应:db 07 00 00
3、Read Finish
● 请求:ipmitool raw 0x30 0x92 0xdb 0x07 0x00 0x0a 0x00 0x30 0x03
● 响应:db 07 00 00
是否准备好AI预审
是
评审结论
1.同意新增BIOS定制化配置导入导出项SystemBiosCustomSettings,定制项详细信息见评审点1
2.同意IPMI命令BIOS从BMC读文件(NetFn 0x30 cmd 0x92 subcmd 0x0a )的File Selector字段新增取值:0x30-服务器BIOS定制化配置文件
遗留问题
1.SystemBiosCapabilityConfig命名修改,与CustomSettings对称
– 已闭环,命名修改为SystemBiosCustomSettings
2.ipmi新增的file selector文件名称需要修改
– 已闭环,命名修改为bios_custom_settings.json
3.文档中注明使用场景和范围
– 已闭环
