storage
更新时间:2024/12/19
在Gitcode上查看源码功能简介
- Storage模块是独立组件管理存储组件,对内提供资源协作接口功能接口,目前storage的版本信息在manifest/hardware子系统中
- 信息获取:支持从带外或通过BMA获取控制器、硬盘、超级电容、逻辑盘、RAID组信息
- 对外功能:支持创建、删除、设置逻辑盘;支持设置控制器功能;支持点硬盘定位灯
- 故障检测:支持控制器健康状态检测、硬盘健康状态检测、逻辑盘健康状态检测以及超级电容健康状态检测
- 支持RAID卡:当前支持1880RAID卡、博通RAID卡和PMC RAID卡
目录结构
shell
├── src
│ ├── lualib
│ │ ├── add_event.lua #事件上报功能
│ │ ├── array #阵列功能相关
│ │ ├── battery #电容功能相关
│ │ ├── bma #直通盘及bma相关功能
│ │ ├── bus_monitor_service.lua #smbios功能
│ │ ├── common_def.lua #公共宏定义
│ │ ├── controller #raid卡功能相关
│ │ ├── ctrl_commu_loss_monitor.lua #raid卡通信丢失检测功能
│ │ ├── drive #硬盘功能相关
│ │ ├── drives #硬盘组功能相关
│ │ ├── diagnose #误码诊断功能
│ │ ├── error_engine.lua #错误引擎功能
│ │ ├── handler #配置导入导出功能
│ │ ├── ipmi_service.lua #ipmi服务
│ │ ├── link_volume_array_drive_service.lua #逻辑盘、阵列、物理盘关联功能
│ │ ├── mctp #mctp服务
│ │ ├── method_misc.lua #misc服务
│ │ ├── metric_collect.lua #硬盘数据采集功能
│ │ ├── nvme #nvme盘功能
│ │ ├── object_manager #业务对象相关功能
│ │ ├── os_patition #os分区
│ │ ├── pd #硬盘定位功能
│ │ ├── rpc_services #rpc方法
│ │ ├── sas_phy
│ │ ├── sml #sml库相关
│ │ ├── storage_app.lua #组件服务相关功能
│ │ ├── storage_bus.lua
│ │ ├── storage_mdb_object.lua
│ │ ├── storageconfig
│ │ ├── sync_task.lua #基础任务功能
│ │ ├── tasks.lua #基础任务功能
│ │ ├── task_service.lua #通用任务服务
│ │ └── volume #逻辑盘功能
│ ├── lualib-src
│ │ ├── CMakeLists.txt
│ │ └── l_sml #sml服务
│ ├── service
│ │ ├── main.lua
│ │ └── smld.lua
关键特性
博通Raid卡带外管理介绍
(1)介绍
对博通卡进行带外管理时,我们要使用卡的驱动通过I2C与RAID卡进行通讯。在这个过程中,我们需要将BMC的I2C读写函数传递给RAID卡的驱动,供RAID卡的驱动进行调用。由于当前BMC的I2C通道由hwproxy模块进行统一管理,因此我们需要使用插件的方式实现支持I2C的读写。
(2)实现机制
因为BMC的I2C通信实现方式,因此我们引入插件(plugin)的方式来让存储模块使用在hwproxy管理下的I2C总线,下图描述了其中的关系
- 控制器对象实现具体的功能时,调用注册好的i2c芯片的PluginRequest方法,并传入插件名、函数名和函数参数,插件名用来寻找是哪个插件
- 找到对应的插件后,调用插件的run_cmd函数,创建一个Worker虚拟机,后续的操作都在虚拟机中实现,所以Plugin的协程可以先睡觉
- 在虚拟机中调用实际的sml库中的函数
- sml库中的函数需要使用i2c通信时,将i2c命令打包后使用skynet_send函数将消息发送给plugin所在的skynet服务,并由skynet暂停hwproxy的i2c轮询线程,优先处理当前的i2c通信请求
- 当三方库函数处理结束后,Worker虚拟机会将处理结果发送给plugin,同时唤醒Plugin的协程,并由plugin将信息返回给函数调用方
下图是具体的信息流图:
1880及PMC Raid卡代管理介绍
(1)介绍
1880和PMC的raid卡采用MCTP方式和RAID卡进行通信实现带外管理。首先需要正常建立起MCTP链路后才能正常进行数据更新。
(2)实现机制 MCTP组件提供相关服务,将收发信息的接口注册到Storage组件,需要收发信息会组件会调用回调函数进行处理。
- Storage注册的回调接口为:do_mctp_writeread
- 回调函数注册流程:CMD.register_controller
对外接口
资源协作接口
控制器对外接口
bmc.kepler.Systems.Storage.Controller
shell
NAME TYPE SIGNATURE RESULT/VALUE FLAGS description
.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 - - 设置JBOD开关
.SetSmarterCopyBackState method a{ss}y - - 设置smrat信息错误回拷开关
.SetWorkMode method a{ss}yy - - 设置控制器的工作模式
.DumpLog method a{ss} u - 收集RAID控制器信息
bmc.kepler.Systems.Storage.Controller.ConsistencyCheck
shell
NAME TYPE SIGNATURE RESULT/VALUE FLAGS description
.Disable method a{ss} - - 禁用
.Enable method a{ss}qyyu - - 使能开关
.SetParameters method a{ss}qyy - - 设置参数
bmc.kepler.Systems.Storage.Controller.VolumeManage
shell
NAME TYPE SIGNATURE RESULT/VALUE FLAGS description
.CreateCachecadeVolume method a{ss}ayysyquyqy u - 创建cachecade逻辑盘
.CreateVolumeInExisingtArray method a{ss}qyyysuyyyyyyyyy u - 在现有阵列上创建逻辑盘
.CreateVolumeInNewArray method a{ss}ayyysuyyyyyyyyy u - 在新的阵列上创建逻辑盘
.DeleteVolume method a{ss}q u - 删除逻辑盘
硬盘对外接口
bmc.kepler.Systems.Storage.Drives
shell
NAME TYPE SIGNATURE RESULT/VALUE FLAGS description
.CollectIODeteriorationDiagInfo method a{ss} u - 收集硬盘IO信息
.GetDrivesSubHealthDiagInfo method a{ss}y aa{ua{ss}} - 收集硬盘亚健康诊断信息
.SetDriveSubHealthDiagResult method a{ss}sq - - 设置硬盘亚健康诊断结果
bmc.kepler.Systems.Storage.Drive
shell
NAME TYPE SIGNATURE RESULT/VALUE FLAGS description
.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.Volume
shell
NAME TYPE SIGNATURE RESULT/VALUE FLAGS description
.CancelForegroundInit method a{ss} u - 取消前台初始化
.SetAccelerator method a{ss}y - - 设置加速方法
.SetAccessPolicy method a{ss}y - - 设置获取策略
.SetBGIEnable method a{ss}y - - 设置bgi使能
.SetBootable method a{ss}y - - 设置启动优先级
.SetCachecadeEnable method a{ss}y - - 设置cache使能
.SetDiskCachePolicy method a{ss}y - - 设置逻辑盘cache策略
.SetIOPolicy method a{ss}y - - 设置IO策略
.SetName method a{ss}s - - 设置名称
.SetReadPolicy method a{ss}y - - 设置读策略
.SetWritePolicy method a{ss}y - - 设置写策略
.StartForegroundInit method a{ss}y u - 开始前台初始化
IPMI命令
- 具体详细请参考:mds/ipmi.json
shell
└─/bmc
└─/bmc/kepler
├─/bmc/kepler/IpmiCmds
│ ├─/bmc/kepler/IpmiCmds/30
│ │ ├─/bmc/kepler/IpmiCmds/30/92
│ │ │ └─/bmc/kepler/IpmiCmds/30/92/SetRaidFaultStatus #设置raid卡硬件故障
│ │ └─/bmc/kepler/IpmiCmds/30/93
│ │ ├─/bmc/kepler/IpmiCmds/30/93/CreateCachecadeLogicalDrive #创建CacheCade逻辑盘
│ │ ├─/bmc/kepler/IpmiCmds/30/93/CreateLogicalDriveOnExistedArray #在已有的DiskArray上创建逻辑盘
│ │ ├─/bmc/kepler/IpmiCmds/30/93/CreateLogicalDriveOnNewArray #在新的DiskArray上创建逻辑盘
│ │ ├─/bmc/kepler/IpmiCmds/30/93/DeleteLogicalDrive #删除指定的逻辑盘
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetArrayInfo #获取指定RAID控制器的Disk Array的信息
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetArrayLds #获取指定Array上的逻辑盘ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetArrayLdsEx #获取指定Array上的逻辑盘ID列表, ID是16bit数据#
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetArrayList #查询指定RAID控制器下的DiskArray ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetArrayPds #获取指定Array的物理盘ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetCachecadeAssociatedLds #查询CacheCade逻辑盘关联的普通逻辑盘ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetCachecadeAssociatedLdsEx #查询CacheCade逻辑盘关联的普通逻辑盘ID列表(ID是16bit数据)
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetControllerCapability #获取RAID带外管理能力
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetControllerFwVersion #查询RAID控制器的Firmware版本信息
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetControllerInfo #查询RAID控制器的配置信息
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetControllerList #查询RAID控制器的ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetControllerNvdataVersion #查询RAID控制器的NVDATA版本信息
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetControllerPds #查询指定RAID控制器管理的物理盘ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetDiskManufacturer #查询指定物理盘厂商
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetDiskSilk #查询指定硬盘丝印信息
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetHddPwrStatus #查询硬盘的通电状态
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetLogicalDriveList #查询RAID控制器下的逻辑盘ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetLogicalDriveListEx #查询RAID控制器下的逻辑盘ID列表(ID为16bit数据)
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetLogicalDrivePds #查询指定逻辑盘的物理成员盘ID列表
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetPhysicalDriveInfo #查询指定逻辑盘的基本信息
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetPhysicalDriveLedStatus #查询硬盘灯状态
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetPhysicalDriveLocation #查询指定物理盘的位置信息(丝印)
│ │ ├─/bmc/kepler/IpmiCmds/30/93/GetRaidControllerTemp #查询raid控制器温度
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetControllerCopyback #修改指定RAID控制器是否启用Copyback功能
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetControllerJbod #设置指定RAID控制器是否开启JBOD功能
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetControllerOutofband #设置指定RIAD控制器是否支持带外管理
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetControllerRestoreSettings #恢复指定RAID控制器到初始设置
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetControllerSmarterCopyback #设置指定RAID控制器在检测到物理盘SMART错误之后是否自动进行Copyback
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetFirmwareStatus #设置固件状态
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetHotspareType #设置设备盘类型
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLocationIndicatorState #设置定位灯状态
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicDriveBootable #设置指定逻辑盘为启动盘
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicDriveRp #设置指定逻辑盘的读策略
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicDriveWp #设置指定逻辑盘的写策略
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicalDriveAP #设置指定逻辑盘的访问策略
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicalDriveBGI #设置指定逻辑盘的BGI使能状态
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicalDriveCachecade #设置指定逻辑盘是否关联CacheCade逻辑盘
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicalDriveDCP #设置指定逻辑盘的Disk缓存策略
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicalDriveIOP #设置指定逻辑盘的IO策略
│ │ ├─/bmc/kepler/IpmiCmds/30/93/SetLogicalDriveName #设置逻辑盘名称
│ │ └─/bmc/kepler/IpmiCmds/30/93/SetPdLogCollect #主动触发硬盘日志收集
│ └─/bmc/kepler/IpmiCmds/38
│ └─/bmc/kepler/IpmiCmds/38/13
│ ├─/bmc/kepler/IpmiCmds/38/13/GetNvmeInfo #获取nvme盘信息
│ └─/bmc/kepler/IpmiCmds/38/13/GetNvmeNum #获取nvme盘数量
配置介绍
不涉及