Redfish

Redfish 驱动参考:到 BMC 的 HTTPS 连接、资源路径加 JSON 指针的寻址、读取、PATCH 写入和类型。

以 Markdown 查看

Redfish 驱动读写 DMTF Redfish 管理服务,也就是服务器 BMC(基板管理控制器)、机箱和其他数据中心硬件为带外管理暴露出来的那套 REST API。这是一个普通的客户端模式驱动,由 Ganter Lab 连到仪器上,而传输永远是 HTTPS:加固过的 BMC 只暴露这一种,驱动也绝不会自己降级到普通 HTTP。

这样读到的典型的点有:电源状态、安全启动状态、机箱和管理器的健康状况、固件版本,以及热管理资源里的温度和风扇读数。

连接字段

字段 它是什么 格式 默认值
主机 Redfish 服务的主机名或 IP 地址。 主机名或 IP
端口 服务应答所在的端口。管理控制器通常在 443 上应答,发布在别处的服务在这里说明。 1 到 65535 443
用户名 用于 HTTP Basic 认证的那个 BMC 账户。留空会让请求以匿名身份发出,而受保护的服务会用一个授权错误来回答它。 自由文本
密码 和用户名配对的密码。在静态存储时按 Windows 用户保护,所以配置数据库从不保存明文值;在别的 Windows 账户下输入的密码会显示为读不出来,必须重新输入一次。 自由文本

连上时,驱动通过读服务根(/redfish/v1/)来核实这个服务。BMC 的 TLS 证书必须通过 Windows 正常的证书校验:一份自签名的 BMC 证书,必须先被本机信任,设备才连得上。连接失败时,事件页面和当天的日志文件会说明原因,并把底层错误附在后面,这样密码被驳回和证书不被信任才分得开。

轮询间隔可以配置:设备的默认值(1000 毫秒)适用于每一个没有自己另作规定的点位。

点位寻址

Redfish 的点位靠一条资源路径,加上一个可选的、指向那个资源返回的文档里的 JSON 指针来寻址:

字段 作用 取值 默认值
资源路径 要 GET 的那个 Redfish 资源相对服务根的路径,例如 redfish/v1/Chassis/1/Thermal 自由文本(必填)
JSON 指针(留空 = 整份文档) 一个 RFC 6901 指针,选中返回的 JSON 里的某一个字段,例如 /Temperatures/0/ReadingCelsius。数组元素按下标寻址;字段名里的 /~1 转义,~~0 转义。开头少了 / 会替你补上。留空则把整份文档作为文本返回。 JSON 指针或留空 留空

拼好的地址的几个例子(作为总线来源预览以只读方式显示):

  • redfish/v1/Systems/1#/PowerState:系统的电源状态,一个字符串。
  • redfish/v1/Chassis/1/Thermal#/Temperatures/0/ReadingCelsius:第一个热传感器,一个数字。
  • redfish/v1/Systems/1/SecureBoot#/SecureBootEnable:安全启动,一个布尔量。

读取时,驱动 GET 这个资源、解析 JSON、顺着指针走下去,再把结果转换成点位声明的数据类型。一个在文档里什么都没点到的指针,以及一个文档里存的是 JSON null 的字段,两者都读作没有值:点位转为质量不可用,由它的读取失败策略决定呈现什么,而不是让 null 这个词作为一次好的读数进来。不是 JSON 的响应会被直接按声明的类型解析。

写入

读写方式可写的点位会对被寻址的那个字段发 PATCH:驱动构造出覆盖指针那条路径的最小 JSON 文档(对 /Parent/Child 来说就是 {"Parent":{"Child":<value>}} 这个请求体),并把它发到那个资源上。由此有两条约束:

  • 写入必须有 JSON 指针。整份文档的点位(指针留空)没法被写:你还在编辑的时候,点位面板就拒绝这种组合,说这个字段缺了;而一次绕过去、真发到服务的尝试会失败,原因写进诊断日志。
  • 什么可写由 BMC 说了算;服务驳回的 PATCH 读作一次失败的写入。

和别处一样,你在点位写入框里打的是工程值,原始值上总线之前会先把这个点位的转换环节反过来走一遍,见 Connector 页面。

支持的数据类型

Boolean、Int32、Int64、Float、Double 和 String。请挑和那个 JSON 字段对得上的类型:像 SecureBootEnable 这样的标志用布尔,读数用数字,像 PowerStateHealth 这样的状态用字符串。

命令

一个 Redfish 服务会为它能被要求做的每一件事发布一个 action,各自挂在它所作用的那个资源下面的路径上。工作站不去猜它们,因为只有硬件自己的文档才说得清哪些存在:你在设备上声明它们,位置是它页面上的命令卡片。每一条命令带一个名称、一条 action 路径(redfish/v1/Systems/1/Actions/ComputerSystem.Reset),以及可选的、它所接收的那一个值的名字(ResetType);行上的“运行”把它发出去,服务答了什么会报告回来。一条命令同时也成为这台设备在本工作站自己的 OPC UA 地址空间里的一个方法,所以任何能调用方法的东西都能下发它。

值作为请求体发出去。已经是 JSON 的值原样发出;其余一切都按 {"<the name you declared>": "<the value>"} 发出,那正是 Redfish 自己的 reset action 所要求的形状。

设备发现

发现设备按钮读的是一个服务:把它的地址填进驱动页面的“扫描范围”卡片(https://bmc-host,或者厂商文档给的那个地址),扫描就走一遍那个服务的第一个 system、manager 和 chassis,把设备连同那些点一起提供出来,可以直接添加。扫描是走 HTTPS 且不带凭据去读的,因为它跑的时候那台该拿着凭据的设备还不存在,所以一个对每次请求都要求认证的服务什么都不会回答,那就改为手工添加。Redfish 自己的 SSDP 发现需要 UDP 组播,而进程内的驱动不做这个,所以广播找不到任何东西:扫描读的就是你给它的那个地址。