服务器基本输入输出系统和基板管理控制器之间红鱼接口的设计实现
2022-05-17汪涛
汪 涛
(江苏卓易信息科技股份有限公司 江苏 无锡 214206)
0 引言
红鱼是一种基于HTTPs 服务的服务器BMC 管理标准,已经逐步成为业界新的服务器BMC 标准[1]。在红鱼标准推出之前,IPMI 是受到广泛支持的行业标准,但IPMI 已有近20 年历史,最后的更新还是在2004 年,已无法满足当今BMC 对功能和安全的需求[2]。在传统的服务器上,BIOS 和BMC通常会通过KCS协议使用IPMI来实现通讯和数据传输,这种方式存在的问题是传输速度慢,并且没有一个统一的标准,导致每一家BMC/BIOS 供应商都定义了自己的格式。
本设计采用USB 作为传输通道,可极大提高传输速度,另外USB 支持大容量存储(MASS STORAGE)方式,可以让BIOS/BMC 以直接读写文件的方式使用USB,而采用标准红鱼JSON 格式作为BIOS 和BMC 交互的格式,BMC 的Web 界面可以对BIOS 的所有配置参数做修改,而且可以直接支持红鱼规范的BIOS 接口。
1 BIOS端设计
1.1 UEFI BIOS 介绍
当前主流服务器BIOS 一般采用统一的可扩展固件接口(Unified Extensible Firmware Interface,UEFI)。UEFI是用于取代和扩展旧的BIOS 固件的,它和BIOS 的主要区别之一是传统BIOS 大多使用汇编写成,而UEFI 的代码99%以上是C 语言,并且充分利用新的模块化的思想,采用了DRIVER/PROTOCOL 的新方式,UEFI 系统从加电到关机一般分为7 个阶段[3]:SEC(安全验证)->PEI(EFI 前期初始化)->DXE(驱动执行环境)->BDS(启动设备选择)->TSL(操作系统加载前期)->RT(Run Time)->AL(系统灾难恢复期)。
本设计实现主要在BIOS 的DXE 和BDS 阶段[4]。
1.2 实现步骤
为了实现BIOS 和BMC 之间红鱼接口,需要BIOS 和BMC 两者配合,BIOS 在系统启动阶段需要实现的操作可大致分为下面5 个步骤。
(1)在BIOS 启动进入DXE 阶段后,BIOS 首先发送IPMI 命令OPEN_USB_KEY 给BMC,通知BMC 准备USB KEY,发送完这个命令之后,BIOS 并不等待BMC 返回的结果,而是继续执行正常启动过程中的任务。
(2)当BIOS 进入BDS 阶段时,BIOS 发送IPMI 命令QUERY_USB_KEY 给BMC,查询USB KEY 是否已经准备就绪,如果USB KEY 已经准备就绪,BIOS 将执行下一步操作;否则BIOS 会等待100ms 后继续尝试查询USB KEY,重复此动作50 次之后(即总的等待时间是5S,主要是大部分系统对启动时间有要求),如果USB KEY 还是没有准备就绪,BIOS 将进行错误处理,然后执行其他启动任务。
(3)BIOS 在获知USB KET 已经准备就绪,开始连接USB 设备,连接成功则进行下一步操作。
(4)BIOS 读 取BiosSettings.json 以 及Bios AttributeRegistry.json 文件[5],将配置生效。
(5)如果用户没有进入BIOS 配置界面进行配置修改,BIOS 把从BMC 获取的配置生效后会立即重启BIOS,否则BIOS 把新的BiosSettings.json 以及BiosAttributeRegistry.json 写回USB 磁盘,发送IPMI命令CLOSE_USB_KEY 给BMC,最后BIOS 重启自身。
上述操作流程见图1。
上面步骤中第4 步中BIOS 获取到配置文件之后需要判断是否有需要更新的数据,如果有待更新配置,需要判断执行相应的操作,包括:是否需要更新密码,是否需要恢复默认配置,是否需要重置BIOS,是否上报BIOS配置等,具体流程见图2。
2 BMC端设计
2.1 IPMI 命令操作说明
在服务器运行过程中,BMC 在服务器交流电(Alternating Current,AC)上电时就开始启动运行,而BIOS 需要在直流电(Direct Current,DC)上电时(通常是用户按下启动按钮或者远程发送启动命令给服务器)才会启动,BMC 端无法主动发送IPMI 命令,但需要实现响应BIOS 的3 个IPMI 命令。
2.1.1 OPEN_USB_KEY 命令
BMC 在收到OPEN_USB_KEY 之后需要实现下列操作。
(1)创建RAM 下的磁盘文件,并格式化成FAT16 格式,由于RAM 磁盘实际需要占用BMC 的内存,所以不宜设置太大,通常设置5 ~10 M,本方案基于Yocto[6]和OpenBMC[7]实现,默认BMC 文件系统使用的BusyBox[8]中的mkfs.fat 只支持生成FAT32 格式,需要修改mkfs.fat源码以支持FAT16 格式[9]。
(2)利用USB Gadget ConfigFS 挂载磁盘文件,类似插入了一个U 盘[10]。
(3)从配置目录/var/lib/bios-settings-json/下面拷入BIOS 当前的JSON 配置文件。
2.1.2 QUERY_USB_KEY 命令
BMC 在收到QUERY_USB_KEY 之后需要判断USB_KEY 是否已经准备好,把结果返回给BIOS。
2.1.3 CLOSE_USB_KEY 命令
BMC 在收到CLOSE_USB_KEY 之后会做如下动作。
(1)把USB 磁盘上的BIOS 配置文件更新到/var/lib/bios-settings-json/目录下。
(2)卸载磁盘文件。BMC 端可以通过一个shell 脚本实现对usb key 的挂载以及文件的复制移动[11]。
2.2 IPMI 命令表
BIOS 和BMC 通讯定义的OEM IPMI 命令格式见表1,BIOS 每次启动的时候都会发送这个OEM 命令给BMC,这个命令被限制为仅供KCS 接口通信。
表1 Redfish OEM IPMI 命令
BMC 提供Web页面可以让用户修改BIOS 配置, 进入BIOS 的配置页面,BMC Web 后端会将BiosAttributeRegistry.json 和BiosSettings.json 合并成一个JSON 字符串,传递给前端,前端根据JSON 字符串动态生成界面,并可以提供SetBiosCurrentSettings.cgi 提供修改功能,修改界面见图3。
其中BiosSettings.json 中定义了某个BIOS 属性的当前值,譬如以BIOS启动模式举例,即“BootMode”:“Uefi”。
当前的启动模式为UEFI 模式, 与之对应的BiosAttributeRegistry.json 中定义了BootMode 的属性和可能的取值等,BIOS 属性举例如下。
从以上可以看出,BootMode 是枚举变量,有两个属性,分别是Uefi 和Legacy,即表示BIOS 启动模式可以有UEFI或者兼容传统BIOS(Legacy)两种方式。
3 红鱼接口
红鱼基于HTTPs服务,利用RESTful接口实现设备管理。每个HTTPs 操作都是以UTF-8 编码的JSON 形式,提交或返回一个资源。就像Web 应用程序向浏览器返回HTML 一样,RESTful 接口会通过同样的传输机制(HTTPs),以JSON 的形式向客户端返回数据。红鱼接口支持的操作见表2。
表2 红鱼接口支持的操作
3.1 BiosAttributeRegistry
通过访问https://{BMC 的IP 地址}/redfish/v1/Registries/BiosAttributeRegistry 地址可以获取BiosAttributeRegistry.json 里面的相关资源。
3.2 BiosCurrentSetting
通过访问https://{BMC 的IP 地址}/redfish/v1/Systems/1/Bios/Settings 地址可以获取BiosCurrentSetting.json 文件里的相关资源。
4 结语
采用本设计方案后,通过BMC Web 或者红鱼接口可基于BIOS 属性来显示或修改BIOS 设置并验证用户输入。远程客户端也可以通过网络访问服务器红鱼服务,直接获取红鱼JSON 文件。