功能简介
bios组件主要是与带内交互模块,关键功能包含以下四个部分:
(1)配置:支持bios配置导入导出,支持启动项、启动模式设置,无感升级策略重配等
(2)证书:支持bios启动证书,bios安全启动证书,bios吊销证书管理
(3)升级:支持bios普通升级,无感升级,teeos升级(待实现)
(4)PFR:支持bios自愈功能
目录结构
├── src
│ ├── lualib-src
│ │ ├── CMakeLists.txt
│ │ └── mtd_api.c # mtd驱动
│ ├── lualib
│ │ ├── bios_app.lua # bios_app文件
│ │ ├── domain
│ │ │ ├── bios_firmware
│ │ │ │ ├── defs.lua # 固件定义信息文件
│ │ │ │ ├── gold # bios固件
│ │ │ │ └── package # bios升级包
│ │ │ ├── mapping
│ │ │ │ ├── component_info.lua # 无感升级文件基类
│ │ │ │ ├── component_manager.lua # 无感升级文件管理器
│ │ │ │ ├── component_version.lua # 无感升级版本文件
│ │ │ │ ├── policy_config_registery.lua # 策略重配registery文件
│ │ │ │ └── policy_config_value.lua # 策略重配当前值文件
│ │ │ ├── policy_config
│ │ │ │ ├── policy_config_transfer.lua # 策略重配转换
│ │ │ │ ├── policy_ipmi_format.lua # 策略重配ipmi命令格式转换
│ │ │ │ └── policy_registery.lua # 策略重配registery转换文件
│ │ │ └── transport
│ │ │ ├── component_communicate.lua # imu交互
│ │ │ ├── component_effective.lua # 无感升级生效
│ │ │ ├── component_info_query.lua # 查询无感升级文件
│ │ │ ├── component_process_query.lua # 查询无感升级进度
│ │ │ ├── component_send_confirmed.lua # 确认无感升级升结果
│ │ │ ├── component_upgrade.lua # 无感升级
│ │ │ └── imu_communicate.lua # imu交互
│ │ ├── factory
│ │ │ └── bios_factory.lua # 工厂类
│ │ ├── handler
│ │ │ ├── bios_prop_handler.lua # 属性配置处理器
│ │ │ ├── config_handler.lua # 配置处理器
│ │ │ ├── config_util.lua # 配置处理器
│ │ │ ├── effective_time_handler.lua # 启动项生效次数处理器
│ │ │ ├── error_engineer.lua # 错误引擎
│ │ │ ├── export_import_engine.lua # 导入导出处理器
│ │ │ ├── mode_handler.lua # 启动模式处理器
│ │ │ └── start_option_handler.lua # 启动项处理器
│ │ ├── infrastructure
│ │ │ ├── chain.lua # 责任链
│ │ │ ├── crc32.lua # crc32
│ │ │ ├── file_util.lua # 文件工具类
│ │ │ ├── firmware_upgrade.lua # 升级类
│ │ │ ├── fructl.lua # 上下电类
│ │ │ ├── imu.lua # imu交互类
│ │ │ ├── m3_verify.lua # m3校验类
│ │ │ ├── power_lock.lua # 上下电锁
│ │ │ ├── serialization_util.lua # 系列化列
│ │ │ └── spi_flash.lua # spi工具
│ │ ├── interface
│ │ │ ├── mdb
│ │ │ │ └── firmware.lua # 升级资源协作接口
│ │ │ └── signal.lua # 信号类
│ │ ├── pojo # 实体类
│ │ ├── service # 服务类
│ │ └── util # 工具类
│ └── service
│ └── main.lua # app入口关键特性
Bios升级
介绍
Bios升级模式分为装备升级、非装备升级、无感升级。对于装备升级则会执行强制上下电,而非装备包不会。升级bios实质是将升级包的内容刷新到flash里面,对于无感升级底层是ipmb通道、而非无感升级底层是spi链路。
升级模式区分
| 升级模式 | 场景 |
|---|---|
| 装备模式 | 打包manufacture文件夹(装备包) |
| 普通升级模式 | 未打包manufacture文件夹(装备包) |
| 无感升级模式 | 未打包manufacture文件夹(装备包)redfish下发无感升级(url:/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate,且包含BiosActivatedScope参数) |
升级动作区分
| 升级模式 | 升级动作 |
|---|---|
| 装备升级 | 强制下电os,刷bios flash,上电os |
| 非装备升级,os上电 | 缓存bios升级包,待下电刷flash(生效) |
| 非装备升级,os下电 | 刷bios flash |
| 无感升级 | 通过ipmb通道将固件传到imu,实现在线升级 |
升级包区分
| 升级包类型 | 升级包的update.cfg |
|---|---|
| 补丁包(无感升级的包) | 版本包含HPxxxx |
| 普通包 | 版本不包含HPxxxx |
升级场景匹配
| 升级模式 | 升级包 | 是否不支持 |
|---|---|---|
| 装备升级 | 补丁包 | 不支持 |
| 装备升级 | 普通包 | 支持 |
| 非装备升级 | 补丁包 | 不支持 |
| 非装备升级 | 普通包 | 支持 |
| 无感升级 | 补丁包 | 支持 |
| 无感升级 | 普通包 | 不支持 |
业务流程
升级生效流程如下:
bios升级流程,如下图所示,
- 首先判断是装备升级,然后判断是否补丁包,如果是补丁包则升级失败,否则就执行强制下电,通过spi链路将升级包写入flash,最后执行上电。
- 如果是非装备升级,则判断是无感升级,并且是否满足升级包为补丁包、os启动完成,如果满足则通过ipmb通道将升级包内容传到flash;否则升级失败。
- 如果是普通升级,判断当前os上下电状态,os上电则执行缓存升级包,os下电则通过spi链路将升级包写入flash。
代码流程
bios升级流程分为prepare、process、finish阶段.
- prepare:此阶段主要解压升级包。
- process:此阶段主要是校验升级包、升级模式的合法性,以及将升级包通过spi或者ipmb通道传到flash中。
- finish:此阶段主要是做一些信息清理动作。
其中最关键的是upgrade_executor.lua中的一堆Executor,其是执行升级最关键的流程,Executor列表及作用如下:
| Executor名称 | Executor作用 |
|---|---|
| PackageCheckExecutor | 校验包合法性,如:冷升级不能升级补丁包、无感升级不能升级非补丁包、装备模式不能升级补丁包 |
| BackExecutor | 将升级包压缩成bios.tar.gz |
| Cache | 上电升级缓存升级包,待下电生效 |
| ForcePower | 强制上下电,装备模式使用 |
| LockPower | 上电锁,升级的时候需要锁住上下电,不允许上电 |
| SpiDriver | 加载spi驱动,通过spi可以将bin包内容刷入flash |
| DecompressFile | 将bios.tar.gz解压成bin包(bin包大小与flash大小一样,地址也一致) |
| ParserBin | 解析bin包,主要是header以及固件个数、固件大小、固件地址 |
| ComponentFilter | 无感升级的时候,过滤版本一致的固件,这部分固件不升级 |
| SelectChannel | 通道选择,无感升级(ipmb通道)、其他(spi链路) |
| UpgradeComponent | 升级固件 |
| WaitUpgradeFinish | 无感升级固件等待固件生效完成 |
例子
非无感升级
- os下电场景下升级bios,可从带内界面看到bios升级中
无感升级
- 查询无感升级固件 URI:/redfish/v1/UpdateService/FirmwareInventory/Bios【其中Hotfix表示可以无感升级的固件】
- 触发无感升级,且可从日志中看到升级成功的打印,以及版本发生变化
url:/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate
参数:
{
"ImageURI":"/tmp/biosimage_patch.hpm",
"BiosActivatedScope":["IMU","IMP","SCC"] --由上一步可查询
}Bios配置导入导出
介绍
除了在Bios setup界面进行Bios配置,还支持通过BMC下发Bios配置给bios,涉及到以下文件:
setting.json :用户的Bios配置数据
currentValue.json:当前生效的Bios配置
Registery.json:配置的标准文件(可以判断下发的配置是否正确)
result.json:Bios运行的记录文件
实现机制
接口层:主要是进行注册rpc接口,包括导入导出的接口。
服务层:主要是业务逻辑的代码。比如:file_service具有导出导入BIOS配置的能力;registry_service 具有处理registry.json文件的能力。
数据层:考虑到磁盘读写速度慢的问题,将磁盘数据加载到内存中,提高读写速度。registry_object是对registry.json文件的抽象;setting_object是对currentvalue.json、setting.json的抽象。
- 导入配置涉及2个json文件(registery.json配置标准文件、currentvalue.json当前生效配置),导入的时候首先会根据registery.json文件的Attribute判断导入的配置是否合法,如果不合法则返回报错;然后会根据registery.json的Dependency和currentvalue.json配置,判断当前导入的配置是否满足对应的依赖关系,如果满足则允许导入,否则导入失败。
对外接口
资源协作接口
Path:
/bmc/kepler/Systems/${SystemId}/Biosinterface:
bmc.kepler.Systems.Bios
| 方法 | 描述 |
|---|---|
| ChangePassword | 修改Bios密码 |
| ClearCmos | 清除Bios配置 |
| ExportBiosSetup | 导出Bios配置 |
| GetCurrentValueSetting | 获取配置值 |
| ImportBiosSetup | 导入Bios配置 |
| ResetSetupConfig | 清除Bios配置以及待生效配置 |
| SetBiosLogEnabled | 设置Bios全打印开关 |
- Path:
/bmc/kepler/Systems/${SystemId}/SecureBootOptions - interface:
bmc.kepler.Systems.SecureBootOptions
| 方法 | 描述 |
|---|---|
| GetCertificate | 获取安全启动证书 |
| ImportCertificate | 导入安全启动证书 |
| ResetCertificate | 重置安全启动证书 |
Path:
/bmc/kepler/Systems/${SystemId}/BootOptionsinterface:
bmc.kepler.Systems.BootOptions
| 方法 | 描述 |
|---|---|
| GetCertificate | 获取Bios Http证书 |
| ImportCertificate | 导入Bios Http证书 |
| ImportCrl | 导入Bios吊销证书 |
| ResetCertificate | 重置Bios Http证书 |
| ResetCrl | 重置Bios吊销证书 |
| SetBootMode | 设置启动模式 |
| SetBootOrder | 设置启动顺序 |
| SetStartOption | 设置启动项 |
| SetStartOptionFlag | 设置启动项生效次数 |
Path:
/bmc/kepler/Systems/${SystemId}/BiosUpgradeServiceinterface:
bmc.kepler.Systems.BiosUpgradeService
| 方法 | 描述 |
|---|---|
| ActivateFirmware | 固件生效 |
| ExportBiosFirmware | 导出bios固件信息 |
IPMI接口
| 命令 | 描述 |
|---|---|
| SetBootOption | 设置启动项 |
| GetBootOption | 获取启动项 |
| SetBridgeSystemInfo | 设置启动项(BridgeSystemInfo) |
| SetChannelInfo | 设置启动项(ChannelInfo) |
| SetDeviceSystemInfo | 设置启动项(DeviceSystemInfo) |
| SetOperatingSystemName | 设置启动项(OperatingSystemNam) |
| SetPrimaryOperatingSystemName | 设置启动项(PrimaryOperatingSystemName) |
| SetProgressSystemInfo | 设置启动项(ProgressSystemInfo) |
| SetSystemName | 设置启动项(SystemName) |
| WriteOcpCardBdfToBmc | 设置OCP卡的BDF |
| WritePcieCardBdfToBmc | 设置PCIE卡的BDF |
| WritePcieDiskBdfToBmc | 设置硬盘的BDF |
| GetBridgeSystemInfo | 获取启动项(BridgeSystemInfo) |
| GetChannelInfo | 获取启动项(ChannelInfo) |
| GetDeviceSystemInfo | 获取启动项(DeviceSystemInfo) |
| GetOperatingSystemName | 获取启动项(OperatingSystemName) |
| GetPrimaryOperatingSystemName | 获取启动项(PrimaryOperatingSystemName) |
| GetProgressSystemInfo | 获取启动项(ProgressSystemInfo) |
| GetSystemFirmwareVersion | 获取启动项(SystemFirmwareVersion) |
| GetSystemName | 获取启动项(SystemName) |
| GetBiosGoldValid | 获取固件备份状态 |
| AddBiosLogEntry | 设置bios日志信息 |
| GetBiosBootInfo | 获取bios启动参数 |
| GetFileChanged | 获取bios配置文件修改状态 |
| GetSmBiosInfo | 获取smbios信息 |
| ReadFileFromBmc | 从bmc读取配置文件 |
| SetBiosBootInfo | 设置bios启动参数 |
| SetBiosVersion | 设置bios版本 |
| SetCertificateAssertion | 设置bios证书过期告警 |
| SetFileChanged | 设置bios配置文件修改状态 |
| SetSmBiosInfo | 设置smbios信息 |
| UpdateBiosPassword | 设置bios密码 |
| UpdateBiosStatus | 设置bios启动状态 |
| UpdatePostStatus | 设置bios完成启动状态 |
| WriteFileToBmc | 上报bios配置文件 |
| WriteSmbiosData | 上报smbios配置文件 |
配置介绍
不涉及