FRU管理一本通
更新时间: 2025/10/15
在Gitcode上查看源码

FRU管理一本通

frudata将存储在EEPROM里面的数据按域和字段解析出来,然后上到资源树供其他组件使用,并且对外提供电子标签的读写能力。

1. frudata业务概述

1.1 frudata资源树类设计

  • Fru类描述的是现场可替换单元(FRU)的相关信息,例如主板、Raid卡、Riser卡、硬盘背板等,一个FRU只有一个Fru对象
  • Frudata类描述的是Fru里面的EEPROM存储的信息,一个FRU最多有一个Frudata对象
  • Frus主要在FRU对象分发过来后,给sensor发送fruid信号来管理SDR数据
  • Component类表示部件管理信息,如内存、硬盘、风扇等,一个FRU里可以有多个部件,配置告警也会配一个Component对象,供event管理
  • Components供Web页面查询系统事件,根据部件类型进行筛选,需要从资源树获取当前存在的所有对象的部件类型

1.2 frudata业务流程

1.3 frudata业务代码分层设计

1.3.1 四层模型

  • APP层:只负责自发现对象注册和RPC、IPMI接口注册,业务进行下沉,单一职责
  • 对象服务层:承载对象的统一创建、具体的策略对象执行,分离变化
  • 对象层:实现对象的差异化接口,高内聚,开闭原则
  • 数据层:使用统一的数据结构,存储不同格式的电子标签,向稳定方向依赖

1.3.2 策略模式

使用策略模式在运行时根据需要切换算法,消除了复杂的条件语句,业务代码高内聚。

1.4 电子标签对外呈现形式

  • Board Info Area:该区域提供单板上FRU存储设备的序列号、部件号和其它信息
  • Chassis Info Area:该区域通常用来保存有关系统机框的序列号、部件号和其它信息
  • Overview Info Area:该区域描述FRU类型和fruid
  • Product Info Area:该区域提供产品的序列号、部件号、制造商和其它信息
  • Extended Info Area:该区域的信息都是键值对,也就是"key=value"的形式
  • System Info Area:该区域只在挂耳(fruid为0)可以查询,描述整机配置信息

2. 电子标签设计

2.1 标准电子标签设计

  • 标准电子标签:按照天池规范EEPROM格式存储,大概分为以下几个区域,主要包括EEPROM头、电子标签区域、PSR区域和CSR区域。

2.2 非标准电子标签设计

  • 非标准电子标签:非天池规范EEPROM格式存储的EEPROM,或者存储在Flash、MCU、File等类型介质里面。

非标准电子标签方案设计:

  1. 配置CSR对象
  2. 由对应的非标App解析电子标签数据
  3. 然后调用frudata的Update方法更新资源树
  4. 用户使用frudata提供的统一对外IPMI接口读写电子标签
  5. frudata调用非标App的读写方法完成电子标签的读写功能

设计目标:

  1. 可扩展性好,伙伴场景下友商新增一种非标电子标签
  2. frudata不需要改代码

3. 配置电子标签

shell
"Eeprom_EXU": {
  "OffsetWidth": 2,
  "AddrWidth": 1,
  "Address": 174,
  "WriteTmout": 100,
  "ReadTmout": 100,
  "RwBlockSize": 32,
  "WriteInterval": 20,
  "HealthStatus": 0
},
"Accessor_EXUWP": {
  "Chip": "#/Smc_ExpBoardSMC",
  "Size": 1,
  "Offset": 11776,
  "Mask": 255,
  "Type": 0,
  "Value": 0
},
"FruData_Expander": {
  "FruId": 1,
  "FruDev": "#/Eeprom_EXU",
  "EepromWp": "#/Accessor_EXUWP.Value",
  "StorageType": "TianChi"
},
"Fru_Expander": {
  "PcbId": 1,
 "PcbVersion": ".A",
 "FruId": 1,
 "FruName": "ExpBoard${Slot}",
 "PowerState": 1,
 "Health": 0,
 "EepStatus": "<=/Eeprom_EXU.HealthStatus",
 "Type": 50,
 "FruDataId": "#/FruData_Expander",
 "ConnectorGroupId": "${GroupId}",
 "BoardId": 65535,
 "UniqueId": "00000001010302023922"
}

注意事项:

  1. fruid配置为1-63会自动分配fruid,默认可以配为1
  2. fruid为0保留给挂耳,配置64-255不会进行fruid分配
  3. Fru里面的FruDataId需要关联到对应的Frudata对象
  4. 标准电子标签StorageType需要配为TianChi或者EepromV2、File
  5. 非标电子标签StorageType可以配为MCU等,不做限制

4. IPMI读写电子标签

4.1 电子标签资源树查看命令

bash
busctl --user tree bmc.kepler.frudata
# 查看挂耳
busctl --user introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru0_010104
# 查看扩展板
busctl --user introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Expander_0101

# 本地出装备包
bmcgo publish -z 05024HFH -b TaiShan200_2280v2

注意: frame.py已切换为bmcgo工具

4.2 IPMI命令读写电子标签

1. 写电子标签:

bash
ipmitool -H <ip_addr> -I lanplus -p 623 -U Administrator -P xxx(密码) -C 17 raw 0x30 0x90 0x04(写命令) 0x01(fru_id) 0x2(Area) 0x03(field) 0x00(offset) 0x3(写长度) 0x42 0x61 0x72(写内容,ASCII码)

2. 更新电子标签:

bash
ipmitool -H <ip_addr> -I lanplus -p 623 -U Administrator -P xxx(密码) -C 17 raw 0x30 0x90 0x06(更新命令) 0x01(fru_id) 0xAA

3. 读电子标签:

bash
ipmitool -H <ip_addr> -I lanplus -p 623 -U Administrator -P xxx(密码) -C 17 raw 0x30 0x90 0x05(读命令) 0x01(fru_id) 0x2(Area) 0x03(field) 0x00(offset) 0x3(读长度)

4. 清除电子标签:

bash
ipmitool -H <ip_addr> -I lanplus -p 623 -U Administrator -P xxx(密码) -C 17 raw 0x30 0x90 0x03(清除命令) 0x01(fru_id) 0xAA

Area和field字段定义:

4.3 IPMI edit命令修改电子标签信息

bash
fru edit <fruid> field <section> <index> <string>

section和index字段定义:

注意: edit命令必须修改有内容的字段,否则报错找不到。