【已评审】新增服务器BIOS定制化配置导入导出项以及拓展Bios读文件的ipmi命令

背景

针对现有流程中厂商定制频繁(涉及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.文档中注明使用场景和范围
– 已闭环