修改fru board extra字段,print显示乱码

  1. 等长修改,打印正常

  1. 缩短长度,打印也正常

  1. 增加长度,print打印乱码

答案内容由AI生成,仅供参考:

修改 FRU Board Extra 字段导致 fru print 显示乱码的问题分析与解决方案

在对 FRU(Field Replaceable Unit) 的 Board Extra 字段进行修改时,用户发现当增加字段长度后,使用 ipmitool fru print 命令读取 FRU 信息会出现乱码或“Device not present”错误。而等长或缩短字段时则正常。以下结合知识库中的信息对该问题进行全面分析并提供解决方案。


:magnifying_glass_tilted_left: 问题现象总结

操作类型 修改内容示例 结果
等长修改 OPN:0302Y710OPN:0302Y710 :white_check_mark: 正常显示
缩短长度 OPN:0302Y710OPN:0302Y :white_check_mark: 正常显示
增加长度 OPN:0302Y702OPN:0302Y0345653 :cross_mark: fru print 显示乱码,部分字段损坏

从日志可见,在修改较长字符串时系统提示:

String size are not equal, resizing fru to fit new string
...
Moving Section Product, from 0 to 8
...
Writing new FRU. Done.

尽管写入成功,但后续读取失败或数据异常。


:books: 核心原因分析

:white_check_mark: 1. FRU 数据结构与存储限制

根据知识库内容:

  • FRU Data 占用固定大小的空间(通常为 2048 bytes),存储于 EEPROM 中。
  • Board Extra 字段属于 Board Info Area(Area ID = 2),位于 FRU 数据结构中的特定偏移位置。
  • 当修改字段长度 ≠ 原长度时,工具会触发 resizing fru 流程,重新调整各段(Section)的位置和填充(Padding)。
  • 但若重排逻辑出错或校验失败,可能导致后续 Section(如 Product 区域)数据被错位覆盖或读取异常。

来自知识图谱:
Fru Edit 是用于修改 Board Extra 字段的命令行工具,当修改 OPN、OSN、PCBA Ver 等字段时,若新旧字符串长度不同,需要对整个 FRU data 进行重排(resize)和重新计算校验和。


:white_check_mark: 2. 乱码根源:数据偏移错位与字符编码问题

(1)Section 移动导致后续区域错位

在长度增加的日志中可以看到:

Moving Section Product, from 0 to 8
Change multi offset from 0 to 1
Moving Remaining Bytes (Multi-Rec, etc.), from 0 to 8

这说明:

  • 原本紧凑的 Section 结构被整体后移;
  • 如果其他组件或 BMC 驱动未正确识别新的偏移,将从错误位置读取 Product Serial、Manufacturer 等字段;
  • 最终表现为“Board Serial”变为一串十六进制编码字符串(如 5930333435...),实为 ASCII 编码后的原始字节错译。

示例:5930333435363533 对应 ASCII 字符为 "Y0345653",正好是 OPN:0302Y0345653 的一部分 —— 表明数据被当作字节流错位解析

(2)DBus 属性更新失败引发元数据异常

文档中相关日志显示:

emit properties changed failed, path: /bmc/kepler/System/FrUDatas/FruData FanBoard_010114,
interface: bmc.kepler.Systems.FruData.Board,
err: D-Bus error: append string type utf-8 validate failed

这意味着:

  • 修改后的字符串可能未按正确的 UTF-8 编码写入;
  • DBus 接口拒绝更新属性,导致上层应用(如 Web UI、CLI 工具)读取旧缓存或非法数据;
  • 最终呈现为乱码或空值。

:white_check_mark: 3. 关键影响字段:Board Extra 中的 OPN、OSN、PCBA Ver

根据知识图谱和文档:

  • Board Extra 包含多个键值对,常见字段包括:
    • OPN(Original Product Number):订单产品编号
    • OSN(Original Serial Number):原始序列号
    • PCBA Ver:PCB 装配版本

这些字段通常以 Key=Value 形式存储在扩展区域,属于非标准字段,其长度变化会影响整个 Board Info Area 的布局


:white_check_mark: 解决方案与最佳实践

:white_check_mark: 方案一:【推荐】保持字段长度一致或预分配足够空间

:check_mark: 原则:避免运行时 Resize

由于 fru edit 在长度不匹配时会触发复杂的数据重排流程,极易出错,因此应尽量:

:warning: 确保新值长度 ≤ 原字段预留长度

例如:

# 原字段为 OPN:0302Y702 (共12字符)
# 修改为相同长度:
ipmitool fru edit 6 field b 5 OPN:0302Y710   # ✅ 安全

# 避免超出原长:
ipmitool fru edit 6 field b 5 OPN:0302Y0345653  # ❌ 易引发乱码

:white_check_mark: 实践建议:

  • 在初始写入 FRU 时,为 OPN/OSN 等字段预留足够长度(如填充到 32 字符);
  • 使用占位符补全,如:OPN:0302Y702__________(下划线表示空格或空白填充);
  • 后续修改时,只替换有效内容,保持总长不变。

