redfish

版本信息

项目内容
组件版本1.140.4
首发版本1.140.1
文档作者openUBMC 社区
最后更新2026-09-14
许可证Mulan PSL v2
组件类型application

1. 组件概述

1.1 组件简介

redfish 是 openUBMC 面向外部管理工具提供的北向 RESTful 管理接口,基于 DMTF Redfish 标准实现。组件以 Skynet 服务运行,入口为 src/service/main.lua,注册服务名为 redfish,通过 REDFISH_PORTAL_LISTEN 配置监听地址,默认监听 0.0.0.0:8080portal_agent 负责 HTTP 请求处理、鉴权、路由分发、事件订阅、任务服务和 TelemetryService 管理。

1.2 解决什么问题

  • 提供标准化、跨厂商一致的服务器管理接口,降低外部工具适配成本。
  • 通过事件订阅实现主动告警和资源变化通知,避免只依赖轮询。
  • 将固件升级等长时间操作转换为异步任务,便于查询进度和处理异常。
  • 通过 TelemetryService 提供指标定义、采集、聚合和报告能力。
  • 支持产品定制插件,在不修改核心代码的情况下扩展请求、响应和事件行为。

1.3 核心功能

  • Redfish API 路由分发:接收 HTTP/HTTPS 请求,支持 GETPATCHPOSTDELETE 等操作,并通过路由映射器访问资源协作接口。
  • 会话与认证管理:支持 Session-Based 认证和 Basic 认证,管理会话创建、查询和删除。
  • 事件订阅与上报:管理 EventService/Subscriptions,按事件类型、严重度、消息 ID 和资源条件向订阅目标发送事件。
  • 任务服务:管理异步任务及其子任务,支持任务状态、进度和 Task Monitor 查询。
  • 固件升级:提供固件升级入口,支持 BMC、BIOS、CPLD 等目标组件,并通过任务查询升级进度。
  • 遥测服务:管理 MetricDefinition、MetricReportDefinition、Trigger 和 MetricReport。
  • Schema 与动态资源:提供 SchemaStore、JSONSchemas、动态 Schema 和资源树静态资源访问能力。

1.4 关键术语表

术语解释
RedfishDMTF 定义的服务器管理 RESTful 接口标准。
Session客户端创建并携带 X-Auth-Token 使用的认证会话。
EventService管理事件订阅和事件投递的 Redfish 服务。
TaskService管理异步任务、子任务和任务进度的服务。
TelemetryService管理指标定义、采集触发器和指标报告的服务。
路由映射器将 Redfish URI 和 HTTP 方法映射到资源协作接口调用的组件。
MDS/资源协作接口openUBMC 的资源模型和 D-Bus 协作层。

1.5 外部交互边界图

2. API 使用说明与示例

2.1 Session 创建认证

功能说明

创建 Redfish 会话并返回 Session ID 和 X-Auth-Token,后续请求通过该 Token 访问受保护资源。

属性内容
接口名POST /redfish/v1/SessionService/Sessions
废弃状态正常可用
替代接口

参数说明

参数名方向类型必选描述取值范围
UserName输入String登录用户名最多 64 字符
Password输入String登录密码最多 64 字符

返回值与异常

返回值含义触发条件处理建议
201会话创建成功用户名和密码校验通过从响应头和响应体获取 X-Auth-Token 与 Session Location。
400参数无效请求体缺少必选字段或字段类型错误检查 JSON 请求体。
401认证失败用户名或密码错误,或账号被锁定检查凭据、账号状态和认证策略。
500内部错误会话服务或数据库异常收集 redfish 和安全日志进一步定位。

应用场景

管理客户端首次连接 BMC 时创建会话,后续请求携带 Token 访问资源;会话结束后可删除对应 Session。

限制条件

  • Session 有生命周期限制,超时后需要重新创建。
  • 并发 Session 数量受平台配置限制。
  • 建议通过 HTTPS 访问,避免凭据和 Token 明文传输。

调试示例

bash
# 创建会话,保存响应头和响应体
curl -k -i -X POST https://BMC_IP/redfish/v1/SessionService/Sessions \
  -H "Content-Type: application/json" \
  -d '{"UserName":"admin","Password":"<password>"}'

# 使用响应中的 X-Auth-Token 访问受保护资源
curl -k -H "X-Auth-Token: <token>" \
  https://BMC_IP/redfish/v1/Systems

2.2 事件订阅创建

功能说明

