## 背景
1880 RAID 卡固件 2.0 起,条带大小(Strip Size)取值范围按盘类型区分:SSD 盘支持 32K/64K,HDD 盘支持 32K/64K/128K/256K;固件 1.0 维持 32K~1024K 不区分盘类型。其他厂商 RAID 卡(LSI/PMC 等)无盘类型条带概念,维持现状。
**问题场景与影响点** :客户/运维通过 Web、Redfish、CLI、SNMP、IPMI 创建或修改 RAID 逻辑盘时需选择条带大小。当前北向各接口只能拿到不区分盘类型的整体范围(32K~1024K),在固件 2.0 上用户可为 SSD 逻辑盘选择固件实际不支持的条带值(如 128K/256K),导致设置被固件拒绝或产生非预期配置;Web 页面也无法按目标盘类型展示正确的可选范围。
**当前系统差距** :后端 sml 层已具备解析固件按盘类型条带范围的能力入口(`min/max_su_size`),但资源协作接口仅暴露 `MinStripSizeBytes/MaxStripSizeBytes` 整体范围,Redfish/Web/SNMP/CLI/IPMI 五个北向接口均无按盘类型字段,北向完全无法感知盘类型差异。
**兼容性约束** :固件类型为后端内部概念(sml 层识别,失败按 1.0),不出北向;北向仅以新增字段是否有效判断能力;存量字段、老客户端、其他厂商卡行为零变化。
## 关联ISSUE
- `AtomGit - 全球开发者的开源社区,开源代码托管平台 — 【openUBMC】1880 RAID 卡条带大小适配固件类型1.0和2.0
## 整体方案
**资源协作接口:**
1. sml 层识别固件类型并解析 `max_ssd_su_size/max_hdd_su_size/min_ssd_su_size/min_hdd_su_size`
2. `bmc.kepler.Systems.Storage.Controller` 参考存量 `MinStripSizeBytes/MaxStripSizeBytes` 新增 4 个按盘类型只读属性(仅固件 2.0 有效)
**北向接口(五口透传):**
3. Redfish Storage 资源 OEM 层级(与存量 `MinStripeSizeBytes/MaxStripeSizeBytes` 同级)新增 4 个字段
4. Web rest 控制器能力查询接口 GET 响应体新增 4 个属性,前端按有效性数据驱动渲染
5. SNMP `raidControllerDescriptionTable` 参考存量 `raidControllerMin/MaxStripSupportInBytes` 新增 4 个只读列
6. CLI `ipmcget` 存储控制器信息回显新增 4 行(仅固件 2.0 显示)
7. IPMI `GetControllerInfo`(netfn 0x30/cmd 0x93)响应扩展 `Reserve1` 4 个预留字节承载 4 个按盘类型条带字段
**设置校验在 storage 后端按盘类型执行**,前端校验仅为体验优化。
## 评审点
### 资源协作接口
1. 变更 `bmc.kepler.Systems.Storage.Controller`:新增 4 个按盘类型条带范围只读属性
### Redfish接口
2. Storage 资源新增 OEM 属性(按盘类型条带范围)
### Web接口
3. 控制器能力查询 GET 响应体新增 4 个按盘类型条带范围属性
### SNMP接口
4. raidControllerDescriptionTable 新增 4 个按盘类型条带范围只读节点
### CLI接口
5. 存储控制器信息回显新增 4 行按盘类型条带范围(条件显示)
### IPMI接口
6. GetControllerInfo 命令响应扩展 4 个预留字节表示按盘类型条带范围
## 详细描述
-–
### 评审点1:变更资源协作接口 `bmc.kepler.Systems.Storage.Controller`
**变更描述** :该接口承载存储控制器能力属性(含存量 `MinStripSizeBytes/MaxStripSizeBytes`),新增的按盘类型条带范围同属控制器能力的一部分。仅新增属性,不变更/废弃任何存量属性与方法。
**接口链接** :[bmc.kepler.Systems.Storage.Controller 接口定义(storage mds/model.json)](storage/mds/model.json-代码预览-storage:基于 Lua 的存储组件管理项目 - AtomGit)
#### 变更属性
| 变更类型 | 属性名称 | 签名 | 只读 | 变化通知 | 属性描述 | 访问权限 | 属性来源 | 持久化类型 | 变更影响 |
|—|—|—|—|—|—|—|—|—|—|
| 新增 | MinSSDStripSizeBytes | u | True | false | SSD 盘条带大小最小值(字节),固件2.0 为 32768;默认值 0xFFFFFFFF 表示无效(固件1.0/其他厂商卡),北向不显示 | Read: ReadOnly | 组件内部赋值(固件查询) | 无需持久化 | 新增属性,无影响 |
| 新增 | MaxSSDStripSizeBytes | u | True | false | SSD 盘条带大小最大值(字节),固件2.0 为 65536;默认值 0xFFFFFFFF 表示无效,北向不显示 | Read: ReadOnly | 组件内部赋值(固件查询) | 无需持久化 | 新增属性,无影响 |
| 新增 | MinHDDStripSizeBytes | u | True | false | HDD 盘条带大小最小值(字节),固件2.0 为 32768;默认值 0xFFFFFFFF 表示无效,北向不显示 | Read: ReadOnly | 组件内部赋值(固件查询) | 无需持久化 | 新增属性,无影响 |
| 新增 | MaxHDDStripSizeBytes | u | True | false | HDD 盘条带大小最大值(字节),固件2.0 为 262144;默认值 0xFFFFFFFF 表示无效,北向不显示 | Read: ReadOnly | 组件内部赋值(固件查询) | 无需持久化 | 新增属性,无影响 |
#### 存量属性语义约定(不变更定义,仅明确固件 2.0 取值规则)
| 属性 | 固件1.0 | 固件2.0 | 其他厂商卡 |
|—|—|—|—|
| MinStripSizeBytes | 32K(现状不变) | min(min_ssd, min_hdd) = 32K | 现状不变 |
| MaxStripSizeBytes | 1024K(现状不变) | max(max_ssd, max_hdd) = 256K | 现状不变 |
#### 变更接口影响
| 路径 | 变更接口影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|—|—|—|—|—|
| /bmc/kepler/Systems/:SystemId/Storage/Controllers/:Id | 新增 4 个只读能力属性,对外提供按盘类型条带范围查询 | 不涉及重名属性,无影响 | 不涉及持久化,无影响 | 仅 1880 固件2.0 返回有效值,其余场景为默认无效值 |
> 本次变更不涉及方法、信号与错误消息的新增/变更/废弃。
-–
### 评审点2:Storage 资源新增 OEM 属性
**资源URI** :`/redfish/v1/Systems/{ComputerSystemId}/Storage/{StorageId}`
**资源版本** :OEM Schema `openUBMCStorage.v1_0_0`(在 `Oem/openUBMC/StorageControllers` 下扩展,与存量 `MinStripeSizeBytes/MaxStripeSizeBytes` 同级)
**属性列表** :
注1:列表内属性默认均支持 `GET` 操作。
注2:若属性在 Schema 中未显式定义 `readonly` 关键字,则默认为只读。
| 属性名 | 类型 | 示例/取值约束 | readonly | 易变属性 | 实现PATCH | 操作权限 | 描述 |
|—|—|—|—|—|—|—|—|
| MinSSDStripSizeBytes | [integer,null] | 32768;null 表示不支持按盘类型区分(固件1.0/其他厂商卡) | true | 否 | / | ReadOnly | SSD 盘条带大小最小值(字节) |
| MaxSSDStripSizeBytes | [integer,null] | 65536;null 同上 | true | 否 | / | ReadOnly | SSD 盘条带大小最大值(字节) |
| MinHDDStripSizeBytes | [integer,null] | 32768;null 同上 | true | 否 | / | ReadOnly | HDD 盘条带大小最小值(字节) |
| MaxHDDStripSizeBytes | [integer,null] | 262144;null 同上 | true | 否 | / | ReadOnly | HDD 盘条带大小最大值(字节) |
**Schema定义** :新增 OEM 属性在 `openubmcstorage.v1_0_0.json` 与配套 csdl 中同步定义,格式、语法和结构与官方 Redfish Schema 文件保持一致。
> 映射配置变更点:`interface_config/redfish/mapping_config/Systems/Storages/Storages.json` 在存量 `MinStripeSizeBytes/MaxStripeSizeBytes` 同级新增 4 个字段(资源协作接口 0xFFFFFFFF → null 转换)。
> 命名说明:新增字段与资源协作接口同名(Strip),存量 Redfish 字段为历史拼写 Stripe(`MinStripeSizeBytes`),两者拼写差异请评审专家评估是否接受(备选:新增字段沿用 Stripe 拼写保持同层级一致)。
> 客户端规则与 Web 前端一致:4 个字段有效则按盘类型渲染(枚举 [min, max] 内 2 的幂),否则回落存量整体条带范围。
**Get响应示例(固件2.0,节选)**
```json
{
“Oem”: {
"openUBMC": {
"StorageControllers": {
"MinStripeSizeBytes": 32768,
"MaxStripeSizeBytes": 262144,
"MinSSDStripSizeBytes": 32768,
"MaxSSDStripSizeBytes": 65536,
"MinHDDStripSizeBytes": 32768,
"MaxHDDStripSizeBytes": 262144
}
}
}
}
```
-–
### 评审点3:Web rest 接口控制器能力查询 GET 响应体新增属性
**资源URI** :存储控制器能力查询接口(webrest,以现网接口为准,仅增量加字段,不新增 Uri)
**资源版本** :/
**操作类型** :Get
**应用场景** :创建/修改 RAID 逻辑盘时,Web 页面按目标盘类型渲染可选条带大小并做前置校验
**属性列表** :
注1:列表内属性默认均支持 `GET` 操作。
注2:新增属性均为只读能力属性,不涉及 PATCH。
| 属性名 | 类型 | 示例/取值约束 | readonly | 易变属性 | 实现PATCH | 操作权限 | 描述 |
|—|—|—|—|—|—|—|—|
| MinSSDStripSizeBytes | [integer,null] | 32768;null 表示不支持按盘类型区分 | true | 否 | / | ReadOnly | SSD 盘条带大小最小值(字节) |
| MaxSSDStripSizeBytes | [integer,null] | 65536;null 同上 | true | 否 | / | ReadOnly | SSD 盘条带大小最大值(字节) |
| MinHDDStripSizeBytes | [integer,null] | 32768;null 同上 | true | 否 | / | ReadOnly | HDD 盘条带大小最小值(字节) |
| MaxHDDStripSizeBytes | [integer,null] | 262144;null 同上 | true | 否 | / | ReadOnly | HDD 盘条带大小最大值(字节) |
**前端规则(单一、与厂商/固件无关)** :
```
if (4 个按盘类型字段均有效) → 按目标盘类型取对应组范围,枚举 [min, max] 内 2 的幂渲染选项
else → 使用存量 MinStripSizeBytes/MaxStripSizeBytes 渲染(现状行为)
```
> 固件 2.0 的 SSD {32K,64K}、HDD {32K,64K,128K,256K} 均为 [min, max] 内 2 的幂,min/max 表达充分。
> 设置侧(创建 LD/修改条带)接口不变;绕过前端的非法值由 storage 后端按盘类型校验并返回明确错误。
-–
### 评审点4:SNMP raidControllerDescriptionTable 新增按盘类型条带范围节点
**SNMP OID** :`1.3.6.1.4.1.{{SnmpOemIdentifier}}.36.50`(存量 `raidControllerDescriptionTable`,仅新增列节点)
**变化类型** :已有表新增序列字段
**应用场景** :客户通过 SNMP 查询 RAID 控制器按盘类型的条带范围能力
**操作类型** :GET
> 参考存量 `raidControllerMinStripSupportInBytes/raidControllerMaxStripSupportInBytes` 模式(`interface_config/snmp/mapping_config/raidControllerProperty/raidControllerProperty.json`),从资源协作接口新增 4 属性读取。SNMP integer 类型无 null 语义,无效值约定返回 0xFFFFFFFF(4294967295),网管侧按无效处理不展示。
| OID | 节点名称 | 取值类型 | 取值范围 | 读写操作 | 约束 |
|—|—|—|—|—|—|
| 1.3.6.1.4.1.{{SnmpOemIdentifier}}.36.50(列节点) | raidControllerMinSSDStripSupportInBytes | integer | 固件2.0 为 32768;0xFFFFFFFF 表示不支持(固件1.0/其他厂商卡) | read-only | 仅 1880 固件2.0 返回有效值 |
| 1.3.6.1.4.1.{{SnmpOemIdentifier}}.36.50(列节点) | raidControllerMaxSSDStripSupportInBytes | integer | 固件2.0 为 65536;0xFFFFFFFF 同上 | read-only | 同上 |
| 1.3.6.1.4.1.{{SnmpOemIdentifier}}.36.50(列节点) | raidControllerMinHDDStripSupportInBytes | integer | 固件2.0 为 32768;0xFFFFFFFF 同上 | read-only | 同上 |
| 1.3.6.1.4.1.{{SnmpOemIdentifier}}.36.50(列节点) | raidControllerMaxHDDStripSupportInBytes | integer | 固件2.0 为 262144;0xFFFFFFFF 同上 | read-only | 同上 |
**Get响应示例(固件2.0)**
```json
{
“raidControllerIndex”: 1,
“raidControllerMinStripSupportInBytes”: 32768,
“raidControllerMaxStripSupportInBytes”: 262144,
“raidControllerMinSSDStripSupportInBytes”: 32768,
“raidControllerMaxSSDStripSupportInBytes”: 65536,
“raidControllerMinHDDStripSupportInBytes”: 32768,
“raidControllerMaxHDDStripSupportInBytes”: 262144
}
```
-–
### 评审点5:CLI 存储控制器信息回显新增按盘类型条带范围
**cli uri** :`/cli/v1/storage/ctrlinfo`(存量命令,回显扩展)
**变化类型** :已有命令回显新增字段
**操作类型** :Get
**应用场景** :CLI 查询存储控制器信息时展示按盘类型条带范围
> 参考存量回显(`interface_config/cli/echoes/ipmcget/storage_ctrlinfo` 中 `Minimum/Maximum Strip Size Supported` 行,`interface_config/cli/ipmcget/storage.json` ctrlinfo 命令 Echoes 配置)。新增 4 行仅固件 2.0 显示(字段无效时不回显),固件 1.0/其他厂商卡回显与现状完全一致。
**命令格式** :`ipmcget -d storage_ctrlinfo`(现状命令不变)
| 参数名称 | 取值类型 | 取值范围 | 是否必选 | 说明 |
|—|—|—|—|—|
| 无 | — | — | — | 回显新增 4 行,仅固件2.0 显示 |
**回显示例(固件2.0,节选)**
```
Minimum Strip Size Supported : 32K
Maximum Strip Size Supported : 256K
Minimum SSD Strip Size Supported : 32K
Maximum SSD Strip Size Supported : 64K
Minimum HDD Strip Size Supported : 32K
Maximum HDD Strip Size Supported : 256K
```
**回显示例(固件1.0/其他厂商卡)** :与现状完全一致(无新增行)
-–
### 评审点6:IPMI `GetControllerInfo` 命令响应扩展预留字节
**命令名称:** GetControllerInfo(存量命令,响应扩展)
**命令说明:** 查询 RAID 控制器信息;本次复用响应 Data 区 `Reserve1` 4 个预留字节,承载按盘类型条带范围,请求格式与响应总长度均不变
**命令权限:** ReadOnly
**是否锁定之后可以访问:** 与存量命令一致
**是否有敏感数据:** 否
**命令样式:**
* 请求:`ipmitool raw 0x30 0x93 0x3D 0x03 0xFF 0xFF `
* 响应:` `
**命令请求参数:**(存量不变)
| 字节顺序 | 域取值说明 |
|—|—|
| NetFn | 30h |
| Cmd | 93h |
| 1:3 | Manufacturer ID,LB Byte first |
| 4 | SubCommand,固定为 3Dh |
| 5 | Reserve |
| 6 | ParameterSelector,固定为 03h(控制器能力参数) |
| 7 | ControllerId |
| 8 | BlockSelector,固定为 FFh |
| 9 | ExternSelector,固定为 FFh |
| 10:11 | ReadingOffset,U16 |
| 12 | ReadingLength |
**命令响应参数:**
| 字节顺序 | 域取值说明 |
|—|—|
| 1 | Completion Code:00h = 【标准完成码】命令响应成功;CCh = 【标准完成码】命令入参超过支持范围;80h = 【非标完成码】命令的长度和参数不匹配;81h = 【非标完成码】命令的参数无法支持(均沿用存量定义,本次不变更) |
| 2:4 | Manufacturer ID,LB Byte first |
| 5 | Reserve |
| 6:N | Data,控制器信息数据块(布局见下表) |
**Data 区字段布局(仅列本次变更相关字段)** :
| Data 偏移 | 字段 | 长度 | 原定义 | 新定义 |
|—|—|—|—|—|
| byte10 | MinStripSizeBytes | 1B | 条带最小值档位索引(不变) | 不变 |
| byte11 | MaxStripSizeBytes | 1B | 条带最大值档位索引(不变) | 不变 |
| byte12 | MinSSDStripSizeBytes | 1B | Reserve1 第1字节(固定 00h) | SSD 盘条带最小值档位索引(与存量 Min/MaxStripSizeBytes 编码一致);FFh 表示不支持(固件1.0/其他厂商卡) |
| byte13 | MaxSSDStripSizeBytes | 1B | Reserve1 第2字节(固定 00h) | SSD 盘条带最大值档位索引;FFh 同上 |
| byte14 | MinHDDStripSizeBytes | 1B | Reserve1 第3字节(固定 00h) | HDD 盘条带最小值档位索引;FFh 同上 |
| byte15 | MaxHDDStripSizeBytes | 1B | Reserve1 第4字节(固定 00h) | HDD 盘条带最大值档位索引;FFh 同上 |
**兼容性说明** :响应总长度不变(4 个预留字节原位复用),老客户端将该 4 字节视为 Reserve 忽略,存量字段偏移与语义均不变;固件1.0/其他厂商卡新增字段填 FFh,客户端按"不支持按盘类型区分"处理。
**命令示例:**
**样例1:查询 0 号控制器信息(固件2.0,返回按盘类型条带范围)**
* 请求:`ipmitool raw 0x30 0x93 0xdb 0x07 0x00 0x3d 0x00 0x03 0x00 0xff 0xff 0x00 0x00 0xff`
* 响应:`db 07 00 00 <Data…>`(Data 区 byte12~15 为条带档位索引,如 `01 02 01 03` 表示 SSD 32K~64K、HDD 32K~256K)
**样例2:查询固件1.0/其他厂商卡控制器信息**
* 请求:同上
* 响应:`db 07 00 00 <Data…>`(Data 区 byte12~15 为 `ff ff ff ff`,表示不支持按盘类型区分)
## 请评审专家评估
1. 新增 4 个属性的命名,及"无效值(资源协作接口 0xFFFFFFFF / Redfish与Web null / SNMP 0xFFFFFFFF / IPMI 0xFF / CLI 不回显)即不支持"的跨接口约定是否可接受
2. 存量 Min/MaxStripSizeBytes 在固件 2.0 的合成规则(max(ssd,hdd)/min(ssd,hdd))是否合理
3. 条带取值集合按"[min, max] 内 2 的幂"表达是否充分(是否需预留离散 options 数组)
4. Redfish 新增字段命名与存量 `MinStripeSizeBytes`(Stripe)拼写不一致:沿用资源协作接口 Strip 还是同层级 Stripe
5. IPMI 占用 Reserve1 4 字节扩展的兼容性(老客户端忽略 Reserve 字节)是否认可
## 是否准备好AI预审
是
## 评审结论
(待评审)
## 遗留问题
1、需要确认固件 2.0 查询条带 4 字段的命令布局与识别固件类型的具体方式
结论:待固件规格确认后固化