阵列卡工具Perc-CLI排障小记
在Linux可供使用的阵列卡管理工具,以往LSI用的是
megacli
,升级版是strocli
,而针对Dell服务器的是perccli
,它们的用法大差不差,这里通过对一个服务器阵列的在线排障,主要说明perccli
的用法
准备工具
在正式使用前,可以先用lsscsi
来查看系统的SCSI信息,不过要注意这个工具要先安装,不像lspci
和lsblk
这样基本上是自带的
工具我是从戴尔官方支持网站里面下得,百度的话也可能找到很多资源,下载下来得到的可执行文件是perccli64
,下文也会用这个名称作为执行命令
strocli
工具可在联想支持网站下载:
https://datacentersupport.lenovo.com/dk/zc/downloads/DS504232
设备层级
在使用阵列卡工具前,需要先了解整个阵列卡系统的几个单位层级,因为后面在描述设备路径时常常要用到他们的缩写,了解这些全名有助于理解设备层级
- 控制器Controller,缩写
c
,一个阵列卡是一个控制器 - 虚拟磁盘Virtual Drives,即阵列,缩写
v
,就是你在操作系统能看到的磁盘设备 - 盘组Disk group,缩写
d
,描述了一组磁盘,一般情况下一个阵列底层对应一个盘组,主要是在局部热备时会用到 - 背板Enclosure,缩写
e
,就是可供连接到阵列卡上的一排接口背板,如果一个服务器能同时在前后面板都能插硬盘,那么它可能就拥有多个背板,是一个物理单位的概念 - 槽位Slot/PD,缩写
s
,或者说叫物理磁盘,就是实际上插入硬盘的每个硬盘槽,在一个背板上,可以通过槽位编号来定位到实际插在服务器上的每一块硬盘 - 外部配置Foreign configuration,缩写
f
在一个阵列卡控制器下,被分为了虚拟概念和物理概念,因此在查询需要的信息时,需要先明确你要查看了是哪种概念领域的东西
虚拟区域
先用不带设备路径的show来查看阵列卡整体信息
perccli64 show
Number of Controllers = 1
System Overview :
===============
-------------------------------------------------------------------------
Ctl Model Ports PDs DGs DNOpt VDs VNOpt BBU sPR DS EHS ASOs Hlth
-------------------------------------------------------------------------
0 PERCH730Mini 8 6 1 1 1 1 Opt On 3 N 0 NdAtn
-------------------------------------------------------------------------
Ctl=Controller Index|DGs=Drive groups|VDs=Virtual drives|Fld=Failed
PDs=Physical drives|DNOpt=Array NotOptimal|VNOpt=VD NotOptimal|Opt=Optimal
Msng=Missing|Dgd=Degraded|NdAtn=Need Attention|Unkwn=Unknown
sPR=Scheduled Patrol Read|DS=DimmerSwitch|EHS=Emergency Spare Drive
Y=Yes|N=No|ASOs=Advanced Software Options|BBU=Battery backup unit/CV
Hlth=Health|Safe=Safe-mode boot|CertProv-Certificate Provision mode
Chrg=Charging | MsngCbl=Cable Failure
可以看到目前有一个阵列卡控制器,即一张阵列卡,它的编号是0
,同时表格里的属性使用了大量缩写,因此会在下面给出相关的注释,对应着看就行了,从这里我们可以直接看到整个阵列卡的整体信息,便于快速发现问题。从信息可得这个阵列卡有8个物理槽位,目前插了6块盘,共组建了1个卷组和1个阵列,无热备盘,BBU即电池模块正常,但是Hlth下提示NdAtn意味着有需要注意的问题,其中可以发现有1个卷组和1一个阵列目前处于非正常状态,接下来就需要进一步定位问题
定位到0号控制器底下,列出所有的虚拟盘v,即阵列
perccli64 /c0/vall show
Virtual Drives :
==============
--------------------------------------------------------------
DG/VD TYPE State Access Consist Cache Cac sCC Size Name
--------------------------------------------------------------
0/0 RAID5 Dgrd RW Yes RFWBD - OFF 21.830 TB
--------------------------------------------------------------
VD=Virtual Drive| DG=Drive Group|Rec=Recovery
Cac=CacheCade|Rec=Recovery|OfLn=OffLine|Pdgd=Partially Degraded|Dgrd=Degraded
Optl=Optimal|dflt=Default|RO=Read Only|RW=Read Write|HD=Hidden|TRANS=TransportReady
B=Blocked|Consist=Consistent|R=Read Ahead Always|NR=No Read Ahead|WB=WriteBack
FWB=Force WriteBack|WT=WriteThrough|C=Cached IO|D=Direct IO|sCC=Scheduled
Check Consistency
可以看到,0号RAID 5阵列的State已经处于Dgrd状态了,很显然已经到了必须处理的程度,目前它还是可以正常读写的,对于跑在上面的服务来说暂时还没有出现问题,通过show all,我们来获得这个阵列更多的详细信息
perccli64 /c0/v0 show all
它会在底下输出更多关于这个设备的信息
VD0 Properties :
==============
Strip Size = 1.000 MB
Number of Blocks = 46879735808
VD has Emulated PD = Yes
Span Depth = 1
Number of Drives Per Span = 5
Write Cache(initial setting) = WriteBack
Disk Cache Policy = Disk's Default
Encryption = None
Data Protection = Disabled
Active Operations = None
Exposed to OS = Yes
OS Drive Name = /dev/sdb
Creation Date = 02-09-2023
Creation Time = 07:54:57 AM
Emulation type = default
Is LD Ready for OS Requests = Yes
SCSI NAA Id = 61866da06f3fc8002c85a6d103f1a325
Unmap Enabled = N/A
从OS Drive Name可以看到它在操作系统上对应的块设备,定位到相关存储数据的位置后,现在及时将重要数据进行备份,以免在阵列恢复正常前出现意外
与此同时,其实该工具还支持递归查询的能力,同时也帮我们展示了本应在物理区域才能找到的阵列内使用的物理磁盘信息
PDs for VD 0 :
============
----------------------------------------------------------------------------
EID:Slt DID State DG Size Intf Med SED PI SeSz Model Sp Type
----------------------------------------------------------------------------
32:4 4 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:2 2 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:3 3 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:1 1 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:0 0 UBUnsp - 0 KB SAS HDD N N 512B ST6000NM0034 U -
EID=Enclosure Device ID|Slt=Slot No|DID=Device ID|DG=DriveGroup
DHS=Dedicated Hot Spare|UGood=Unconfigured Good|GHS=Global Hotspare
UBad=Unconfigured Bad|Sntze=Sanitize|Onln=Online|Offln=Offline|Intf=Interface
Med=Media Type|SED=Self Encryptive Drive|PI=Protection Info
SeSz=Sector Size|Sp=Spun|U=Up|D=Down|T=Transition|F=Foreign
UGUnsp=UGood Unsupported|UGShld=UGood shielded|HSPShld=Hotspare shielded
CFShld=Configured shielded|Cpybck=CopyBack|CBShld=Copyback Shielded
UBUnsp=UBad Unsupported|Rbld=Rebuild
----------------------------------------------------------------------------
从这里就已经可以看到,有一块盘出问题了,接下来,我们就要找到那个出问题的硬盘,进行更换了
物理区域
物理区域就是实际上插在阵列卡上的硬盘,从控制器往下,分别是背板(就是硬盘笼),和背板下的物理槽位,这个层级不能省略,不然会出现提示找不到对应信息的情况
我们继续回到控制器的层级。因为我们现在要查看不同领域的东西,物理区域控制器往下是相应的背板,因此先列出所有的背板信息
perccli64 /c0/eall show
Properties :
==========
----------------------------------------------------------------------------
EID State Slots PD PS Fans TSs Alms SIM Port# ProdID VendorSpecific
----------------------------------------------------------------------------
32 OK 12 6 0 0 0 0 1 00 & 00 x8 BP13G+EXP
----------------------------------------------------------------------------
EID=Enclosure Device ID | PD=Physical drive count | PS=Power Supply count
TSs=Temperature sensor count | Alms=Alarm count | SIM=SIM Count | ProdID=Product ID
可以看到这个唯一的32号背板,12个插槽,下面插了6块盘,之所以有两倍的端口,是因为SAS连接是双通道的,利用转接线能转接出两个SATA接口出来,继续查看每块盘的信息
perccli64 /call/e32/sall show
Drive Information :
=================
----------------------------------------------------------------------------------------
EID:Slt DID State DG Size Intf Med SED PI SeSz Model Sp Type
----------------------------------------------------------------------------------------
32:0 0 UBUnsp - 0 KB SAS HDD N N 512B ST6000NM0034 U -
32:1 1 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:2 2 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:3 3 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:4 4 Onln 0 5.457 TB SAS HDD N N 512B ST6000NM0034 U -
32:6 6 JBOD - 465.761 GB SATA SSD Y N 512B Samsung SSD 870 EVO 500GB U -
----------------------------------------------------------------------------------------
EID=Enclosure Device ID|Slt=Slot No|DID=Device ID|DG=DriveGroup
DHS=Dedicated Hot Spare|UGood=Unconfigured Good|GHS=Global Hotspare
UBad=Unconfigured Bad|Sntze=Sanitize|Onln=Online|Offln=Offline|Intf=Interface
Med=Media Type|SED=Self Encryptive Drive|PI=Protection Info
SeSz=Sector Size|Sp=Spun|U=Up|D=Down|T=Transition|F=Foreign
UGUnsp=UGood Unsupported|UGShld=UGood shielded|HSPShld=Hotspare shielded
CFShld=Configured shielded|Cpybck=CopyBack|CBShld=Copyback Shielded
UBUnsp=UBad Unsupported|Rbld=Rebuild
其中6号盘是单独用来做系统盘的,不在阵列里面,因此才是JBOD,需要关注的是上面五块盘,其中有一块已经下线了,根据0号位就能找到它在背板上的对应位置
还能进一步查看这个磁盘的信息,由于有问题的硬盘已经拔走,这里用其他正常的硬盘做演示
perccli64 /c0/e32/s1 show all
Drive /c0/e32/s1 - Detailed Information :
=======================================
Drive /c0/e32/s1 State :
======================
Shield Counter = 0
Media Error Count = 0
Other Error Count = 0
Drive Temperature = 24C (75.20 F)
Predictive Failure Count = 0
S.M.A.R.T alert flagged by drive = No
Drive /c0/e32/s1 Device attributes :
==================================
SN = Z4D3L1GE
Manufacturer Id = SEAGATE
Model Number = ST6000NM0034
NAND Vendor = NA
WWN = 5000C50084ACA4F0
Firmware Revision = MS2D
Firmware Release Number = N/A
Raw size = 5.458 TB [0x2baa0f4b0 Sectors]
Coerced size = 5.457 TB [0x2ba900000 Sectors]
Non Coerced size = 5.457 TB [0x2ba90f4b0 Sectors]
Device Speed = 6.0Gb/s
Link Speed = 6.0Gb/s
Write Cache = Disabled
Logical Sector Size = 512B
Physical Sector Size = 4 KB
Connector Name = 00
Drive /c0/e32/s1 Policies/Settings :
==================================
Drive position = DriveGroup:0, Span:0, Row:4
Enclosure position = 1
Connected Port Number = 0(path0)
Sequence Number = 2
Commissioned Spare = No
Emergency Spare = No
Last Predictive Failure Event Sequence Number = 0
Successful diagnostics completion on = N/A
FDE Type = None
SED Capable = No
SED Enabled = No
Secured = No
Cryptographic Erase Capable = No
Sanitize Support = Not supported
Locked = No
Needs EKM Attention = No
PI Eligible = No
Certified = Yes
Wide Port Capable = No
Multipath = No
Port Information :
================
-----------------------------------------
Port Status Linkspeed SAS address
-----------------------------------------
0 Active 6.0Gb/s 0x5000c50084aca4f1
1 Active 6.0Gb/s 0x0
-----------------------------------------
从这一块盘的SAS地址信息可以看到,这个接口其实只使用了其中一个SAS通道
如果这块盘没有发生硬件报警之类的情况,还可以通过手动控制硬盘状态灯的闪烁以便找到这块盘
perccli64 /c0/e32/s1 start[/stop] locate
在确认需要移除的硬盘之后,下线该硬盘,以准备将该硬盘拔出
perccli64 /c0/e32/s0 set offline[/online]
维护
当然光换掉出问题的硬盘是不够的,很多时候发现警告的时候故障已经发生,这时就需要查阅阵列卡的日志来定位故障可能的原因
查阅c0控制器的日志
perccli64 /c0 show termlog
检查c0控制器上的事件记录
perccli64 /c0 show events [file=eventLogs]
通过上面的方式,可以获知硬盘何时发生故障,以及具体故障可能的原因
定时检查并校准电池,有助于在断电意外发生时及时保护,一般会自动按照特定间隔执行
perccli64 /c0/bbu show all
perccli64 /c0/bbu show learn
perccli64 /c0/bbu start learn
在需要时可以给控制器升级固件
perccli /c0 download file=
阵列操作
当然,这个工具不仅仅可以查询阵列信息,还可以在线操作修改阵列
添加一个热备盘,如果需要添加的是局部热备,可以通过指定盘组的方式,当然被添加的盘必须是空闲的,即UGood状态
perccli64 /c0/e32/s3 add[/delete] hotsparedrive [dgs=0]
- 状态为
GHS
是全局热备 - 状态为
DHS
为局部热备
扩容阵列,根据RAID级别的不同,每次扩容需要的硬盘不同,硬盘通过e:s的形式指定
perccli64 /c0/v0 start migrate type=r0[/r1/r5] option=add drives=32:3[,xx:x]
perccli64 /c0/v0 show migrate
移除掉一个阵列,在执行删除操作之前要先将硬盘卸载,如果这个阵列里面还有数据,可能还需要带上强制删除的参数
perccli64 /c0/v0 del [force]
创建阵列
perccli64 /c0 add vd r1[/r0/r5] size=all drives=32:1,32:2
perccli64 /c0/v0 start init [full] // 快速/完全初始化
可选参数有:
RAID
可选r0|r1|r5|r10|r50|r60,具体视阵列卡支持size
可选all或特定大小,不能超过最大值,还支持用多个值以逗号隔开name
为RAID名称drives
为有效的enclosure:slot
组合,可选格式为e:s|e:s-x|e:s-x,y:direct|cached
为IO策略,具体可见下文缓存部分wt|wb
为写策略,具体可见下文缓存部分nora|ra
读策略,具体可见下文缓存部分
RAID缓存相关的语法
perccli64 /cx/vx set wrcache=wt|wb|awb // 写缓存
perccli64 /cx/vx set racache=nora|ra // 读缓存
perccli64 /cx/vx set iopolicy=direct|cached // IO优先级,设置写缓存时需要配置
wt
是关闭缓存wb
在RAID卡没有电池的情况下开启写缓存awb
在RAID卡含有电池的情况下开启写缓存nora
不会读缓存里面内容ra
先读缓存里有的内容
重建,这个过程虽然是在整个阵列执行,但具体操作是针对某块硬盘的,一般情况下不需要手动重建,只要新插入的硬盘能正常加入阵列,就会自动开始重建
perccli64 /c0/e32/s1 start[/stop] rebuild
perccli64 /c0/e32/s1 show rebuild
如果插拔了一块热备盘,可能这个盘会变成UBad状态,需要手动转换
perccli64 /c0/e32/s0 set good
// 如果是UGood -F状态,还需要导入
perccli64 /c0/fall import
如果在多个阵列中混淆了硬盘(一般发生在拔出多个硬盘再重新插回去的情况),因为保留了先前的RAID数据,会导致硬盘DG状态为F(Foreign),可以先删除所有外部配置后恢复
perccli64 /c0/fall delete
附带磁盘状态表
代码 | 含义 | 描述 |
---|---|---|
UGood | Unconfigured Good(未配置正常) | 硬盘状态正常,但还未划分给任何逻辑卷 |
UBad | Unconfigured Bad(未配置异常) | UGood状态的硬盘出现无法恢复的错误 |
Onln | Online(在线) | 已经设置为某个虚拟硬盘的成员盘,并且处于在线正常可用状态 |
Offln | Offline(离线) | 某个虚拟硬盘的成员盘离线 |
Missing | 丢失 | Online状态的硬盘脱离RAID组的状态 |
Rbld | Rebuild(重建) | 硬盘正在重建数据 |