客户端通过事件订阅将 BMC 产生的告警和资源变更事件推送到指定 HTTP/HTTPS 目标。订阅成功后,服务器返回 201 和订阅资源的 Location URI;后续可通过该 URI 查询或修改订阅。

属性内容
接口名POST /redfish/v1/EventService/Subscriptions
废弃状态正常可用
替代接口

参数说明

参数名方向类型必选描述
Destination输入String事件接收地址,支持 HTTP/HTTPS URL。
EventTypes输入Array订阅事件类型;未指定时默认包含 ResourceAddedResourceRemovedResourceUpdatedStatusChangeAlertMetricReport
Context输入String客户端上下文,服务端在事件消息中原样返回,最大 255 字符。
Protocol输入String投递协议,通常为 Redfish
HttpHeaders输入Object/String投递时附加的 HTTP 头,敏感内容由服务加密保存。
MessageIds输入Array按消息 ID 过滤事件。
OriginResources输入String/Array按事件来源资源过滤。
SendHeartbeat输入Boolean是否发送心跳事件。
HeartbeatIntervalMinutes输入Integer心跳周期;SendHeartbeat 为真时生效。
Severities输入Array按事件严重度过滤。
MetricReportDefinitions输入Array订阅的指标报告定义。
DeliveryRetryPolicy输入String投递失败后的重试策略。

返回值与异常

返回值含义触发条件处理建议
201订阅创建成功参数校验通过且订阅落库成功Location 获取订阅 URI。
400参数无效Destination、EventTypes 或过滤字段不合法按响应体 Message 修正请求。
401认证失败Token 无效或权限不足重新创建会话并确认权限。
409订阅冲突同一目标或参数与已有订阅冲突查询已有订阅后调整配置。
500内部错误数据库或内部服务异常收集 redfish、event 和相关组件日志。

应用场景

用于网管平台、运维平台或事件接收服务订阅 BMC 告警、资源状态变化和 Telemetry 指标报告。

限制条件

  • 服务器不保留订阅创建前的历史事件。
  • 事件投递依赖目标 URL 网络可达;HTTP 目标可能受到平台安全策略限制。
  • 订阅字段、数量、重试策略和心跳周期受平台配置和插件策略约束。

调试示例

bash
curl -k -X POST https://BMC_IP/redfish/v1/EventService/Subscriptions \
  -H "X-Auth-Token: <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "Destination": "https://listener.example.com/redfish-events",
    "EventTypes": ["Alert", "ResourceUpdated"],
    "Context": "ops-monitor",
    "SendHeartbeat": true,
    "HeartbeatIntervalMinutes": 5,
    "DeliveryRetryPolicy": "RetryForever"
  }'

2.3 固件升级

功能说明

通过 UpdateService 接口提交固件升级任务,任务异步执行,客户端可通过返回的 Task URI 或 Task Monitor 查询进度。实际支持的目标组件和文件格式以当前平台的升级映射配置为准。

属性内容
接口名POST /redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate
替代接口启用 multipart 更新时,可使用 /redfish/v1/UpdateService/update-multipart

参数说明

参数名方向类型必选描述取值范围
ImageURI输入String固件文件地址指向 BIN/HPM 等升级文件的 HTTPS URL
TransferProtocol输入String传输协议通常为 HTTPS
Username输入String下载固件的认证用户名最多 64 字符
Password输入String下载固件的认证密码最多 64 字符
Targets输入Array升级目标资源FirmwareInventory 资源路径数组

返回值与异常

返回值含义触发条件处理建议
202升级任务已接受任务创建成功保存 Location 中的 Task URI 并轮询任务状态。
400参数无效ImageURI、Targets 或升级参数错误检查请求体、文件格式和目标路径。
401认证失败Token 无效或权限不足确认用户具备固件升级权限。
409升级冲突系统锁定、已有升级任务或参数冲突检查系统状态和升级任务队列。
500内部错误文件处理、任务创建或后端升级异常收集 redfish、UpdateService 和任务日志。

应用场景

用于 BMC、BIOS、CPLD 等组件的固件升级。升级过程中可能触发 BMC 重启,应在维护窗口执行。

限制条件

  • 升级任务为异步执行,需要轮询 Task 状态。
  • 部分升级需要在设备下电或重启后生效。
  • 升级文件大小、格式、目标组件和路径权限由当前平台策略限制。

调试示例

