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:8080。portal_agent 负责 HTTP 请求处理、鉴权、路由分发、事件订阅、任务服务和 TelemetryService 管理。
1.2 解决什么问题
- 提供标准化、跨厂商一致的服务器管理接口,降低外部工具适配成本。
- 通过事件订阅实现主动告警和资源变化通知,避免只依赖轮询。
- 将固件升级等长时间操作转换为异步任务,便于查询进度和处理异常。
- 通过 TelemetryService 提供指标定义、采集、聚合和报告能力。
- 支持产品定制插件,在不修改核心代码的情况下扩展请求、响应和事件行为。
1.3 核心功能
- Redfish API 路由分发:接收 HTTP/HTTPS 请求,支持
GET、PATCH、POST、DELETE 等操作,并通过路由映射器访问资源协作接口。 - 会话与认证管理:支持 Session-Based 认证和 Basic 认证,管理会话创建、查询和删除。
- 事件订阅与上报:管理
EventService/Subscriptions,按事件类型、严重度、消息 ID 和资源条件向订阅目标发送事件。 - 任务服务:管理异步任务及其子任务,支持任务状态、进度和 Task Monitor 查询。
- 固件升级:提供固件升级入口,支持 BMC、BIOS、CPLD 等目标组件,并通过任务查询升级进度。
- 遥测服务:管理 MetricDefinition、MetricReportDefinition、Trigger 和 MetricReport。
- Schema 与动态资源:提供 SchemaStore、JSONSchemas、动态 Schema 和资源树静态资源访问能力。
1.4 关键术语表
| 术语 | 解释 |
|---|
| Redfish | DMTF 定义的服务器管理 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>"}'
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 | 否 | 订阅事件类型;未指定时默认包含 ResourceAdded、ResourceRemoved、ResourceUpdated、StatusChange、Alert、MetricReport。 |
| 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 目标可能受到平台安全策略限制。
- 订阅字段、数量、重试策略和心跳周期受平台配置和插件策略约束。
调试示例
bashcurl -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 状态。
- 部分升级需要在设备下电或重启后生效。
- 升级文件大小、格式、目标组件和路径权限由当前平台策略限制。
调试示例
bashcurl -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"]
}'
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_plugin | src/plugins/redfish_subscription_plugin.lua | 事件订阅开关、默认重试策略和状态控制 | 订阅创建、恢复或状态变更时 |
| redfish_report_event | .apps.redfish_report_event | 事件编解码定制 | 事件上报和解析时 |
| 静态资源与 Schema | interface_config/static_resource/redfish/v1 | 定制 Redfish Schema 和静态资源 | 服务启动或资源加载时 |
3.3 二次开发指导
- 按产品定制目录约定实现
custom_request_response 或 redfish_subscription_plugin,不要直接修改核心 controller。 - 定制函数必须位于组件白名单中,并在测试环境验证请求、响应和异常路径。
- 事件编码定制应保持 Redfish Schema 兼容,确认
@odata.id、EventType 和 MessageId 等字段完整。 - 定制配置变更后重启对应服务,检查插件加载日志,并回归会话、事件订阅和任务接口。
4. 日志说明
4.1 一键日志收集
组件注册 on_dump 回调,一键收集时会导出 redfish_event_log.json,内容包含事件 ID、SubscriptionId、时间和事件数据。事件日志按批处理并主动休眠,避免一键收集期间 CPU 占用过高。
同时按平台框架收集安全日志和操作日志:
| 文件路径 | 内容说明 |
|---|
/var/log/security.log | 登录、认证失败、特权操作等安全事件。 |
/var/log/operation.log | 账户管理、配置变更、固件升级等用户操作。 |
4.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|
Listen http port | INFO | Redfish HTTP 监听端口已启动。 | 缺失时检查监听配置和端口占用。 |
initialize in-process route mapper successfully | NOTICE | 进程内路由映射器初始化完成。 | 失败时检查映射配置和依赖组件。 |
redfish dump is started / redfish dump is completed | NOTICE | 一键日志导出开始或完成。 | 未生成文件时检查 dump 路径写权限。 |
get subscribers(id=%s) failed | ERROR | 订阅目标查询失败。 | 检查订阅数据库和参数 ID。 |
redfish multipart content type [%s] is invalid | ERROR | 固件升级请求不是合法 multipart/form-data。 | 检查 Content-Type 和 boundary。 |
multipart update targets [%s] is invalid | ERROR | 固件升级 Targets 参数无效。 | 核对 FirmwareInventory 资源路径。 |
post redfish event failed, err: %s | INFO | 遥测或订阅事件投递失败。 | 检查订阅目标网络、认证和事件体。 |
Open file failed | ERROR | 日志或事件导出文件打开失败。 | 检查路径、权限和磁盘空间。 |
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 | 属性值不在允许列表 | 枚举参数传入不支持的值 | 检查参数取值范围。 |
| MissingOrMalformedPart | multipart 参数缺失或格式错误 | UpdateFile、UpdateParameters 或 boundary 不正确 | 按 multipart 接口要求重新构造请求。 |
| UpgradeParameterConflict | 升级参数冲突 | ActiveMode、ResetBMC 等参数互斥 | 按升级约束调整参数。 |
5.3 最小化复现与证据收集
- 记录完整 URL、HTTP 方法、请求头、请求体、响应状态和响应体。
- 对认证问题保存 Session 创建响应、
X-Auth-Token 和账号状态。 - 对事件问题保存订阅 URI、Destination、EventTypes、Context 和事件投递日志。
- 对固件升级问题保存 Task URI、任务状态、升级文件格式、文件大小和目标资源。
- 收集 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。