ipmi如何删除fru Product Extra

背景:
装备按照客户要求需要写入Product Extra,但有时可能会出现写错的情况需要进行删除,BMCSet_FRUProductExtraFormat设置的为1 即Product域扩展信息格式设置为 value 格式

问题复现:
比如目前fru的Product Extra为:
Product Extra : 1234
Product Extra : 56
Product Extra : 1234
Product Extra : 56
Product Extra : 910C
Product Extra : MK104101

想把这些删掉,此时执行.\ipmitool.exe -I lanplus -U Administrator -P Admin@9000 -H <您的服务器IP> raw 0x30 0x90 0x04 0x00 0x03 0x07 0x00 0x00命令,命令执行回显执行成功,但是查看fru Product Extra依然存在,实际并未删除,并且如果继续写入相同值相同值会以追加的形式存在存在

做的尝试:

将BMCSet_FRUProductExtraFormat设置的为0,以key-value的形式进行删除,结果执行报错
./ipmitool.exe -I lanplus -U Administrator -P Admin@9000 -H xxx -C 17 raw 0x30 0x90 0x04 0x00 0x03 0x07 0x00 0x05 0x31 0x32 0x33 0x34 0x3d
Unable to send RAW command (channel=0x0 netfn=0x30 lun=0x0 cmd=0x90 rsp=0xc9): Parameter out of range

诉求:

期望在BMCSet_FRUProductExtraFormat为1 情况下 能够对Product Extra进行删除操作

答案内容由AI生成,仅供参考:
:white_check_mark: 结论:只有完整重写 FRU 才能真正“删除”Product Extra 内容,无法通过 raw 命令动态删除单个条目。

点击此处查看详细分析解答

IPMI 删除 FRU Product Extra 的方法与问题分析

根据您提供的背景和问题描述,以下是关于在 BMCSet_FRUProductExtraFormat=1(即 Product Extra 为 value 格式)的情况下如何正确删除 FRU Product Extra 字段的详细解答。


:magnifying_glass_tilted_left: 问题核心总结

  • 目标:删除 FRU 的 Product Extra 内容。
  • 当前配置BMCSet_FRUProductExtraFormat = 1,表示 Product 域的扩展信息使用 纯值平铺格式(value format),而非 key-value 格式。
  • 尝试操作
    • 使用原始 IPMI 命令 raw 0x30 0x90 0x04 ... 尝试清除数据,命令返回成功但实际未生效。
    • 切换为 BMCSet_FRUProductExtraFormat=0 后,尝试按 key-value 方式删除,报错:Parameter out of range

:puzzle_piece: 相关知识背景

:white_check_mark: FRU Product Extra 格式说明

依据文档搜索结果和知识图谱内容:

配置项 功能
BMCSet_FRUProductExtraFormat 控制 FRU Product 域中 Extra 字段的显示格式
0(默认) 使用 key-value 格式,如 OPN=03027700
1 使用 value 格式(纯值平铺),如直接写入 03027700

:warning: 注意:一旦设置为 value 格式后,无法自动还原为 key-value 格式,需重新定制。


:cross_mark: 为什么您的删除命令无效?

您执行了如下命令:

ipmitool raw 0x30 0x90 0x04 0x00 0x03 0x07 0x00 0x00

分析该命令结构(对照 IPMI FRU Write 协议):

字节 含义
0x30 NetFn: Storage (0x0A << 2),用于 FRU 操作
0x90 CMD: Write FRU Data
0x04 FRU Device ID = 4(通常是主板或特定板卡)
0x00 Logical Unit Number (LUN)
0x03 FRU 区域 ID:0x03 表示 Product Area
0x07 Manufacture ID(常见值 0xDB0700,0x07 表低字节)
0x00 0x00 偏移量 OffSet + Len(此处长度为 0)

:small_blue_diamond: 此命令意图是向 Product 区域写入 0 长度数据,理论上可用于清空某段内容。

:red_exclamation_mark: 但实际失败的原因包括:

  1. BMC 固件限制

    • 多个文档指出:有些命令可能因功能不支持而失效,即使命令语法正确,返回“成功”也可能是假成功。
    • 当前实现中,对 Product Extra 字段的清空操作可能未正确映射到 EEPROM 存储逻辑。
  2. value 格式下无明确“字段名”可删

    • value 格式下,所有 Extra 条目被视为一连串字符串,无键名区分。
    • 原始命令无法指定“删除哪个条目”,只能整体重写整个 Product Area。
  3. 需要完整重写整个 FRU Product 区域

    • 要真正“删除”内容,必须读取现有 FRU → 修改 Product Area 中 Extra 数据 → 完整写回。

