RAID卡配置指南
新适配一张RAID卡需要做什么
新增一个RAID卡的sr文件
sr文件的主要目的是定义物理器件的链路拓扑,器件,以及对各类对象提供配置信息和属性值,同时还能通过Scanner和Accessor和属性的引用(#/)、同步(<=/)语法来定义属性间的依赖和动态刷新,RAID卡的sr文件是用来告诉openUBMC如何识别、管理RAID的说明书。
- RAID的名称、型号和芯片厂商等静态信息
- RAID是否支持带外管理以及TypeId(用于确定带外管理通道类型I2C或者PCIE)
- 需要上报的事件和触发条件
- 管理RAID卡的传感器
为什么需要这个配置文件?
- 设备识别:让BMC通过bios上报的四元组加载对应sr文件中配置的RAID卡对象
- 状态监控:实时监控RAID卡、BBU的温度等信息
- 带外管理:获取和设置RAID卡下的物理盘、逻辑盘等信息
- 故障预警:当RAID卡出现问题时及时告警
- 维护支持:方便技术人员进行维护和故障排查
如何配置这个文件?
第一步:了解需要配置的RAID卡
- 查看RAID卡型号(通常在网卡上会标注)
- 获取网卡的基本信息(用于作为sr文件名的四元组:厂商ID,设备ID,子厂商ID,子设备ID,TypeId等)
- 热设计
第二步:修改配置文件
- 基础信息配置
- 配置正确的文件名称,根据BOM+四元组信息组成对应网卡的文件名
如下图RAID卡的sr文件名为14140130_19e53758_19e501a4.sr

- 填写RAID名称和型号
- 选择正确的RAID卡TypeId
具体参考CONTROLLER_TYPE映射表
以上步骤配置完成后网卡可通过csr加载流程加载对应的sr文件,分发sr文件中的Controller对象。
2. BBU
- 设置BBU温度
- 同步语法设置BBU关联的RAID卡
- SASPHY
- 设置RAID卡的PHY状态,通过例测任务更新
- 监控配置
- 设置RAID卡温度传感器,监控阈值,用于告警或调速
- 其余配置
- 按需配置告警及其触发条件
- 设置LED指示灯代码
- 带外信息获取
- 在Controller对象下有一个TypeId属性,该属性用于配合社区组件storage确定带外管理通道类型(I2C或PCIE)和加载对应raid卡厂商的so用于带外管理。
对配置有疑问或者需要支撑的可以在当前话题评论或新增话题我们将尽快回复您
1. CSR的版本描述信息
FormatVersion、DataVersion分别为CSR协议版本号和数据版本号,其定义规则具体如下:
- FormatVersion:定义了SR协议版本,当前版本的SR协议版本为3.00;
- DataVersion:跟随SR数据内容变化而变化,作用与CPLD版本号相同,高位为大版本号,低位为小版本号;
- FormatVersion、DataVersion为A.BC样式(A取值范围为1-255, B、C取值范围是0-9);范围约束:A为大版本,范围:1-255,BC为小版本,范围:01-99,小版本固定两位,不足两位需要补0;
- **Unit:定义当前SR描述的组件类型“Type”和单板名称“Name”,
"FormatVersion": "3.00",
"DataVersion": "3.00",
"Unit": {
"Type": "PCIeCard",
"Name": "PCIeCard_1"
},
2. 基础设备对象
2.1 PCIe设备对象 (PCIeDevice_1)
{
"PCIeDevice_1": {
"DeviceName": "PCIe Card $ (设备型号)",
"FunctionClass": 1, // 功能类型 (0:未知、1:RAID、2:网卡、3:GPU卡,等)
"Position": "", // 设备位置(容器名称)
"Container": "${Container}", // 载板对象
"GroupPosition": "PCIeDevice_${GroupPosition}", // 板卡组位置
"PCIeDeviceType": "SingleFunction", // 设备类型
"SlotType": "HalfLength", // 插槽类型
"FunctionProtocol": "PCIe", // 协议类型
"FunctionType": "Physical" // 功能类型
}
}
- 用途:定义PCIe设备的基本属性和类型,并在PCIe设备加载流程使用。
- 必需配置:是
- 关键属性:
- 设备名称
- 功能类型
- 设备类型
- 插槽类型
2.2PCIe卡对象 (PCIeCard_1)
{
"PCIeCard_1": {
// 同名RAID卡 注意内存要明确出来,否则无法区分SP686C-M-16i 2G和4G
"Name": "SP686C-M-16i 4G"
"Description": "SP686C-M-16i 4G",
"VendorID": "厂商ID",
"DeviceID": "设备ID",
"SubVendorID": "子厂商ID",
"SubDeviceID": "子设备ID",
"Manufacturer": "制造商",
"PartNumber": "部件号",
"RefChip": "#/Chip_RaidChip",
"Model": "型号",
"FirmwareVersion": "固件版本",
"SerialNumber": "序列号"
}
}
- 用途:定义PCIe卡的基本信息和属性,部分属性从Controller和PCIeDevice同步而来,用于对外展示PCIe卡的信息
- 必需配置:是
- 关键属性:
- 名称
- 描述
- 厂商ID
- 设备ID
- 制造商信息
2.3 RAID卡对象(Controller_1)
{
"Controller_1": {
// 这里不能配置成Name,CSR里无法区分不同接口下的同名属性,必须配置唯一的别名
"ControllerName": "RAID卡名称",
"TypeId": "RAID卡类型Id",
"OOBSupport": "是否支持带外管理",
"CtrlOption1": "RAID控制器支持特性1",
"CtrlOption2": "RAID控制器支持特性2",
"CtrlOption3": "RAID控制器支持特性3",
"BOMNumber": "BOM编码",
"ChipManufacturer": "RAID卡芯片厂商",
// RefChip必须配置正确,才能通过该Chip进行带外管理
"RefChip": "#/Chip_RaidChip",
// 该BBU故障属性必须配为Event_BatteryFault.InvalidReading,防止bmc复位情况下错误恢复告警
"BatteryFault": 255
}
}
- 用途:定义RAID卡的功能属性,是storage组件model.json中定义的Controller类。
- 必须配置:是
- 关键属性:
TypeId:存储组件基于TypeId判断raid卡的类型,根据判断出的类型会决定storage组件使用的回调函数库,以及判断RAID卡支持的带外管理通道类型
OOBSupport:表征RAID卡是否支持带外管理,0表示不支持,1表示支持,支持带外管理的RAID卡存储模块才能正常获取信息
CtrlOption1:表明RAID卡支持的相关功能,存储组件会基于该属性判断raid卡支持的读策略、写策略、IO策略、访问策略,具体参数含义见storage代码仓common_def.lua中option1_format定义
CtrlOption2:表明RAID卡支持的相关功能,存储组件会基于该属性判断raid卡支持的硬盘缓存策略、工作模式,具体参数含义见storage代码仓common_def.lua中option2_format定义
CtrlOption3:表明RAID卡支持的相关功能,存储组件会基于该属性判断raid卡支持的写缓存策略、RAID级别,具体参数含义见storage代码仓common_def.lua中option3_format定义
BOMNumber:RAID卡硬件资产编号
2.4 电容对象(Battery_1)
{
"Battery_1": {
"@Parent": "关联的RAID卡对象",
"RefControllerDeviceName": "<=/PCIeDevice_1.DeviceName",
"RefControllerSlotId": "关联的RAID卡槽位id",
"RefControllerTypeId": "关联的RAID卡TypeId"
},
}
- 用途:RAID卡的电容对象,用于BBU在位、温度等信息的获取,以及BBU相关的告警
- 必需配置:否,RAID支持bbu时可配置
3 RAID卡功能对象
3.1 phy误码诊断(SASphy_X)
{
"SASPhy_1": {
"@Parent": "关联的raid卡对象",
"PhyId": 255,
"InvalidDwordCount": 0,
"LossDwordSyncCount": 0,
"PhyResetProblemCount": 0,
"RunningDisparityErrorCount": 0
},
}
- 用途:对应RAID卡的Phy误码诊断通道,相关功能在Storage组件的:phy_object.lua文件
- 必需配置:是,
- 关键属性:
- 无效DWORD数
- 丢失DWORD同步数
- PHY重启问题数
- 连续不均衡性错误数
4 监控对象
传感器定制与开发请参考传感器定制与开发进行配置,以下仅举例RAID卡相关传感器
4.1门限传感器
"ThresholdSensor_RaidCardTemp": {
"AssertMask": 128,
"DeassertMask": 28800,
"ReadingMask": 2056,
"Linearization": 0,
"M": 100,
"RBExp": 224,
"UpperNoncritical": 105,
"PositiveHysteresis": 2,
"NegativeHysteresis": 2,
"SensorType": 1,
"ReadingType": 1,
"SensorName": "<=/PCIeDevice_1.SlotID |> string.format('PCIe RAID%s Temp',$1)",
"Unit": 128,
"BaseUnit": 1,
"ModifierUnit": 0,
"Analog": 1,
"NominalReading": 25,
"NormalMaximum": 0,
"NormalMinimum": 0,
"MaximumReading": 127,
"MinimumReading": 128,
"Reading": "<=/Controller_1.TemperatureCelsius",
// ReadingStatus的取值与Scanner的Status属性一致
"ReadingStatus": "<=/Controller_1.TemperatureCelsius |> expr($1 == 32767 ? 1 : ($1 == 255 ? 2 : 0))"
},
- 用途:用于监控连续变化的物理量,监控RAID卡的温度
- 适用场景:
- 温度监控
- 关键属性:
- 阈值设置
- 滞后值
- 读值
- 传感器名称
- 读值状态
4.2离散传感器
支持BBU才配置
"DiscreteSensor_BBUStatus": {
"EntityId": "<=/Entity_RaidCard.Id",
"EntityInstance": "<=/Entity_RaidCard.Instance",
"Initialization": 99,
"Capabilities": 192,
"SensorType": 41,
"ReadingType": 111,
"SensorName": "<=/PCIeDevice_1.SlotID |> string.format('PCIe%s Card BBU',$1)",
"AssertMask": 7,
"DeassertMask": 7,
"DiscreteMask": 7,
"DiscreteType": 0,
"Unit": 192,
"BaseUnit": 0,
"ModifierUnit": 0,
"RecordSharing": 1,
"Reading": 0
},
"DiscreteEvent_BBUStatus_0": {
"Property": 0,
"ListenType": 1,
"EventData1": 0,
"EventData2": 255,
"EventData3": 255,
"EventDir": "<=/Battery_1.HealthStatus |> expr(($1 & 1) == 0 ? 0 :1)",
"Conversion": 0,
"SensorObject": "#/DiscreteSensor_BBUStatus"
},
"DiscreteEvent_BBUStatus_1": {
"Property": 0,
"ListenType": 1,
"EventData1": 1,
"EventData2": 255,
"EventData3": 255,
"EventDir": "<=/Battery_1.HealthStatus |> expr(($1 & 254) == 0 ? 0 :1)",
"Conversion": 0,
"SensorObject": "#/DiscreteSensor_BBUStatus"
},
"DiscreteEvent_BBUStatus_2": {
"Property": 0,
"ListenType": 1,
"EventData1": 2,
"EventData2": 255,
"EventData3": 255,
"EventDir": "<=/Battery_1.State |> expr($1 == 1 ? 1 :0)",
"Conversion": 0,
"SensorObject": "#/DiscreteSensor_BBUStatus"
}
用于记录传感器事件,这里为BBU的在位信息,故障状态等
4.3 散热控制对象 (CoolingRequirement_X)
调速具体使用
"CoolingRequirement_1_10": {
"RequirementId": "${Slot} |> expr((10 << 8) | $1)",
"MonitoringStatus": "<=/Controller_1.TemperatureAbnormal",
"MonitoringValue": "<=/Controller_1.TemperatureCelsius |> expr($1 >= 255 ? 30 : $1)",
"FailedValue": 80,
"TargetTemperatureCelsius": 95,
"MaxAllowedTemperatureCelsius": 103,
"TargetTemperatureRangeCelsius": [],
"ThresholdValue": [],
"AlarmSpeed": [],
"SensorName": "#/ThresholdSensor_RaidCardTemp.SensorName"
},
- 用途:定义调速散热参数
- 必需配置:是
- 关键属性:
- 读值
- 目标温度
- 最大允许温度
- 温度点失效调速值等
5. 事件对象
精细化告警开发请参考事件定制进行配置,以下仅举例RAID卡相关告警
Component属性必须同步语法关联对应的Component_XX对象,才能正确更新部件的健康状态。
5.1 事件配置说明
- EventKeyId:事件唯一标识符
- Reading:告警读数,一般配置为对其他值的同步语法,普通的事件比如温度可以直接拿来当做读数,其他类型的比如证书过期,可以是0和1来代替
- Condition:触发条件
- 数值:直接触发条件
- 表达式:基于传感器值或同步其他对象的属性
- Hysteresis: 迟滞量在恢复告警时使用 ,产生告警时不会使用,如果为0意味着立即恢复 可以理解为误差
- OperatorId: 判断符号,有下列八种判断方式:
1:小于2:小于等于3:大于4:大于等于5:等于6:不等于
7:上升沿0->1产生,1->0恢复8:下降沿1->0产生,0->1恢复 - LedFaultCode:(选配) Led错误码,可为固定值或动态值,x取Component中的Instance填充部分
5.2 RAID卡事件对象
{
"Event_PCIeRaidComLossMntr": {
"EventKeyId": "PCIeCard.PCIeCardCommunicationLoss",
"Condition": 1
},
"Event_PCIeRAIDCardFault": {
"EventKeyId": "PCIeRAIDCard.PCIeRAIDCardFault",
"Condition": 1,
"LedFaultCode": "q$$"
},
"Event_PCIeRaidInitErr": {
"EventKeyId": "PCIeCard.PCIeCardInitializationAbnormal",
"Condition": 0
},
}
5.3 温度相关事件
{
"Event_OverTemp": {
"EventKeyId": "PCIeCard.PCIeCardOverTemp",
"xxx": "xxxx"
},
"Event_TempFail": {
"EventKeyId": "PcieCard.PCIeCardTempFail",
"xxx": "xxxx"
},
}
5.4 设备状态事件
{
"Event_BatteryFault": {
"EventKeyId": "PCIeRAIDCard.PCIeCardBBUFault",
"Condition": 1,
"LedFaultCode": "q$$"
},
"Event_PCIeBandWidth": {
"EventKeyId": "PCIeCard.PCIeCardBandWidthDecreased",
"Condition": 1
},
"Event_PCIeLinkSpeed": {
"EventKeyId": "PCIeCard.PCIeCardLinkSpeedReduced",
"Condition": 1
},
"Event_PCIeCardUCE": {
"EventKeyId": "PCIeCard.PCIeCardUncorrectableErr",
"Condition": 1,
"LedFaultCode": "q$$"
},
"Event_PCIeCardCE": {
"EventKeyId": "PCIeCard.PCIeCardCEHardFailure",
"Condition": 1,
"LedFaultCode": "q$$"
},
"Event_PcieBBURemove": {
"EventKeyId": "PCIeCard.PCIeCardBBUNotPresent",
"Condition": 0
},
"Event_PcieBBUInstall": {
"EventKeyId": "PCIeCard.PCIeCardBBUPresent",
"Condition": 1
},
}
6. 硬件管理对象
6.1 FRU相关对象
{
"Fru_PCIeCard": {
"PcbId": "PCB ID",
"FruId": 1,
"FruName": "FRU名称",
"ConnectorGroupId": "连接器组ID",
"BoardId": 255
},
"FruData_RaidCard": {
"FruId": 1,
"FruDev": "#/Eeprom_Raid",
"EepromWp": 0,
"BoardPartNumber": "N/A",
"BoardSerialNumber": "N/A",
"StorageType": "EepromV2"
},
}
- 用途:定义FRU信息
- 必需配置:有eeprom的RAID卡才需要配置Fru相关对象。
6.2 芯片对象 (Chip_X)
RAID卡有对应的器件才需要配,比如Eeprom_Raid对象目前自研RAID卡才有。
Chip_RaidChip对象的Address需要保证正确,否则会影响带外管理能力(依赖I2C带外管理的RAID卡)
{
"Chip_RaidChip": {
"Address": 122,
"AddrWidth": 1,
"OffsetWidth": 0,
"WriteTmout": 100,
"ReadTmout": 100,
"HealthStatus": 0
},
"Pca9555_Raid": {
"Address": 64,
"AddrWidth": 1,
"OffsetWidth": 1,
"WriteTmout": 100,
"ReadTmout": 100,
"HealthStatus": 0
},
"Eeprom_Raid": {
"Address": 162,
"AddrWidth": 1,
"OffsetWidth": 2,
"WriteTmout": 100,
"ReadTmout": 100,
"HealthStatus": 0,
"WriteInterval": 20,
"RwBlockSize": 32
},
"Lm75_Raid": {
"Address": 148,
"AddrWidth": 1,
"OffsetWidth": 1,
"WriteTmout": 100,
"ReadTmout": 100,
"HealthStatus": 0
}
}
6.3 Component对象 (Component_X)
{
"Component_ComPCIeCard1": {
"FruId": 255,
"Instance": "<=/PCIeDevice_1.SlotID",
"Type": 8,
"Name": "<=/PCIeDevice_1.DeviceName",
"Presence": 1,
"Health": 0,
"PowerState": 1
},
"Component_Battery": {
"FruId": 255,
"Instance": "<=/PCIeDevice_1.SlotID",
"Type": 8,
"Name": "PCIe Card BBU",
"Presence": 1,
"Health": 0,
"PowerState": 1
},
"Component_PCIeCard": {
"FruId": 255,
"Type": 8,
"Health": 0,
"PowerState": 1,
"GroupId": 1,
"Instance": 1,
"Name": "<=/PCIeDevice_1.DeviceName",
"Presence": 1,
"ReplaceFlag": 0,
"PreviousSN": "N/A",
// SerialNumber必须配置同步属性更新,否则无法上报PCIE卡更换告警。
"SerialNumber": "<=/PCIeCard_1.SerialNumber"
},
}
在soft文件中配置,分别表征RAID卡对象,PCIeDevice对象,BBU对象,关联相关的告警,由fru模块管理,触发告警时会根据告警级别设置关联的RAID卡的健康状态
7. 管理拓扑对象
7.1 管理总线对象
{
"ManagementTopology": {
"Anchor": {
"Buses": [
"I2cMux_Chan"
]
},
"I2cMux_Chan": {
"Chips": [
"Chip_RaidChip",
"Pca9555_Raid",
"Eeprom_Raid",
"Lm75_Raid"
]
}
}
}
- 用途:定义管理总线拓扑和总线下的Chip对象
- 必需配置:是
- 关键属性:
- 总线类型
- 通道
8 RAID卡带外注册流程
加载到CSR,加载了Controller对象会进入流程:
function c_controller:ctor(obj)
function c_controller:init()
日志打印:
log:notice(‘controller init obj.Id = %s, object_id = %s’, self.obj.Id, self.object_id)
然后会进入Raid卡的注册流程:
function c_controller:register()
日志打印:
log:notice(‘controller%s begin register’, self.Id)
log:notice(‘ctrl%s add_controller_to_link_topo successfully’, self.Id)
log:notice(‘ctrl%s add_controller_to_sml successfully’, self.Id)
log:notice(‘ctrl%s register_controller_to_sml successfully’, self.Id)
如果以上日志都打印出来了,那么注册流程就算是走完了,也就意味RAID卡注册成功,可以进行带外管理了。少哪一行日志可以去对应位置前看具体可能的错误。