4. BMC固件基础与Redfish API入门

BMC(Baseboard Management Controller,基板管理控制器)是服务器主板上独立于主机CPU和操作系统的管理子系统。即使主机处于关机、蓝屏或系统未安装状态,只要服务器接入待机电源,BMC就能独立运行,提供远程开关机、传感器监控、日志查看、固件更新和虚拟介质挂载等带外管理能力。Supermicro服务器上的BMC通常以ASPEED AST2500/AST2600等管理芯片为核心,运行嵌入式Linux系统,并对外暴露IPMI与Redfish两套管理接口。

BMC架构与固件组成

从固件视角看,BMC并不是单一程序,而是由引导固件、嵌入式操作系统、管理服务、硬件监控与接口层共同组成的完整栈。理解这个分层结构,有助于判断固件升级时到底更新了哪一部分,以及为什么某些功能在升级后需要重启BMC才生效。

Supermicro BMC 固件分层架构与接口关系 主机侧(Host) CPU / 内存 / PCIe 设备 BIOS / UEFI 固件 操作系统与驱动 KCS / IPMI 系统接口 NC-SI / PCIe VDM BMC 侧(独立供电,带外运行) 接口层:IPMI 2.0(623/UDP) · Redfish(443/HTTPS) · Web UI · SNMP · KVM Redfish 基于 REST/JSON,IPMI 基于二进制 RMCP+ 消息 管理服务层 Redfish 服务(bmcweb) · IPMI 守护进程 · 传感器轮询 · SEL 日志 · 虚拟介质 · 固件更新引擎 账户与权限 · 会话管理 · 事件订阅(EventService) 嵌入式系统层 嵌入式 Linux 内核 · 只读根文件系统 · 配置分区(可写) 引导与硬件抽象层 U-Boot · AST2500/2600 驱动 · I2C/SMBus 传感器总线 · GPIO · 风扇与电源控制 管理芯片硬件:ASPEED AST2500 / AST2600 带内 通道

图中可以看到,主机侧通过KCS、NC-SI等通道与BMC通信,而BMC的接口层同时提供IPMI和Redfish。两者最终访问的是同一批底层资源——传感器、SEL日志、电源状态、固件版本,只是协议风格和表达能力不同。

IPMI与Redfish的对比

IPMI诞生于1998年,使用二进制消息和RMCP+协议,通过UDP 623端口通信。它的优点是成熟、兼容性广,几乎所有服务器都支持;缺点是数据结构固定、扩展困难、缺乏现代认证机制,且返回内容对自动化脚本不够友好。Redfish由DMTF制定,基于HTTPS和JSON,使用REST风格资源模型,端口443,支持标准化的Schema、OData查询和事件订阅,更适合大规模自动化运维。

对比维度IPMI 2.0Redfish
传输协议RMCP+ / UDP 623HTTPS / TCP 443
数据格式二进制消息JSON
资源模型命令号 + 固定结构URI 资源树 + Schema
认证方式RAKP / 密码Basic Auth / Session Token
扩展性弱,依赖厂商扩展强,OEM 属性可扩展
自动化友好度需 ipmitool 等工具解析curl / Postman 直接调用

在Supermicro服务器上,两者可以并存。日常快速操作如开关机、读传感器,ipmitool仍然方便;而批量查询固件版本、导出清单、集成到运维平台时,Redfish更合适。

通过Redfish查询固件清单

Redfish的资源树从/redfish/v1开始。查询固件清单的关键路径是/redfish/v1/UpdateService/FirmwareInventory,它返回一个集合,列出BMC、BIOS、CPLD、电源固件等成员。每个成员再通过其@odata.id指向具体资源,包含Version、Name、Updateable等属性。

下面用curl演示一次完整查询。假设BMC地址为192.168.1.100,账号ADMIN,密码PASSWORD(示例参数,实际请替换)。

# 1. 查询固件清单集合
curl -k -u ADMIN:PASSWORD \
  https://192.168.1.100/redfish/v1/UpdateService/FirmwareInventory

# 2. 返回示例(节选)
{
  "Members": [
    {"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/BMC"},
    {"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/BIOS"},
    {"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/CPLD"}
  ],
  "Members@odata.count": 3
}

# 3. 查询单个固件版本
curl -k -u ADMIN:PASSWORD \
  https://192.168.1.100/redfish/v1/UpdateService/FirmwareInventory/BMC

# 4. 返回示例(节选)
{
  "Name": "BMC Firmware",
  "Version": "01.73.12",
  "Updateable": true,
  "Status": {"Health": "OK", "State": "Enabled"}
}

判断结果时,重点看Version是否与预期版本一致,Updateable为true表示可通过Redfish执行更新,Status.Health为OK表示当前固件运行正常。如果集合为空或缺少BIOS条目,通常说明BMC固件版本较旧,或该机型未将BIOS纳入FirmwareInventory。

使用curl与Postman进行基本操作

curl适合脚本化和快速验证。除了查询,还可以用Redfish执行电源操作。例如查询系统电源状态:

curl -k -u ADMIN:PASSWORD \
  https://192.168.1.100/redfish/v1/Systems/1

# 返回中关注 PowerState 字段:On / Off

# 执行开机(POST 到 Actions)
curl -k -u ADMIN:PASSWORD -X POST \
  -H "Content-Type: application/json" \
  -d '{"ResetType":"On"}' \
  https://192.168.1.100/redfish/v1/Systems/1/Actions/ComputerSystem.Reset

Postman则更适合交互式探索。建议按以下方式组织:新建Collection命名为“Supermicro BMC”,在Collection级别设置Authorization为Basic Auth,填入账号密码;再设置Settings中关闭SSL certificate verification(实验环境自签名证书常见)。然后创建请求,方法GET,URL填https://192.168.1.100/redfish/v1/UpdateService/FirmwareInventory,发送后即可在Pretty视图查看JSON。把常用请求保存为示例,后续只需切换环境变量即可复用到其他服务器。

Redfish返回的JSON中,@odata.id是资源定位符,可以逐级拼接访问;@odata.type标明资源类型,便于脚本判断。遇到401先检查账号权限,遇到404检查URI大小写,Redfish路径区分大小写。
生产环境中不要长期使用-k跳过证书校验,也不要在脚本中明文硬编码密码。建议导入BMC证书或使用会话Token,并将凭据放入受保护的变量或密钥管理工具。