:white_check_mark: 推荐解决方案:完整重写 FRU Product 区域

:white_check_mark: 方法一:通过 ipmitool fru write 写入全新二进制文件(推荐)

步骤如下:

  1. 读取当前 FRU 数据到文件
ipmitool fru print 0 > fru_original.txt

或使用 raw 读取:

ipmitool raw 0x0a 0x11 0x00 # Read FRU Info

更可靠的工具是 ipmi_fru_parser 或厂商专用工具导出 .fru 二进制文件。

  1. 使用 ipmi-fru-edit 工具修改数据

安装开源工具 ipmi-fru-edit 或类似工具处理 .fru 文件。

# 示例:清空 Product Extra 字段
ipmi-fru-edit -f myfru.fru --product-extra-clear
  1. 写回修改后的 FRU 数据
ipmitool fru write 0 myfru_modified.fru

这样就能彻底清除 Product Extra 所有内容。


:white_check_mark: 方法二:手动构造并写入新 FRU 数据(高级)

步骤:

  1. 获取当前 FRU 二进制数据(通过 ipmitool raw 0x0a 0x11 ... 分段读取)

  2. 解析 Product Area(起始偏移通常在 0x20~0x50 之间,参考 FRU spec)

  3. 清空 Product Extra 字段(Type/Length/Value 编码中 Type = 7 → FRU_PRODUCT_EXTRA)

  4. 重新计算校验和(Header Checksum 和 Area Checksum)

  5. 使用 ipmitool raw 0x30 0x90 ... 逐块写入修改后的内容(不推荐直接写全区域,风险高)


:warning: 为什么切换 BMCSet_FRUProductExtraFormat=0 后仍失败?

您尝试的命令:

raw 0x30 0x90 0x04 0x00 0x03 0x07 0x00 0x05 0x31 0x32 0x33 0x34 0x3d

其中:

  • 0x31 0x32 0x33 0x34 0x3d 是 ASCII 编码:"1234="
  • 表示尝试按 key-value 删除键为 1234= 的条目

但失败原因:

IPMI 不支持“删除特定 key”的操作。FRU 写入是“覆盖式”的,不是“增量更新”。

所以即使在 key-value 模式下,也无法通过发送 "key=" 来删除某一项;必须重写整个 Product Area。


:white_check_mark: 最佳实践建议

操作 推荐方式
:white_check_mark: 查看当前 FRU ipmitool fru print 0
:white_check_mark: 修改 Product Extra 使用 fru edit 工具或生成二进制再写入
:white_check_mark: 删除全部 Extra 清空字段后重写整个 FRU
:cross_mark: 直接用 raw 命令删除 不可靠,多数 BMC 实现不支持动态删除条目

:light_bulb: 诉求回应:能否在 BMCSet_FRUProductExtraFormat=0 下删除 Product Extra?

不能直接通过 raw 命令删除某个 key-value 条目。

但可以在 key-value 模式下:

  1. 读取完整的 FRU 数据
  2. 移除不需要的条目(如 OPN=1234, SN=5678
  3. 将新数据完整写回 FRU 存储区

这种方式是唯一可靠的方法。


:white_check_mark: 总结与操作建议

:white_check_mark: 正确删除 FRU Product Extra 的步骤:

# 1. 导出当前 FRU 数据(需借助工具链)
ipmitool fru print 0 > current.txt

# 2. 使用 ipmi-fru-edit 或厂商工具生成干净的 .fru 文件
#    (确保 Product Extra 为空)

# 3. 写回修改后的 FRU 数据
ipmitool fru write 0 cleaned.fru

:gear: 配置建议(如需灵活管理):

  • 若客户频繁修改,建议统一使用 BMCSet_FRUProductExtraFormat=1(value 格式),然后通过脚本批量注入。
  • 提供一个标准模板 .fru 文件用于快速恢复出厂设置。
  • 避免使用 raw 命令进行精细化字段修改——这不是 IPMI 设计初衷。

:link: 参考资料

  • 《【已评审】支持FRU扩展域Product域的Product Extra格式定制》(评审结论:采用 BMCSet_FRUProductExtraFormat 控制格式)
  • 《frudata》文档:FRU 区域结构定义
  • ipmitool 官方手册:fru write 支持完整写入

:white_check_mark: 结论:只有完整重写 FRU 才能真正“删除”Product Extra 内容,无法通过 raw 命令动态删除单个条目。