Storage 存储管理服务
版本信息
| 项目 | 内容 |
|---|
| 组件版本 | 1.100.41 |
| 首发版本 | openUBMC 1.0.0 |
| 文档作者 | openUBMC |
| 最后更新 | 2026-05-29 |
1. 组件概述
1.1 组件简介
Storage(存储管理服务)是 openUBMC 系统中的存储组件管理模块,负责管理 RAID 控制器、物理硬盘、逻辑盘、磁盘阵列和超级电容(BBU)等存储资源。支持通过 I2C(博通 RAID 卡)和 MCTP(1880/PMC RAID 卡)两种通信方式实现带外管理,同时支持通过 BMA(Board Management Agent)获取带内信息。
1.2 解决什么问题
Storage 组件为用户提供了完整的 RAID 卡管理能力,包括 RAID 控制器状态监控与配置、物理盘健康检测与操作、逻辑盘的创建/删除/属性设置、磁盘阵列管理、BBU 状态监控等功能。通过 Storage 组件,用户可以在不依赖主机操作系统的情况下完成存储资源的全生命周期管理。
1.3 核心功能
- 控制器管理:支持 RAID 控制器信息获取、工作模式设置、回拷/JBOD/一致性校验等高级特性配置
- 硬盘管理:支持物理盘信息获取、健康检测、热备设置、定位灯控制、固件状态管理等
- 逻辑盘管理:支持逻辑盘创建(新建阵列/已有阵列/CacheCade)、删除、属性设置(读写策略/IO策略/访问策略等)
- 阵列管理:支持磁盘阵列信息查询,包括容量、RAID类型、关联逻辑盘和物理盘
- BBU 管理:支持超级电容状态监控、健康检测、温度监测
- PHY 误码诊断:支持 SAS PHY 层误码采集、分析和告警
- 配置导入导出:支持存储配置的备份和恢复
- IPMI 命令:支持 55 个 OEM IPMI 命令,覆盖控制器/逻辑盘/物理盘/阵列的查询与设置
1.4 关键术语表
| 术语 | 解释 |
|---|
| SML | Storage Management Library,RAID 卡管理库,通过 I2C 或 MCTP 与 RAID 卡通信 |
| BMA | Board Management Agent,主机侧代理,将主机端信息通过带内通道推送给 BMC |
| PD | Physical Drive,RAID 控制器下属的轻量物理盘对象,通过 SML 操作物理盘 |
| Drive | 统一物理盘模型,RAID 盘与 NVMe 盘共用,承载完整的物理盘属性和操作 |
| Volume | 逻辑盘对象,代表 RAID 控制器创建的逻辑磁盘 |
| DiskArray | 磁盘阵列对象,代表 RAID 控制器下的磁盘组 |
| CacheCade | SSD 缓存加速技术,使用 SSD 作为机械硬盘的读写缓存 |
| JBOD | Just a Bunch Of Disks,磁盘直通模式,不经过 RAID 控制器 |
| BBU | Battery Backup Unit,超级电容/电池备份单元,用于断电时保护缓存数据 |
| 一致性校验 | 定期校验逻辑盘数据一致性的功能,支持自动修复 |
| 回拷 | Copyback,当热备盘替换故障盘后,自动将数据从热备盘拷贝到新换上的盘 |
1.5 外部交互边界图
说明
北向接口(Redfish/WEB/SNMP/CLI)由 rackmount 仓通过 D-Bus 资源协作接口调用 Storage 组件
IPMI 接口由 ipmi_core 组件路由,Storage 向 ipmi_core 注册处理函数,ipmi_core 调用对应注册函数执行命令
BMA 带内数据由 host_agent 组件直接推送给 Storage 组件
Storage 通过 hwproxy 仓管理 I2C 通道,通过 libmgmt_protocol 仓(含 SML 库)与 RAID 卡通信
2. API 使用说明与示例
2.1 存储配置
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/StorageConfig bmc.kepler.Systems.Storage.StorageConfig
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.DiskPartitionUsagePercentageThreshold property u 100 emits-change writable
.StorageConfigReady property y 0x01 emits-change
.VolumesStateAbnormal property y 0 emits-change
功能说明
管理存储组件全局配置状态,用于标识所有控制器的就绪状态和逻辑盘状态。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.StorageConfig |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| StorageConfigReady | 输出 | uint8 | 标志所有控制器的状态,用于配置导入导出场景 | 0x01=就绪 |
| VolumesStateAbnormal | 输出 | uint8 | 是否存在状态异常的逻辑盘 | 0=否,1=是 |
| DiskPartitionUsagePercentageThreshold | 输入/输出 | uint32 | 磁盘分区占用率告警阈值 | 百分比,默认100 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|
| 0 | 成功 | 正常执行完成 | 无 |
| 非 0 | 失败 | 权限不足或状态异常 | 检查组件状态 |
应用场景
- 配置导入导出时检查控制器就绪状态
- 监控逻辑盘状态异常告警
- 设置磁盘分区占用率告警阈值
调试示例
bash
busctl --user get-property bmc.kepler.storage /bmc/kepler/Systems/1/Storage/StorageConfig \
bmc.kepler.Systems.Storage.StorageConfig StorageConfigReady
2.2 PHY 误码诊断
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Diagnose bmc.kepler.Systems.Storage.Diagnose
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.MaxPhyErrorLogFileRotationCount property u 10 emits-change writable
.PhyErrorEnabled property b false emits-change writable
.PhyErrorInterval property u 1800 emits-change writable
.PhyErrorMaxRecord property u 20 emits-change writable
.PhyErrorSelUnlimitFlag property b false emits-change writable
.PhyErrorThreshold property u 100 emits-change writable
功能说明
提供 SAS PHY 物理层误码诊断功能,支持配置采集间隔、记录条数、告警阈值等参数。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Diagnose |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| PhyErrorEnabled | 输入/输出 | bool | PHY 误码诊断使能 | true/false |
| PhyErrorInterval | 输入/输出 | uint32 | 数据采集时间间隔 | 秒,默认1800 |
| PhyErrorMaxRecord | 输入/输出 | uint32 | 单个 OS 启动周期内最大记录条数 | 默认20 |
| PhyErrorThreshold | 输入/输出 | uint32 | 单位时间增长过快的判断门限值 | dwordcount/s,默认100 |
| MaxPhyErrorLogFileRotationCount | 输入/输出 | uint32 | 循环记录的最大文件数 | 默认10 |
| PhyErrorSelUnlimitFlag | 输入/输出 | bool | 是否允许产生多个 SEL 告警事件 | 默认false |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|
| 0 | 成功 | 正常执行完成 | 无 |
| 非 0 | 失败 | 参数非法 | 检查参数取值范围 |
应用场景
- SAS PHY 误码采集与分析
- PHY 层链路质量监控
- 物理层故障预警
调试示例
bash
busctl --user set-property bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Diagnose \
bmc.kepler.Systems.Storage.Diagnose PhyErrorEnabled b true
2.3 控制器管理
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 bmc.kepler.Systems.Storage.Controller
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.ClearForeignConfig method a{ss} - -
.ImportForeignConfig method a{ss} - -
.RestoreDefaultSettings method a{ss} - -
.SetBootDevices method a{ss}ss - -
.SetCopybackState method a{ss}y - -
.SetJBODState method a{ss}y - -
.SetSmarterCopyBackState method a{ss}y - -
.SetWorkMode method a{ss}yy - -
.DumpLog method a{ss} u -
...
功能说明
管理 RAID 控制器的属性和操作,包括工作模式设置、回拷/JBOD 配置、外部配置管理、日志收集等。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Controller |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法参数说明
| 方法名 | 入参 | 出参 | 描述 |
|---|
| SetWorkMode | a{ss}yy | - | 设置控制器工作模式。y:模式(RAID/HBA/JBOD/Mixed), y:是否重启生效 |
| SetCopybackState | a{ss}y | - | 设置回拷功能使能。y:0=禁用,1=使能 |
| SetSmarterCopyBackState | a{ss}y | - | 设置 SMART 错误回拷使能。y:0=禁用,1=使能 |
| SetJBODState | a{ss}y | - | 设置 JBOD 直通使能。y:0=禁用,1=使能 |
| SetBootDevices | a{ss}ss | - | 设置启动盘。s:设备类型, s:设备ID列表 |
| RestoreDefaultSettings | a{ss} | - | 恢复控制器出厂设置 |
| ClearForeignConfig | a{ss} | - | 清除外部配置 |
| ImportForeignConfig | a{ss} | - | 导入外部配置 |
| DumpLog | a{ss} | u | 收集 RAID 控制器日志。u:任务ID |
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Id | 输出 | uint8 | 控制器 ID | 软件生成,默认0xFF |
| Type | 输出 | string | 控制器型号名称 | 与 TypeId 一一对应 |
| TypeId | 输出 | uint32 | 控制器型号 ID | SAS3108/3508/3408/3908 等 |
| Name | 输出 | string | 控制器名称 | CSR 配置或带外获取 |
| OOBSupport | 输出 | uint8 | 是否支持带外管理 | 0=不支持, 1=支持 |
| FirmwareVersion | 输出 | string | 固件版本 | 依赖 OOB |
| WorkMode | 输出 | string | 当前工作模式 | RAID/HBA/JBOD/Mixed |
| SupportedMode | 输出 | string | 支持的工作模式 | — |
| MemorySizeMiB | 输出 | uint32 | 内存容量 | MiB |
| SerialNumber | 输出 | string | 序列号 | — |
| DeviceInterface | 输出 | string | 设备接口速率/协议 | — |
| SASAddr | 输出 | string | SAS 地址 | — |
| TemperatureCelsius | 输出 | int32 | 芯片温度 | °C |
| MaxStripSizeBytes | 输出 | uint32 | 最大条带值 | Bytes |
| MinStripSizeBytes | 输出 | uint32 | 最小条带值 | Bytes |
| NVDataVersion | 输出 | string | NVData 版本 | — |
| PCIeLinkWidth | 输出 | uint8 | PCIe 带宽 | — |
| ReadCachePercent | 输入/输出 | uint8 | 读缓存比例百分比 | 0~100 |
| CopyBackState | 输出 | bool | 回拷使能状态 | — |
| SmarterCopyBackState | 输出 | bool | SMART 回拷使能状态 | — |
| JBODState | 输出 | bool | JBOD 使能状态 | — |
| HotSpareActivationMode | 输出 | string | 热备激活模式 | Failure/Predictive/Unknown |
| NoBatteryWriteCacheEnabled | 输出 | bool | 无电池写缓存使能 | — |
| BootDevices | 输出 | string | 启动设备列表 | — |
| DDREccCount | 输出 | uint16 | DDR ECC 错误计数 | — |
| SupportedRAIDTypes | 输出 | string | 支持的 RAID 级别 | — |
| HardwareRevision | 输出 | string | 硬件版本 | — |
| MaintainPDFailHistrory | 输出 | bool | 物理盘故障记忆使能 | — |
| CryptoEraseSupported | 输出 | bool | 是否支持加密擦除 | — |
| EpdSupported | 输出 | bool | 是否支持加密 | — |
| JbodSupported | 输出 | bool | 是否支持 JBOD | — |
| CachePinnedState | 输出 | bool | Cache Pinned 开关 | — |
| ConfiguredDriveWriteCachePolicy | 输出 | string | RAID 组成员盘写缓存策略 | Enabled/Disabled/Default |
| UnconfiguredDriveWriteCachePolicy | 输出 | string | 非 RAID 组成员盘写缓存策略 | Enabled/Disabled/Default |
| HBADriveWriteCachePolicy | 输出 | string | HBA 模式写缓存策略 | Enabled/Disabled/Default |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|
| 0 | 成功 | 正常执行完成 | 无 |
| 非 0 | 失败 | 控制器不支持带外或参数非法 | 检查 OOBSupport 和参数 |
应用场景
- 查询 RAID 控制器基本信息(型号/固件/温度等)
- 设置控制器工作模式(RAID/HBA/JBOD/Mixed)
- 配置回拷、JBOD、热备激活模式等高级特性
- 导入/清除外部配置
- 收集 RAID 控制器日志
限制条件
- 依赖 OOBSupport=1 的属性在控制器不支持带外管理时无效
- 工作模式切换可能需要重启生效
- 恢复出厂设置操作不可逆
调试示例
bash
busctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 \
bmc.kepler.Systems.Storage.Controller
busctl --user call bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 \
bmc.kepler.Systems.Storage.Controller SetWorkMode 'a{ss}yy' \
3 Interface Busctl UserName Administrator 0 1
busctl --user call bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 \
bmc.kepler.Systems.Storage.Controller RestoreDefaultSettings 'a{ss}' \
3 Interface Busctl UserName Administrator
2.4 一致性校验
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 bmc.kepler.Systems.Storage.Controller.ConsistencyCheck
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Disable method a{ss} - -
.Enable method a{ss}qyyu - -
.SetParameters method a{ss}qyy - -
功能说明
管理 RAID 控制器一致性校验功能,支持启停校验、设置周期/速率/自动修复等参数。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Controller.ConsistencyCheck |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法参数说明
| 方法名 | 入参 | 出参 | 描述 |
|---|
| Enable | a{ss}qyyu | - | 使能一致性校验。q:周期(小时), y:速率, y:自动修复, u:推迟启动时间 |
| Disable | a{ss} | - | 禁用一致性校验 |
| SetParameters | a{ss}qyy | - | 设置校验参数。q:周期(小时), y:速率, y:自动修复 |
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| State | 输出 | string | 校验功能状态 | Enabled/Disabled |
| PeriodOfHours | 输出 | uint16 | 校验周期 | 1~1440 小时 |
| Rate | 输出 | string | 校验速率 | Low/Medium/High |
| AutoRepairEnabled | 输出 | bool | 自动修复使能 | true/false |
| RunningStatus | 输出 | string | 运行状态 | — |
| TotalVolumeCounts | 输出 | uint32 | 需校验的逻辑盘总数 | — |
| CompletedVolumeCounts | 输出 | uint32 | 已完成校验的逻辑盘数 | — |
| DelayToStart | 输出 | uint32 | 推迟启动时间 | 0~24 小时 |
2.5 逻辑盘管理
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 bmc.kepler.Systems.Storage.Controller.VolumeManage
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.CreateCachecadeVolume method a{ss}ayysyquyqy u -
.CreateVolumeInExisingtArray method a{ss}qyyysuyyyyyyyyy u -
.CreateVolumeInNewArray method a{ss}ayyysuyyyyyyyyy u -
.DeleteVolume method a{ss}q u -
功能说明
提供逻辑盘的创建和删除功能。支持在新阵列上创建、在已有阵列上创建以及创建 CacheCade 加速逻辑盘。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Controller.VolumeManage |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法参数说明
| 方法名 | 入参 | 出参 | 描述 |
|---|
| CreateVolumeInNewArray | a{ss}ayyysuyyyyyyyyy | u | 在新阵列上创建逻辑盘。返回任务ID |
| CreateVolumeInExisingtArray | a{ss}qyyysuyyyyyyyyy | u | 在已有阵列上创建逻辑盘。返回任务ID |
| CreateCachecadeVolume | a{ss}ayysyquyqy | u | 创建 CacheCade 加速逻辑盘。返回任务ID |
| DeleteVolume | a{ss}q | u | 删除逻辑盘。q:逻辑盘ID,返回任务ID |
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| CreateVolumeSupported | 输出 | bool | 是否支持创建逻辑盘 | — |
| SupportedReadPolicyList | 输出 | string | 支持的读策略列表 | — |
| DefaultReadPolicy | 输出 | string | 默认读策略 | — |
| ReadPolicyWritable | 输出 | bool | 是否可修改读策略 | — |
| SupportedWritePolicyList | 输出 | string | 支持的写策略列表 | — |
| DefaultWritePolicy | 输出 | string | 默认写策略 | — |
| WritePolicyWritable | 输出 | bool | 是否可修改写策略 | — |
| SupportedIOPolicyList | 输出 | string | 支持的 IO 策略列表 | — |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|
| 0 | 成功 | 正常执行完成 | 无 |
| 非 0 | 失败 | RAID 级别不支持、容量超限、成员盘不足 | 检查控制器能力和参数 |
应用场景
- 创建不同 RAID 级别的逻辑盘
- 创建 CacheCade SSD 缓存加速逻辑盘
- 删除不再使用的逻辑盘
限制条件
- 创建逻辑盘需要足够的可用物理盘
- 删除逻辑盘会导致数据丢失,操作不可逆
- CacheCade 逻辑盘需要控制器支持且存在 SSD 盘
调试示例
bash
busctl --user call bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0 \
bmc.kepler.Systems.Storage.Controller.VolumeManage CreateVolumeInNewArray \
'a{ss}ayyysuyyyyyyyyy' \
3 Interface Busctl UserName Administrator \
2 1 2 \
1 0 0 \
0 0 0 0 0 0 0 0 0
2.6 逻辑盘属性
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Controllers/0/Volumes/0 bmc.kepler.Systems.Storage.Volume
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.CancelForegroundInit method a{ss} u -
.SetAccelerator method a{ss}y - -
.SetAccessPolicy method a{ss}y - -
.SetBGIEnable method a{ss}y - -
.SetBootable method a{ss}y - -
.SetCachecadeEnable method a{ss}y - -
.SetDiskCachePolicy method a{ss}y - -
.SetIOPolicy method a{ss}y - -
.SetName method a{ss}s - -
.SetReadPolicy method a{ss}y - -
.SetWritePolicy method a{ss}y - -
.StartForegroundInit method a{ss}y u -
功能说明
管理单个逻辑盘的属性,支持设置读写策略、IO策略、访问策略、启动盘、前台初始化等。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Volume |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法参数说明
| 方法名 | 入参 | 出参 | 描述 |
|---|
| SetName | a{ss}s | - | 设置逻辑盘名称 |
| SetReadPolicy | a{ss}y | - | 设置读策略。y:策略值 |
| SetWritePolicy | a{ss}y | - | 设置写策略。y:策略值 |
| SetIOPolicy | a{ss}y | - | 设置 IO 策略。y:策略值 |
| SetAccessPolicy | a{ss}y | - | 设置访问策略。y:策略值 |
| SetDiskCachePolicy | a{ss}y | - | 设置物理盘缓存策略。y:策略值 |
| SetBGIEnable | a{ss}y | - | 设置 BGI 使能。y:0=禁用,1=使能 |
| SetBootable | a{ss}y | - | 设置启动盘。y:0=非启动,1=启动 |
| SetCachecadeEnable | a{ss}y | - | 设置 CacheCade 使能。y:0=禁用,1=使能 |
| SetAccelerator | a{ss}y | - | 设置加速方法。y:加速类型 |
| StartForegroundInit | a{ss}y | u | 开始前台初始化。返回任务ID |
| CancelForegroundInit | a{ss} | u | 取消前台初始化。返回任务ID |
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Id | 输出 | uint16 | 逻辑盘 ID | 每个 RAID 卡下唯一 |
| VolumeName | 输出 | string | 逻辑盘名称 | — |
| State | 输出 | string | 状态 | Optimal/Degraded/Offline/Failed 等 |
| RAIDType | 输出 | string | RAID 级别 | RAID0/1/5/6/10/50/60 等 |
| CapacityBytes | 输出 | uint64 | 容量 | Bytes |
| OptimumIOSizeBytes | 输出 | uint32 | 条带大小 | Bytes |
| DefaultReadPolicy | 输出 | string | 默认读策略 | NoReadAhead/ReadAhead |
| CurrentReadPolicy | 输出 | string | 当前读策略 | — |
| DefaultWritePolicy | 输出 | string | 默认写策略 | WriteThrough/WriteBackWithBBU/WriteBack |
| CurrentWritePolicy | 输出 | string | 当前写策略 | — |
| DefaultCachePolicy | 输出 | string | 默认 IO 策略 | CachedIO/DirectIO |
| CurrentCachePolicy | 输出 | string | 当前 IO 策略 | — |
| AccessPolicy | 输出 | string | 访问策略 | ReadWrite/ReadOnly/Blocked |
| DriveCachePolicy | 输出 | string | 物理盘缓存策略 | Unchanged/Enabled/Disabled |
| InitializationMode | 输出 | string | 初始化方式 | UnInit/QuickInit/FullInit 等 |
| BootEnable | 输出 | uint8 | 是否启动盘 | 0/1 |
| BootPriority | 输出 | string | 启动优先级 | — |
| BGIEnable | 输出 | uint8 | BGI 使能状态 | 0/1 |
| RebuildState | 输出 | uint8 | 重构状态 | 0=无,1=进行中 |
| RebuildProgress | 输出 | uint8 | 重构进度 | 0~100% |
| CurrentForegroundInitState | 输出 | uint8 | 前台初始化状态 | 0/1 |
| ForegroundInitProgress | 输出 | uint8 | 前台初始化进度 | 0~100% |
| SSDCachecadeVolume | 输出 | bool | 是否 CacheCade 逻辑盘 | — |
| SSDCachingEnable | 输出 | bool | CacheCade 使能状态 | — |
| AssociatedVolumes | 输出 | string | 关联的普通逻辑盘 | CacheCade 逻辑盘专用 |
| AssociatedCacheCadeVolume | 输出 | string | 关联的 CacheCade 逻辑盘 | — |
| SpanCount | 输出 | uint8 | Span 数量 | — |
| NumDrivePerSpan | 输出 | uint8 | 每 Span 盘数 | — |
| RefControllerId | 输出 | uint8 | 所属控制器 ID | — |
| RefDriveList | 输出 | string | 成员盘列表 | — |
| RefDiskArrayList | 输出 | string | 关联阵列列表 | — |
| HotSpareDriveList | 输出 | string | 热备盘列表 | — |
| CacheLineSizeKiB | 输出 | uint32 | 缓存行大小 | KiB |
| AccelerationMethod | 输出 | string | 加速方法 | — |
| MaxResizableSizeBytes | 输出 | uint64 | 最大可扩展容量 | Bytes |
| OSDriveName | 输出 | string | OS 盘符 | — |
2.7 物理盘管理
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Drives/Disk0 bmc.kepler.Systems.Storage.Drive
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.CryptoErase method a{ss} - -
.SetBootPriority method a{ss}y - -
.SetFirmwareStatus method a{ss}y - -
.SetHotspareType method a{ss}yq - -
.SetLocationIndicatorState method a{ss}y - -
.SetPatrolState method a{ss}y - -
功能说明
管理单个物理硬盘的属性和操作,支持热备设置、定位灯控制、固件状态管理、加密擦除等。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Drive |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法参数说明
| 方法名 | 入参 | 出参 | 描述 |
|---|
| SetLocationIndicatorState | a{ss}y | - | 设置定位灯状态。y:0=关,1=开 |
| SetFirmwareStatus | a{ss}y | - | 设置固件状态。y:状态值 |
| SetHotspareType | a{ss}yq | - | 设置热备类型。y:类型, q:关联逻辑盘ID(专属热备时) |
| SetBootPriority | a{ss}y | - | 设置启动优先级。y:优先级值 |
| SetPatrolState | a{ss}y | - | 设置巡检状态。y:状态值 |
| CryptoErase | a{ss} | - | 加密擦除硬盘 |
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Id | 输出 | uint8 | 硬盘 ID | CSR 配置 |
| NodeId | 输出 | string | 资源唯一 ID | — |
| SlotNumber | 输出 | uint8 | 槽位号 | 默认255 |
| Name | 输出 | string | 硬盘名称 | Disk0 等 |
| Presence | 输出 | uint8 | 在位状态 | 0=不在位, 1=在位 |
| CapacityMiB | 输出 | uint32 | 容量 | MiB |
| Model | 输出 | string | 型号 | — |
| Manufacturer | 输出 | string | 厂商 | — |
| SerialNumber | 输出 | string | 序列号 | — |
| Revision | 输出 | string | 固件版本 | — |
| Protocol | 输出 | uint8 | 协议类型 | 0=Unknown,1=SCSI,2=SAS,3=SATA,4=FC,6=PCIe |
| MediaType | 输出 | uint8 | 介质类型 | 0=HDD,1=SSD,2=SSM,255=Unknown |
| FirmwareStatus | 输出 | uint8 | 固件状态 | 20+ 枚举值 |
| TemperatureCelsius | 输出 | int32 | 温度 | °C |
| CapableSpeedGbs | 输出 | uint8 | 支持速率 | Gb/s |
| NegotiatedSpeedGbs | 输出 | uint8 | 协商速率 | Gb/s |
| PowerOnHours | 输出 | uint32 | 通电时长 | 小时 |
| PredictedMediaLifeLeftPercent | 输出 | uint8 | 预估剩余寿命 | 0~100%, 255=无效 |
| RotationSpeedRPM | 输出 | uint32 | 转速 | RPM(HDD) |
| BlockSizeBytes | 输出 | uint32 | 块大小 | Bytes |
| HotspareType | 输出 | uint8 | 热备类型 | 0=None,1=Global,2=Dedicated |
| RebuildState | 输出 | uint8 | 重构状态 | 0=无,1=进行中 |
| RebuildProgress | 输出 | uint8 | 重构进度 | 0~100% |
| PatrolState | 输出 | uint8 | 巡检状态 | 0=无/完成,1=巡检中 |
| PredictedFailCount | 输出 | uint32 | 预故障计数 | — |
| MediaErrorCount | 输出 | uint32 | 介质错误计数 | — |
| OtherErrorCount | 输出 | uint32 | 其他错误计数 | — |
| LocationIndicatorState | 输出 | uint8 | 定位灯状态 | 0=关,1=开 |
| BootPriority | 输出 | uint8 | 启动优先级 | — |
| SASAddress1 | 输出 | string | SAS 地址 1 | — |
| SASAddress2 | 输出 | string | SAS 地址 2 | — |
| RefControllerId | 输出 | uint8 | 关联控制器 ID | — |
| RefVolumeList | 输出 | string | 关联逻辑盘列表 | — |
| RefDiskArrayId | 输出 | string | 关联阵列 ID | — |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|
| 0 | 成功 | 正常执行完成 | 无 |
| 非 0 | 失败 | 硬盘不在位或操作不支持 | 检查硬盘状态 |
应用场景
- 查询物理盘详细信息(健康/温度/容量/速率等)
- 设置硬盘热备类型(全局/专属/取消)
- 点亮/关闭硬盘定位灯
- 设置硬盘固件状态(Online/Offline/JBOD 等)
- 加密擦除硬盘数据
限制条件
- 加密擦除需要控制器支持(CryptoEraseSupported=true)
- 热备操作需要硬盘处于可设置状态
- 固件状态设置受限于控制器能力
调试示例
bash
busctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Drives/Disk0 \
bmc.kepler.Systems.Storage.Drive
busctl --user call bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Drives/Disk0 \
bmc.kepler.Systems.Storage.Drive SetLocationIndicatorState 'a{ss}y' \
3 Interface Busctl UserName Administrator 1
2.8 硬盘子接口
bmc.kepler.Systems.Storage.Drive.DriveStatus
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Health | 输出 | string | 健康状态 | OK/Warning/Critical |
| Missing | 输出 | uint8 | 丢失标志 | 0/1 |
| PredictiveFailure | 输出 | uint8 | 预故障标志 | 0/1 |
| Failure | 输出 | bool | 是否故障 | true/false |
| InAFailedArray | 输出 | uint8 | 是否在故障阵列中 | 0/1 |
| CapacityError | 输出 | bool | 容量是否异常 | true/false |
| FirmwareStatusError | 输出 | bool | 固件状态是否异常 | true/false |
bmc.kepler.Systems.Storage.Drive.DriveSubHealth
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| EstimatedRemainingLifespanInsufficient | 输出 | bool | 剩余寿命不足 | — |
| EstimatedRemainingLifespan | 输出 | uint32 | 剩余动态预估寿命 | SSD 有效 |
| SLCSpareBlockPercentage | 输出 | uint8 | 非用户区空闲块百分比 | % |
| TLCSpareBlockPercentage | 输出 | uint8 | 用户区空闲块百分比 | % |
| IODeteriorationHealthCode | 输出 | uint8 | IO 性能健康码 | — |
bmc.kepler.Systems.Storage.Drive.NVMe
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| LifeUsedPercentage | 输出 | uint8 | 已使用寿命百分比 | % |
bmc.kepler.Systems.Storage.Drive.NVMe.SMART
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| AvailableSpare | 输出 | uint8 | 可用冗余空间百分比 | 0~100% |
| CriticalWarning | 输出 | uint8 | 临界告警位图 | bit0~bit5 |
| UsedPercentage | 输出 | uint8 | 使用寿命百分比 | 0~100% |
| Status | 输出 | string | SMART 告警状态 | — |
2.9 硬盘组管理
bashbusctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Storage/Drives bmc.kepler.Systems.Storage.Drives
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.CollectIODeteriorationDiagInfo method a{ss} u -
.GetDrivesSubHealthDiagInfo method a{ss}y aa{ua{ss}} -
.SetDriveSubHealthDiagResult method a{ss}sq - -
.StartCollectLog method a{ss}s u -
.GetNvmeDriveRawData method a{ss}u s -
.GetNvmeDriveCount method a{ss} u -
功能说明
提供硬盘组级别的管理功能,包括 IO 性能诊断、亚健康诊断、日志收集、NVMe 原始数据获取等。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Drives |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法参数说明
| 方法名 | 入参 | 出参 | 描述 |
|---|
| CollectIODeteriorationDiagInfo | a{ss} | u | 收集硬盘 IO 劣化诊断信息。返回任务ID |
| GetDrivesSubHealthDiagInfo | a{ss}y | aa{ua{ss}} | 获取硬盘亚健康诊断信息。y:亚健康类型 |
| SetDriveSubHealthDiagResult | a{ss}sq | - | 设置硬盘亚健康诊断结果。q:结果类型 |
| StartCollectLog | a{ss}s | u | 启动硬盘日志收集。s:硬盘名称,返回任务ID |
| GetNvmeDriveRawData | a{ss}u | s | 获取 NVMe 硬盘原始数据。u:索引 |
| GetNvmeDriveCount | a{ss} | u | 获取 NVMe 硬盘数量 |
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| MaxTemperatureCelsius | 输出 | int32 | 最高硬盘温度 | °C |
| LogAutoCollectEnable | 输入/输出 | bool | 日志自动收集使能 | 默认true |
| LogAutoCollectInterval | 输入/输出 | uint32 | 日志自动收集周期 | 小时,默认24 |
2.10 磁盘阵列
功能说明
管理 RAID 控制器下的磁盘阵列信息。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.DiskArray |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Id | 输出 | uint8 | 阵列序号 | 每个 RAID 卡下唯一 |
| RAIDType | 输出 | string | RAID 级别 | — |
| UsedSpaceMiB | 输出 | uint32 | 已使用空间 | MiB |
| TotalFreeSpaceMiB | 输出 | uint32 | 空闲空间 | MiB |
| FreeBlocksSpaceMiB | 输出 | string | 空闲块容量列表 | MiB |
| AverageDriveFreeSpaceMiB | 输出 | uint32 | 每盘平均剩余容量 | MiB |
| DriveNumPerSpan | 输出 | uint8 | 每 Span 盘数 | — |
| RefControllerId | 输出 | uint8 | 关联控制器 ID | — |
| RefVolumes | 输出 | string | 关联逻辑盘列表 | — |
| RefDrives | 输出 | string | 关联物理盘列表 | — |
| RefPDSlots | 输出 | string | 关联物理盘槽位 | — |
| RefPDEnclosures | 输出 | string | 关联物理盘框位 | — |
2.11 超级电容(BBU)
功能说明
管理 RAID 控制器的超级电容(BBU)状态信息。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.Battery |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Name | 输出 | string | BBU 名称 | — |
| State | 输出 | uint8 | 在位信息 | — |
| Health | 输出 | string | 健康状态 | — |
| Fault | 输出 | uint8 | 故障标志 | — |
| HealthStatus | 输出 | uint8 | 健康状态位图 | bit0:电压过低,bit1:需更换,bit2:校准失败,bit3:校准超时,bit4:预故障,bit5:剩余容量低 |
| TemperatureCelsius | 输出 | int32 | 温度 | °C |
2.12 控制器状态子接口
bmc.kepler.Systems.Storage.Controller.ControllerStatus
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Health | 输出 | string | 健康状态 | — |
| FaultCode | 输出 | uint32 | 故障码(位域) | 每一位代表一种故障 |
| CommunicationLoss | 输出 | uint8 | 通信丢失 | — |
| FaultCodeByBios | 输出 | uint32 | BIOS 设置的故障码 | — |
bmc.kepler.Systems.Storage.Controller.BatteryStatus
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| BatteryPresence | 输出 | uint8 | BBU 在位状态 | — |
| BatteryFault | 输出 | uint8 | BBU 故障 | — |
| BatteryHealth | 输出 | uint8 | BBU 健康状态 | — |
| TemperatureCelsius | 输出 | int32 | BBU 温度 | °C |
bmc.kepler.Systems.Storage.Controller.Driver
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Name | 输出 | string | 驱动名称 | 依赖 BMA |
| Version | 输出 | string | 驱动版本 | 依赖 BMA |
bmc.kepler.Systems.Storage.Controller.Chip
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| Model | 输出 | string | 芯片型号 | CSR 配置 |
| ChipManufacturer | 输出 | string | 芯片厂商 | CSR 配置 |
2.13 SAS PHY 误码
功能说明
记录 SAS PHY 物理层的误码统计信息。
| 属性 | 内容 |
|---|
| 接口名 | bmc.kepler.Systems.Storage.PhyError |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|
| PhyId | 输出 | uint8 | PHY ID | 每个 RAID 卡下唯一 |
| InvalidDwordCount | 输出 | uint32 | 无效 DWORD 数 | — |
| LossDwordSyncCount | 输出 | uint32 | 丢失 DWORD 同步数 | — |
| PhyResetProblemCount | 输出 | uint32 | PHY 重启问题数 | — |
| RunningDisparityErrorCount | 输出 | uint32 | 连续不均衡性错误数 | — |
3. IPMI 命令
数据来源:storage/mds/ipmi.json(命令定义)+ storage/src/lualib/ipmi_service.lua(处理函数)
3.1 概述
Storage 组件注册了 55 个 OEM IPMI 命令,统一使用 NetFn=0x30, CMD=0x93,通过 SubCommand 区分子命令。
3.2 查询类命令
| IPMI 命令 | SubCommand | 处理函数 | 说明 |
|---|
GetControllerList | 0x3D/0x00 | get_controller_list | 获取 RAID 控制器 ID 列表 |
GetControllerFwVersion | 0x3D/0x01 | get_controller_fw_version | 获取控制器固件版本 |
GetControllerNvdataVersion | 0x3D/0x02 | get_controller_nvdata_version | 获取控制器 NVData 版本 |
GetControllerInfo | 0x3D/0x03 | get_controller_info | 获取控制器配置信息 |
GetLogicalDriveList | 0x3D/0x04 | get_logical_drive_list | 获取逻辑盘 ID 列表 |
GetCachecadeAssociatedLds | 0x3D/0x06 | get_cachecade_associated_lds | 获取 CacheCade 关联逻辑盘 |
GetLogicalDrivePds | 0x3D/0x07 | get_logical_drive_pds | 获取逻辑盘成员盘列表 |
GetControllerPds | 0x3D/0x08 | get_controller_pds | 获取控制器下物理盘列表 |
GetPhysicalDriveLocation | 0x3D/0x09 | get_physical_drive_location | 获取物理盘位置信息 |
GetPhysicalDriveInfo | 0x3D/0x0A | get_physical_drive_info | 获取物理盘详情 |
GetPhysicalDriveLedStatus | 0x3D/0x12 | get_physical_drive_led_status | 获取物理盘 LED 状态 |
GetArrayList | 0x3D/0x0B | get_array_list | 获取阵列 ID 列表 |
GetArrayInfo | 0x3D/0x0C | get_array_info | 获取阵列信息 |
GetArrayLds | 0x3D/0x0D | get_array_lds | 获取阵列关联逻辑盘 |
GetArrayLdsEx | 0x3D/0x15 | get_array_lds_ex | 获取阵列关联逻辑盘(扩展版) |
GetArrayPds | 0x3D/0x0E | get_array_pds | 获取阵列关联物理盘 |
GetLdDedicatedSparedPds | 0x3D/0x0F | — | 获取逻辑盘专属热备盘 |
GetControllerCapability | 0x3D/0x13 | get_controller_capability | 获取控制器能力 |
GetLogicalDriveListEx | 0x3D/0x14 | get_logical_drive_list_ex | 获取逻辑盘列表(扩展版) |
GetCachecadeAssociatedLdsEx | 0x3D/0x16 | get_cachecade_associated_lds_ex | 获取 CacheCade 关联逻辑盘(扩展版) |
GetHddPlugCnt | 0x3A | — | 获取硬盘插拔计数 |
GetHddPwrStatus | 0x62 | get_hdd_pwr_status | 获取硬盘上下电状态 |
GetDiskSilk | — | get_disk_silk | 获取硬盘丝印信息 |
GetRaidControllerTemp | — | get_raid_controller_temp | 获取控制器温度 |
GetDiskManufacturer | — | get_manufacturer | 获取硬盘厂商信息 |
GetLogAutoCollectConfig | — | get_log_auto_collect_config | 获取日志自动收集配置 |
GetSlotPowerState | — | get_slot_power_state | 获取槽位上下电状态 |
3.3 设置类命令
| IPMI 命令 | SubCommand | 处理函数 | 说明 |
|---|
CreateLogicalDriveOnNewArray | 0x3E/0x01 | create_logical_drive_on_new_array | 在新阵列上创建逻辑盘 |
CreateCachecadeLogicalDrive | 0x3E/0x02 | create_cachecade_logical_drive | 创建 CacheCade 逻辑盘 |
CreateLogicalDriveOnExistedArray | 0x3E/0x03 | create_logical_drive_on_existed_array | 在已有阵列上创建逻辑盘 |
DeleteLogicalDrive | 0x3E/0x04 | delete_logical_drive | 删除逻辑盘 |
SetLogicalDriveName | 0x3E/0x05 | set_logical_drive_name | 设置逻辑盘名称 |
SetLogicDriveRp | 0x3E/0x06 | set_logic_drive_rp | 设置逻辑盘读策略 |
SetLogicDriveWp | 0x3E/0x07 | set_logic_drive_wp | 设置逻辑盘写策略 |
SetLogicalDriveIOP | 0x3E/0x08 | set_logical_drive_iop | 设置逻辑盘 IO 策略 |
SetLogicalDriveAP | 0x3E/0x09 | set_logical_drive_ap | 设置逻辑盘访问策略 |
SetLogicalDriveDCP | 0x3E/0x0A | set_logical_drive_dcp | 设置逻辑盘缓存策略 |
SetLogicalDriveBGI | 0x3E/0x0B | set_logical_drive_bgi | 设置逻辑盘 BGI 使能 |
SetLogicalDriveCachecade | 0x3E/0x0C | set_logical_drive_cachecade | 设置逻辑盘 CacheCade |
SetLogicDriveBootable | 0x3E/0x0D | set_logic_drive_bootable | 设置逻辑盘启动使能 |
SetControllerCopyback | — | set_controller_copyback | 设置回拷使能 |
SetControllerSmarterCopyback | — | set_controller_smarter_copyback | 设置 SMART 回拷使能 |
SetControllerRestoreSettings | — | set_controller_restore_settings | 恢复出厂设置 |
SetControllerJbod | — | set_controller_jbod | 设置 JBOD 使能 |
SetControllerOutofband | — | set_controller_outofband | 设置带外管理使能 |
SetHotspareType | — | set_hotspare_type | 设置物理盘热备类型 |
SetFirmwareStatus | — | set_firmware_status | 设置物理盘固件状态 |
SetLocationIndicatorState | — | set_location_indicator_state | 设置物理盘定位灯 |
SetFaultIndicatorState | — | set_fault_indicator_state | 设置物理盘故障灯 |
SetRaidFaultStatus | — | set_raid_fault_status | 设置 RAID 故障状态 |
SetPdLogCollect | — | set_pd_log_collect | 触发硬盘日志收集 |
SetPCHDiskInfo | — | set_pch_disk_info | 设置 PCH 硬盘信息 |
SetLogAutoCollectConfig | — | set_log_auto_collect_config | 设置日志自动收集配置 |
StartDriveCollectLog | — | start_drive_collect_log | 启动硬盘日志收集 |
SetSlotPowerState | — | set_slot_power_state | 设置槽位上下电 |
4. 关键特性
4.1 博通 RAID 卡带外管理
对博通卡进行带外管理时,使用卡的驱动通过 I2C 与 RAID 卡进行通讯。BMC 的 I2C 通道由 hwproxy 模块统一管理,因此引入插件(Plugin)方式让存储模块使用 I2C 总线。
通信流程:
- 控制器对象调用注册好的 I2C 芯片的 PluginRequest 方法,传入插件名、函数名和函数参数
- 找到对应插件后,调用插件的 run_cmd 函数,创建 Worker 虚拟机
- 在虚拟机中调用 SML 库函数
- SML 库需要 I2C 通信时,将命令打包后发送给 Plugin 所在的 skynet 服务
- 处理结束后,Worker 将结果返回给 Plugin,再由 Plugin 返回给调用方
4.2 1880 及 PMC RAID 卡管理
1880 和 PMC 的 RAID 卡采用 MCTP 方式和 RAID 卡进行通信。MCTP 组件提供相关服务,将收发信息的接口注册到 Storage 组件。
- Storage 注册的回调接口:
do_mctp_writeread - 回调函数注册流程:
CMD.register_controller
4.3 NVMe 盘配置流程
- 在硬盘背板上配置
Connector_ComVPDConnect_x 对象(Bom=14140224, Id=VPD, AuxId=0) - 框架加载
14140224_VPD_0.sr 文件,定义 Connector_ComVPD 和 VirtualVPDConnect 对象 - Storage 组件通过
VirtualVPDConnect 从 NVMe 盘读取协议信息并更新到 Connector_ComVPD 的 AuxId - 框架利用 Bom+Id+AuxId 组合加载具体协议文件(如
14140224_PROTOCOL_0.sr) - 在协议文件中定义
Nvme_1 对象,对应 Storage 的 c_nvme 对象
5. 目录结构
shell├── src
│ ├── lualib
│ │ ├── add_event.lua # 事件上报功能
│ │ ├── array/ # 阵列功能
│ │ ├── battery/ # 电容功能
│ │ ├── bma/ # BMA 带内数据处理
│ │ ├── controller/ # RAID 控制器功能
│ │ ├── controller_firmware/ # 控制器固件管理
│ │ ├── ctrl_commu_loss_monitor.lua # 通信丢失检测
│ │ ├── diagnose/ # PHY 误码诊断
│ │ ├── drive/ # 物理盘功能
│ │ ├── drives/ # 硬盘组功能
│ │ ├── device_mgmt/ # 设备管理(NVMe 设备树同步)
│ │ ├── error_engine.lua # 错误引擎
│ │ ├── handler/ # 配置导入导出
│ │ ├── ipmi_service.lua # IPMI 服务
│ │ ├── link_volume_array_drive_service.lua # 逻辑盘/阵列/物理盘关联
│ │ ├── mctp/ # MCTP 通信
│ │ ├── metric_collect.lua # 硬盘数据采集
│ │ ├── nvme/ # NVMe 盘功能
│ │ ├── object_manager/ # 业务对象管理
│ │ ├── os_patition/ # OS 分区
│ │ ├── pd/ # 硬盘定位
│ │ ├── rpc_services/ # RPC 方法
│ │ ├── sas_phy/ # SAS PHY
│ │ ├── sml/ # SML 库相关
│ │ ├── storage_app.lua # 组件入口
│ │ ├── storage_bus.lua # D-Bus 封装
│ │ ├── storage_mdb_object.lua # MDB 对象基类
│ │ ├── storageconfig/ # 存储配置
│ │ ├── storage_setting/ # 存储设置
│ │ ├── upgrade/ # 升级功能
│ │ ├── volume/ # 逻辑盘功能
│ │ └── ...
│ ├── lualib-src/
│ │ └── l_sml/ # SML C 库
│ └── service/
│ ├── main.lua # 服务入口
│ └── smld.lua # SML 守护进程
├── mds/
│ └── ipmi.json # IPMI 命令定义(55个命令)
6. 组件扩展案例
6.1 新增 IPMI 命令
步骤一:在 mds/ipmi.json 中定义命令
json{
"NewCommand": {
"priority": "Default",
"role": "Operator",
"privilege": ["ReadOnly"],
"request": [
{"data": "ManufacturerId", "baseType": "U32", "len": "3B"},
{"data": "SubCommand", "baseType": "U8", "len": "1B", "value": "0xXX"}
],
"response": [
{"data": "CompletionCode", "baseType": "U8", "len": "1B"},
{"data": "Data", "baseType": "String", "len": "*"}
]
}
}
步骤二:在 ipmi_service.lua 中实现处理函数
luafunction c_ipmi_service.new_command(req, ctx)
local resp_data = {}
-- 解析请求数据
-- 执行业务逻辑
-- 构造响应数据
return resp_data
end
步骤三:在 storage_app.lua 中注册命令
luaself:register_ipmi_cmd(ipmi.NewCommand, ipmi_service.new_command)
6.2 新增配置导入导出属性
步骤一:注册导入导出处理器
在对应对象的 Lua 文件中调用 register_config_dealer:
lualocal export_import_engine = require 'handler.export_import_engine'
export_import_engine.register_config_dealer('ClassName', self)
步骤二:实现 import/export 方法
luafunction c_my_object:import(ctx, obj_json)
-- 从 JSON 恢复属性
self.PropertyName = obj_json.PropertyName
end
function c_my_object:export(ctx)
return {
PropertyName = self.PropertyName
}
end
7. 日志说明
7.1 日志路径
| 日志路径 | 说明 |
|---|
/data/var/log/storage/ | Storage 组件主日志目录 |
/data/var/log/storage/drivelog/ | 硬盘日志收集目录(按 Disk{slot} 组织) |
/data/var/log/storage/phy/ | PHY 误码统计文件 |
/data/var/log/storage/RAID_Controller_Info.txt | RAID 控制器信息 dump 文件 |
/dev/shm/dump_info_tmp/dump_info/LogDump/storage/ | 一键收集日志存放路径 |
/dev/shm/raid_controller_lib.log | SML 库通信日志 |
7.2 日志级别与关键字
| 级别 | 说明 | 关键字示例 |
|---|
| notice | 正常业务流程 | controller%s start TASK_UPDATE、Disk%s add、ctrl%s add_controller_to_sml successfully |
| info | 补充信息 | Controller %s add new volume list、Restore drive info |
| warn | 警告 | — |
| error | 异常/错误 | I2C_READ_WRITE_FAILED、get_ctrl_pd_list failed、Invalid TypeId |
| debug | 调试信息 | controller%s start s.ctl_info %s times、pd_list |
7.3 关键日志说明
| 日志内容 | 含义 | 定位建议 |
|---|
storage-init start / storage-init end | 组件初始化开始/结束 | 初始化耗时过长时检查中间日志 |
controller%s start TASK_UPDATE | 控制器开始周期性数据更新 | 数据不更新时检查是否有此日志 |
controller%s register_controller_to_sml successfully | 控制器注册到 SML 成功 | 注册失败时检查 OOBSupport 和 I2C 通信 |
Disk%s add / Disk%s del | 硬盘在位变化 | 硬盘识别异常时关注 |
get_ctrl_pd_list failed and return %s | 获取物理盘列表失败 | 检查 SML 通信和控制器状态 |
Failed to dump log | 日志收集失败 | 检查磁盘空间和权限 |
SML_ERR_I2C_READ_WRITE_FAILED | I2C 读写失败 | 检查 I2C 通道和 hwproxy 状态 |
SML_ERR_MCTP_READ_WRITE_FAILED | MCTP 读写失败 | 检查 MCTP 链路和组件状态 |
8. 问题定界指南
8.1 总体定界思路
8.2 控制器识别问题
现象:RAID 控制器不可见或信息为空
排查步骤:
- 检查 CSR 配置:确认
.sr 文件中 Controller_1 对象的 TypeId 和 DeviceName 配置正确 - 检查 I2C 通信:查看日志中是否有
SML_ERR_I2C_READ_WRITE_FAILEDbashgrep "I2C_READ_WRITE_FAILED" /var/log/*.log
- 检查 OOBSupport:
OOBSupport=0 表示不支持带外管理,此时控制器信息依赖 CSR 静态配置 - 检查控制器状态:查看
StorageConfigReady 是否为 0x01 - 检查 PCIe 设备:确认 RAID 卡的 PCIe 设备被正确识别
bashbusctl --user get-property bmc.kepler.storage \
/bmc/kepler/Systems/1/Storage/Controllers/0 \
bmc.kepler.Systems.Storage.Controller OOBSupport
8.3 硬盘信息异常
现象:硬盘信息不显示、信息不更新、或显示错误信息
排查步骤:
- 检查在位状态:
Presence=1 表示在位 - 检查 PD 定位:查看日志中
drive identify / drive unidentify 信息 - 检查固件状态:
FirmwareStatus 为 0xFF(255) 表示无效 - 检查关联控制器:
RefControllerId 应指向有效的控制器 - NVMe 盘额外检查:确认设备树对象同步是否正常
8.4 操作执行失败
现象:创建逻辑盘、设置属性等操作返回错误
排查步骤:
- 查看错误码:参考
error_engine.lua 中的错误码映射表
| 错误码 | Redfish 映射 | 含义 |
|---|
| 0x2080 | RaidControllerLevelInvalid | RAID 级别无效 |
| 0x2085 | PhysicalDiskIdInvalid | 物理盘 ID 无效 |
| 0x2086 | VolumeCapacityOutRange | 容量超出范围 |
| 0x2090 | OperationInProcess | 操作进行中 |
| 0x20D5 | CurrentStatusNotSupportOperation | 控制器状态不支持操作 |
| 0x1001 | CurrentStatusNotSupportOperation | I2C 读写失败 |
| 0x1002 | CurrentStatusNotSupportOperation | MCTP 读写失败 |
| 0x1104 | CurrentStatusNotSupportOperation | 控制器初始化未完成 |
| 0x1301 | — | 物理盘 ID 无效 |
| 0x1444 | — | 物理盘已被使用 |
| 0x1448 | — | CacheCade 需使用 SSD |
| 0x1074 | RAIDControllerSetSuccessfully | 操作成功需重启 |
- 检查控制器状态:确认控制器已完成初始化(
StorageConfigReady=1) - 检查参数合法性:确认 RAID 级别、物理盘 ID、容量等参数在有效范围内
8.5 数据不更新
现象:控制器/硬盘/逻辑盘信息长时间不刷新
排查步骤:
- 检查周期任务:确认控制器的 TASK_UPDATE 周期任务是否在运行
- 检查 I2C/MCTP 通信:查看日志中是否有通信失败
- BMA 数据不更新:确认 host_agent 组件正常运行且 BMA 数据推送正常
- NVMe 设备树同步:确认设备树属性变化是否被监听到
9. 常见问题解答
Q1:设置 RAID 卡 JBOD 工作模式后,硬盘状态未变为 JBOD,是否正常?
答:设置 RAID 卡工作模式为 JBOD 后,下挂硬盘状态是否自动切换取决于 RAID 卡的 AutoConfig 配置。可通过 OS 下 storcli /c0 show autoconfig 查询。当 AutoConfig=JBOD 时,切换 JBOD 模式会自动将 Unconfigured Good 状态的硬盘切换为 JBOD。若 AutoConfig 非 JBOD,则需手动设置硬盘固件状态。
Q2:硬盘拔插替换后信息不更新,显示旧盘信息,如何处理?
答:在快速多盘拔插场景下可能出现信息不更新,排查步骤:
- 确认是否为单盘替换场景(单盘替换一般正常)
- 多盘同时拔插时,检查
pd_identify_service 的添加/删除处理时序 - 查看日志中
Disk%s add / Disk%s del 的时序是否正确 - 若确认存在时序问题,可将添加和删除操作加入队列串行处理
Q3:创建逻辑盘失败,返回错误码,如何排查?
答:常见创建失败原因及对应的错误码:
- 物理盘 ID 无效(0x2085):确认物理盘 ID 存在且未被使用
- RAID 级别无效(0x2080):确认控制器支持该 RAID 级别
- 容量超出范围(0x2086):确认容量在可用空间范围内
- 物理盘已被使用(0x1444):确认物理盘未被其他阵列占用
- 控制器状态不支持(0x20D5):等待控制器初始化完成后再操作
Q4:NVMe 盘在 BMC 上不显示信息,如何排查?
答:排查步骤:
- 确认硬盘背板 CSR 中配置了
Connector_ComVPDConnect_x 对象 - 确认设备树中 NVMe 设备对象是否存在
- 检查
device_mgmt 模块的日志,确认设备树属性同步是否正常 - 确认 BMA 数据推送是否正常(host_agent 组件状态)
Q5:部分硬盘不在 RAID 卡管理下,但实际应被管理,如何处理?
答:排查步骤:
- 检查硬盘的
RefControllerId 属性,确认关联的控制器 ID - 检查 PD 定位结果,确认
identify_pd 是否正确匹配 - 查看日志中
drive identify 信息,确认物理盘与 Drive 的配对结果 - 确认硬盘固件状态是否为有效值(非 0xFF)
- 确认控制器
OOBSupport=1 且已成功注册到 SML