答案内容由AI生成,仅供参考:
文件上传IPMI命令报错“Parameter out of range”问题分析与定位
问题描述
执行 File Upload 对应的 IPMI 原始命令时失败,返回错误码 0xc9,提示信息为:
Unable to send RAW command (channel=0x0 netfn=0x30 lun=0x0 cmd=0x93 rsp=0xc9): Parameter out of range
该问题出现在使用 ipmitool raw 发送自定义 OEM 命令进行文件上传的过程中。
涉及的IPMI命令详情
| 属性 |
内容 |
| NetFn |
0x30 |
| CMD |
0x93 |
| Sub Command |
0x69 (File Upload) |
| Operation |
00h Write Prepare, 01h Write Data, 03h Write Finish |
| Manufacturer ID |
3字节,小端序(LSB first) |
根据文档和接口定义,该命令用于向 BMC 上传文件,通常用于固件更新前的准备阶段。
从知识库中《IPMI OEM 命令索引集合》可知,NetFn 0x30h 是 OEM 类命令 的统一功能码,不同子命令通过 CMD 和 SubCmd 区分。其中:
CMD=93h:包含 Set VNC Configuration (SubCmd=67h)、Set Account Interface (SubCmd=68h)、File Upload (SubCmd=69h) 等。
错误码解析:0xc9 - Parameter out of range
根据知识库中提供的《IPMI 标准命令索引集合》中的“标准完成码”说明:
| IPMI 完成码 |
说明 |
C9h |
Parameter out of range |
含义:请求中某个参数值超出了合法范围。
该错误码并非表示命令不支持,而是表示 参数校验失败,即某个字段传入了系统不接受的值。
定位过程与关键线索
1. 日志分析
从用户提供的日志可获取关键信息:
2026-01-26 08:35:03.510188 bmc_upgrade ERROR: bmc_upgrade_ipmi.lua(276): upload failed, invalid ResouceId [31]
2026-01-26 08:35:03.511721 bmc_upgrade WARNING: init.lua(97): nil:-1 > reg_command.lua:196 > bmc_upgrade_ipmi.lua:277: Parameter out of range
明确指出问题原因:
invalid ResouceId [31] → 无效的 ResourceId
- 实际传入的 ResourceId 为
0x28(十进制 40),但系统返回 [31] 可能为日志记录错误,或实际传参解析为 0x1F(31)
注意:用户命令中传入的 ResourceId 是 0x28(第5字节),对应十进制 40,而日志提示“invalid ResouceId [31]”,推测存在以下两种可能:
- 日志打印错误,实际应为 40;
- 或系统对 ResourceId 的最大值限制为 31,超限即报错。
2. 参数验证:Resource ID 超出允许范围
命令结构分析(用户输入):
ipmitool raw 0x30 0x93 0xdb 0x07 0x00 0x69 0x28 0x00 0x00 0x00 0x00 0x01 0x5c 0x89 0x00
| 字节位置 |
含义 |
值 |
| 1-3 |
Manufacturer ID |
0xdb 0x07 0x00 = 0x0007DB = 华为 |
| 4 |
SubCmd |
0x69 = File Upload |
| 5 |
ResourceId |
0x28 (40) 问题点 |
| 6 |
Reserved |
0x00 |
| 7 |
Operation |
0x01 = Write Data |
| 8 |
DataLen |
0x5c = 92 字节数据 |
| 9-12 |
Offset |
0x89 0x00 0x00 0x00 = 偏移量 137(LSB) |
| 13+ |
Data |
实际数据 |
结论:ResourceId 设置为 0x28 (40),但系统仅允许 ResourceId ≤ 31。
根据《frudata问题定位手册》[id:1] 中的案例五:
“写扩展域多次报错0xc9(Parameter out of range)”
原因:扩展域最长写入501字节,超过则报错0xc9
说明此类 0xc9 错误常见于参数超出预定义范围或长度限制。
根本原因总结
根本原因:
传入的 ResourceId = 0x28 (40) 超出了 BMC 系统对该字段的合法范围限制,导致 IPMI 命令在处理时返回 0xc9 - Parameter out of range。
虽然命令本身是支持的(在 OEM 命令表中有定义),但具体实现中对 ResourceId 字段做了硬性范围检查,当前版本仅允许 ResourceId < 32(即最多支持 32 个资源槽位)。
解决方案建议
方案一:修改 ResourceId 为合法范围内的值
尝试将 ResourceId 改为小于等于 31 的值,例如:
# 修改第5个参数为 0x1F (31)
ipmitool raw 0x30 0x93 0xdb 0x07 0x00 0x69 0x1F 0x00 0x00 0x00 0x00 0x01 0x5c 0x89 0x00
逐步测试可用范围(如 0x00 ~ 0x1F)。
方案二:确认 ResourceId 的具体用途并映射
ResourceId 通常代表一个预定义的资源槽位(如升级包、配置文件、证书等)。
若必须使用编号 40 的资源,需确认:
- 当前系统是否支持动态注册 ResourceId;
- 是否需要先通过其他命令(如
Initialize Upload)分配资源句柄;
- 是否应使用保留 ID 或特定业务 ID。
可参考 PICMG 规范中 Upload Firmware Block (NetFn:2Ch, Cmd:32h) 的设计模式:先通过 Initial Upgrade Action 获取资源句柄,再上传数据。
方案三:升级软件版本或补丁修复
由于 bmc_upgrade 组件未开源,无法直接查看逻辑。但根据日志路径:
bmc_upgrade_ipmi.lua(276): upload failed, invalid ResouceId [31]
说明该限制由 Lua 脚本代码显式判断造成,属于可配置性限制,非协议强制。
推荐措施:
- 联系
bmc_upgrade 模块负责人或 Larry_Li(活跃于 openUBMC 社区)确认是否可在后续版本中放宽限制;
- 查询当前 OpenUBMC 版本(如 25.09) 是否已知此限制;
- 升级至更高版本(如
25.12 或以上),部分问题已在新版本中修复(如 Larry_Li 提到“问题在 25.12 已解决”)。
关于“主界面机型展示图片更新”需求的说明
用户提到:
此功能用于更新主界面机型展示等其他图片,所以也需要该命令的支持。
建议:
- 为“界面资源上传”分配固定的、低编号的
ResourceId(如 0x05);
- 在系统设计中预留 ResourceId 映射表,避免硬编码冲突;
- 如有批量上传需求,考虑使用 Redfish 接口 替代 IPMI Raw 命令,更安全灵活。
结论与建议
| 项目 |
内容 |
| 错误码 |
0xc9 - Parameter out of range |
| 根本原因 |
传入的 ResourceId = 0x28 (40) 超出系统允许的最大值(可能是 31) |
| 解决方案 |
将 ResourceId 修改为 ≤31 的有效值进行测试 |
| 长期建议 |
提交需求至 bmc_upgrade 团队,在后续版本中支持更大范围的 ResourceId 或提供动态资源管理机制 |
| 支持时间 |
若属已知限制,预计在 OpenUBMC 25.12 及以后版本 中可修复(参考 Larry_Li 反馈历史) |
推荐下一步操作:
使用 ResourceId=0x1F 重试命令,并捕获日志验证是否成功;同时提交功能增强请求,推动系统支持更多资源槽位。
相关链接:
- 【教学培训篇】新增IPMI命令
- 怎么获取ipmi命令的参数
- 9500-8iraid卡获取控制器信息的命令执行失败
- ipmi fru write命令疑问
- frudata问题定位手册 | 文档中心 | openUBMC