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等类型介质里面。
非标准电子标签方案设计:
- 配置CSR对象
- 由对应的非标App解析电子标签数据
- 然后调用frudata的Update方法更新资源树
- 用户使用frudata提供的统一对外IPMI接口读写电子标签
- frudata调用非标App的读写方法完成电子标签的读写功能
设计目标:
- 可扩展性好,伙伴场景下友商新增一种非标电子标签
- 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"
}注意事项:
- fruid配置为1-63会自动分配fruid,默认可以配为1
- fruid为0保留给挂耳,配置64-255不会进行fruid分配
- Fru里面的FruDataId需要关联到对应的Frudata对象
- 标准电子标签StorageType需要配为TianChi或者EepromV2、File
- 非标电子标签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) 0xAA3. 读电子标签:
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) 0xAAArea和field字段定义:
4.3 IPMI edit命令修改电子标签信息
bash
fru edit <fruid> field <section> <index> <string>section和index字段定义:
注意: edit命令必须修改有内容的字段,否则报错找不到。