bash
curl -k -X POST \
  https://BMC_IP/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate \
  -H "X-Auth-Token: <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "ImageURI": "https://firmware.example.com/image.hpm",
    "TransferProtocol": "HTTPS",
    "Targets": ["/redfish/v1/UpdateService/FirmwareInventory/ActiveBMC"]
  }'

# 根据响应 Location 查询任务
curl -k -H "X-Auth-Token: <token>" \
  https://BMC_IP/redfish/v1/TaskService/Tasks/<task_id>

3. 组件扩展案例

3.1 扩展能力概述

组件支持产品和客户定制扩展,包括请求预处理、响应后处理、URI 定制、事件订阅策略和事件编解码。定制代码以插件或配置形式加载,不修改核心代码。

3.2 扩展点说明

扩展点位置作用触发时机
custom_request_response.plugins.redfish.custom_request_response请求预处理、响应后处理HTTP 请求处理前后
redfish_subscription_pluginsrc/plugins/redfish_subscription_plugin.lua事件订阅开关、默认重试策略和状态控制订阅创建、恢复或状态变更时
redfish_report_event.apps.redfish_report_event事件编解码定制事件上报和解析时
静态资源与 Schemainterface_config/static_resource/redfish/v1定制 Redfish Schema 和静态资源服务启动或资源加载时

3.3 二次开发指导

  1. 按产品定制目录约定实现 custom_request_responseredfish_subscription_plugin,不要直接修改核心 controller。
  2. 定制函数必须位于组件白名单中,并在测试环境验证请求、响应和异常路径。
  3. 事件编码定制应保持 Redfish Schema 兼容,确认 @odata.idEventTypeMessageId 等字段完整。
  4. 定制配置变更后重启对应服务,检查插件加载日志,并回归会话、事件订阅和任务接口。

4. 日志说明

4.1 一键日志收集

组件注册 on_dump 回调,一键收集时会导出 redfish_event_log.json,内容包含事件 ID、SubscriptionId、时间和事件数据。事件日志按批处理并主动休眠,避免一键收集期间 CPU 占用过高。

同时按平台框架收集安全日志和操作日志:

文件路径内容说明
/var/log/security.log登录、认证失败、特权操作等安全事件。
/var/log/operation.log账户管理、配置变更、固件升级等用户操作。

4.2 关键日志信息

日志片段日志级别含义解读建议处理动作
Listen http portINFORedfish HTTP 监听端口已启动。缺失时检查监听配置和端口占用。
initialize in-process route mapper successfullyNOTICE进程内路由映射器初始化完成。失败时检查映射配置和依赖组件。
redfish dump is started / redfish dump is completedNOTICE一键日志导出开始或完成。未生成文件时检查 dump 路径写权限。
get subscribers(id=%s) failedERROR订阅目标查询失败。检查订阅数据库和参数 ID。
redfish multipart content type [%s] is invalidERROR固件升级请求不是合法 multipart/form-data。检查 Content-Type 和 boundary。
multipart update targets [%s] is invalidERROR固件升级 Targets 参数无效。核对 FirmwareInventory 资源路径。
post redfish event failed, err: %sINFO遥测或订阅事件投递失败。检查订阅目标网络、认证和事件体。
Open file failedERROR日志或事件导出文件打开失败。检查路径、权限和磁盘空间。

5. 问题定界指南

5.1 典型问题定界

现象描述是否为本组件问题判断依据关键证据收集方法
Redfish API 请求超时可能不是可能为网络、反向代理或 MDS 响应慢检查网络连通性、代理日志和 MDS 日志。
会话无故断开是或认证链路Session 服务异常、超时或认证策略变更检查安全日志、Session 状态和 Token 有效期。
事件未推送需分层判断订阅配置错误、EventService 未使能或目标网络不可达检查 Subscription 状态、Destination 可达性和 event 日志。
固件升级失败需分层判断文件格式、目标组件、权限或后端升级失败检查任务错误信息、升级文件、UpdateService 和任务日志。
Telemetry 报告缺失需分层判断Trigger 或 MetricReportDefinition 配置错误,指标源不可用检查遥测数据库、触发器状态和指标采集日志。

5.2 错误码速查表