:white_check_mark: 方案二:离线修改 FRU 文件 + 整体烧录(高阶安全方法)

:white_check_mark: 步骤如下:

  1. 导出完整 FRU bin 文件

    ipmitool fru read 6 fru_6_org.bin
    
  2. 使用专用工具(如 fwupdate, fru-editor)离线修改 Board Extra 字段

    • 确保所有 Section Layout 正确对齐;
    • 手动设置 Padding;
    • 重新计算 Checksum。
  3. 整体写入 FRU

    ipmitool fru write 6 fru_6_modified.bin
    

优势:避免在线 Resize 引发的偏移错误,更安全可靠


:white_check_mark: 方案三:检查并启用 BMC 配置项控制行为

根据知识图谱中提到的配置项:

  • BMCSet_FRUBoardExInfoPcbVer:控制是否自动附加 PCB 版本号;
  • BMCSet_CustomPsuFruProductVersion:控制 Product Version 显示内容;

建议检查 BMC 固件中是否有类似机制影响 Board Extra 处理逻辑,必要时关闭自动注入功能,避免字段冲突。


:white_check_mark: 方案四:验证并刷新 D-Bus 接口状态

若遇到 D-Bus 报错:

append string type utf-8 validate failed

请尝试以下操作:

  1. 重启 FRU 服务:

    systemctl restart frudata
    
  2. 或手动触发属性刷新:

    busctl call bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru0_010104 \
        bmc.kepler.Object.Properties Update ssa{ss} \
        "bmc.kepler.Systems.FruData.Board" 1 "MfgDate" "2025/04/05 Fri 10:00:00"
    
  3. 查看当前接口状态:

    busctl introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru0_010104
    

:hammer_and_wrench: 附加建议:使用标准接口替代 raw 修改

推荐通过 D-Bus 接口安全修改 Board 信息:

# 示例:修改 Board Manufacturer(通过 D-Bus)
busctl set-property bmc.kepler.frudata \
    /bmc/kepler/Systems/1/FruDatas/FruData_Fru0_010104 \
    bmc.kepler.Systems.FruData.Board BoardManufacturer s "Huawei"

# 修改 Board Serial Number
busctl set-property bmc.kepler.frudata \
    /bmc/kepler/Systems/1/FruDatas/FruData_Fru0_010104 \
    bmc.kepler.Systems.FruData.Board BoardSerialNumber s "SN123456789"

优点:自动处理编码、校验、信号通知,规避底层结构风险。


:white_check_mark: 总结与建议

项目 内容
:small_orange_diamond: 根本原因 修改 Board Extra 字段时长度变化触发 FRU resize,导致 Section 偏移错乱,后续数据被误读为十六进制乱码
:small_orange_diamond: 关键字段 OPN, OSN, PCBA Ver 属于 Board Extra,修改需谨慎
:small_orange_diamond: 推荐做法 保持字段等长修改,或离线整体修改 FRU 文件后烧录
:small_orange_diamond: 避免做法 直接使用 ipmitool fru edit 增加长字符串,易导致结构错乱
:small_orange_diamond: 辅助手段 检查 D-Bus 接口状态,重启 frudata 服务,使用 busctl 安全修改

:white_check_mark: 结论:等长修改安全,增减长度需格外小心!建议提前规划字段长度,采用离线编辑或 D-Bus 接口方式更稳妥。


:bookmark: 参考资料来源

  • 知识图谱:Fru Edit, Board Extra, bmc.kepler.Systems.FruData.Board
  • 文档 1:用户 kunlun_yajingtian 提交的乱码问题及日志
  • 文档 3 & 4:FRU 结构定义、Area 字段说明、D-Bus 接口规范

相关链接:

  1. fru edit修改board extra字段,fru print显示乱码
  2. fru edit修改board extra字段,fru print显示乱码
  3. 请问基于2509的Atlas 300I A2是否有FRU信息?
  4. ipmitool获取BMC模组拓展板的FRU信息失败
  5. frudata | 文档中心 | openUBMC

您好,FRU写入可能存在偏移错位问题,建议保持字段等长修改,具体根因进一步定位中

请问有进展了吗

zhangbaocun1@huawei.com 请发一键收集到这个邮箱

请问有进展了吗

已提单跟踪

你好 你这个环境是否还保留着的吗

目前看日志是你在写入时校验到了非法字符

当前日志看不出具体的错误字段

如果问题还保留着

对其他域的扩展域尝试 “”增加长度” 的修改,查看是否报错

分析:
缩短和等长的修改不会触发结构偏移等的修改

所以需要排查这个非法字符是bug产生的还是原有自带的

ipmi.txt (30.5 KB)

frudiskChaos.txt (2 KB)

fanboard.txt (120 字节)

frufanChaos2.txt (2 KB)

frufanChaos.txt (2 KB)

fruDiskNormal.txt (2 KB)

收到

你好!这个链接的信息可能对你解决本问题有所帮助,请参考,谢谢!