bios
更新时间:2024/12/19
在Gitcode上查看源码

功能简介

bios组件主要是与带内交互模块,关键功能包含以下四个部分:

(1)配置:支持bios配置导入导出,支持启动项、启动模式设置,无感升级策略重配等

(2)证书:支持bios启动证书,bios安全启动证书,bios吊销证书管理

(3)升级:支持bios普通升级,无感升级,teeos升级(待实现)

(4)PFR:支持bios自愈功能

目录结构

shell
├── src
│   ├── luaclib
│   │   ├── 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}/Bios

  • interface: 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}/BootOptions

  • interface: 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}/BiosUpgradeService

  • interface: 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配置文件

配置介绍

不涉及