【待评审】支持自研RAID卡条带大小按盘类型区分

## 背景

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 字段的命令布局与识别固件类型的具体方式

结论:待固件规格确认后固化