错误码含义可能原因排查建议
Base.1.0.AccessDenied访问被拒绝当前用户权限不足检查用户角色和接口所需权限。
Base.1.0.ResourceMissing资源不存在请求路径对应的资源不存在检查请求 URL 和资源是否已加载。
Base.1.0.PropertyValueFormatError属性值格式错误参数类型或格式不符合要求按接口 Schema 检查参数格式。
Base.1.0.PropertyValueNotInList属性值不在允许列表枚举参数传入不支持的值检查参数取值范围。
MissingOrMalformedPartmultipart 参数缺失或格式错误UpdateFile、UpdateParameters 或 boundary 不正确按 multipart 接口要求重新构造请求。
UpgradeParameterConflict升级参数冲突ActiveMode、ResetBMC 等参数互斥按升级约束调整参数。

5.3 最小化复现与证据收集

  1. 记录完整 URL、HTTP 方法、请求头、请求体、响应状态和响应体。
  2. 对认证问题保存 Session 创建响应、X-Auth-Token 和账号状态。
  3. 对事件问题保存订阅 URI、Destination、EventTypes、Context 和事件投递日志。
  4. 对固件升级问题保存 Task URI、任务状态、升级文件格式、文件大小和目标资源。
  5. 收集 redfish、event、UpdateService、TaskService 和对应 MDS 依赖组件日志。

5.4 调试方法

  • 使用 curl -k -v 按真实调用顺序复现,保留请求和响应头。
  • 先确认会话或 Basic 认证成功,再检查路由映射和后端资源。
  • 事件问题优先验证订阅 URI、目标网络可达性和事件触发条件。
  • 升级问题先检查任务状态,再检查文件路径、格式、目标组件和任务日志。
  • 通过微组件调试接口调整日志级别和日志类型,复现后及时恢复。

6. 常见问题解答

Q1:Redfish API 返回 401 Unauthorized,如何处理?

  • 问题描述:调用 Redfish 接口时返回 401 未授权错误。
  • 一句话答案:Session 过期、Token 无效或请求未携带有效认证信息。
  • 根因说明:Session 有生命周期限制,或者请求未携带正确的 X-Auth-Token
  • 解决方案:重新创建 Session 获取新 Token,并在请求头中正确携带 Token。
  • 规避方案:设置合理的 Session 超时时间,客户端处理 Token 过期和重建。
  • 适用版本:1.140.4。

Q2:事件订阅后未收到任何事件推送,如何处理?

  • 问题描述:已创建事件订阅,但 Destination 未收到事件。
  • 一句话答案:订阅状态、事件类型或目标网络存在问题。
  • 根因说明:EventService 未使能、EventTypes 配置错误、Destination 不可达或事件未触发。
  • 解决方案:检查 EventService 的 ServiceEnabled 状态,验证 Destination URL 可达性和订阅过滤条件。
  • 规避方案:上线前使用测试事件验证订阅链路,并监控投递失败日志。
  • 适用版本:1.140.4。

Q3:固件升级任务一直处于 Running 状态,如何处理?

  • 问题描述:提交固件升级后 Task 状态持续为 Running。
  • 一句话答案:升级任务仍在执行,或任务因文件、目标组件和系统状态异常而阻塞。
  • 根因说明:固件包问题、目标组件不兼容、设备未满足升级条件或升级过程异常。
  • 解决方案:查询 Task 和 SubTask 状态,检查升级文件、目标和后端升级日志,必要时等待 BMC 重启完成。
  • 规避方案:在维护窗口升级,升级前校验文件、目标资源和当前系统状态。
  • 适用版本:1.140.4。

Q4:POST 请求返回 405 Method Not Allowed,如何处理?

  • 问题描述:尝试 POST 操作时返回 405 错误。
  • 一句话答案:该资源没有注册 POST 操作或当前资源为只读。
  • 根因说明:URI 对应的路由未注册 POST 方法,或资源不支持该操作。
  • 解决方案:查阅 Redfish API 文档和路由配置,确认 URI 支持的操作方法。
  • 规避方案:客户端在调用前检查资源的 Allow 响应头或接口定义。
  • 适用版本:1.140.4。

Q5:如何确认 Redfish 服务运行状态?

  • 问题描述:需要确认 Redfish 接口服务是否正常运行。
  • 一句话答案:检查服务监听日志、路由映射初始化日志和 HTTP 根资源响应。
  • 根因说明:服务未启动、依赖资源缺失或监听端口异常会导致接口不可用。
  • 解决方案:检查 Listen http port 和路由映射初始化日志,使用 GET /redfish/v1 验证服务响应。
  • 规避方案:部署后增加服务存活检查和基础 Redfish 资源探测。
  • 适用版本:1.140.4。