2024年3月29日发(作者:)

何为SCSI锁?

在一个共享存储的环境下,多台主机可能会同时访问同一台存储设备,如果此时多台主机在

同一时点上对一个Lun进行写的操作,那么可想而知这个Lun将不知道哪个数据先写,哪

个数据后写。为了防止这种情况发生而导致的数据损坏,于是就引入了SCSI锁的概念。如

下图中HostA对Lun进行读写时,对Lun加上SCSI锁,此时HostB将无法对该Lun进行

访问。

HostA HostB

/

/

Lun

1. SCSI锁的类型。

通常来讲目前SCSI锁有两种类型:SCSI-2Reservation和SCSI-3 Reservation,这里

SCSI-3Reservation也称之为Persistent Reservation。这两种类型的的锁是不能共存在一

个Lun上的。

SCSI-2 Reservation只允许设备被发出加锁的Initiator访问,这里Initiator一般指HBA。比

如HostA上的fcs0对访问的LUN加上SCSI-2锁,此时即使HostA上的fcs1也无法访问

该Lun。所以SCSI-2 Reservation有时也被称为single-pathreservation。

SCSI-3 Reservation(PersistentReservation)是使用PR Key来对设备进行加锁。通常一

台Host会有唯一的PR Key,不同的host,PRKey也不同。所以一般SCSI-3 Reservation

通常被应用在多通路的共享环境下面。

2. 什么情况下设备会被加锁?

一般设备被打开时将会被加上锁。比如varyonvg、dd等等,需要注意的是对于dd这种命

令当它运行时设备会被加锁,运行完成后会自动解锁。

注意:varyonvg -c不会对设备加锁。

另外,当vg varyon之后,只有varyoffvg或者varyonvg -b才会对vg相关的设备进行解锁。

直接用shutdown命令不会做varyoffvg的动作,因此不会解锁。

3. 处理SCSI-3锁

1) 查看SC_DISK_ERR* orFSCSI_ERR*的sense data.

01 – thisindicates the SCSI status field is valid

18 - SCSI device is reserved by anotherHost

For example:

SENSE DATA

0600 0000 0000 0000 0000 0000 0000 00000000 0000 0000 0000 0118 0000 0000 0000

This is usually seen in an SC_DISK_ERR* orFSCSI_ERR* error (errpt –a output).

2) 处理ESS/DS8000/DS6000上的persistent reservation。

lquerypr -vh /dev/vpathX可以查看persistentreservation。如果有PR的话,返回值将是PR

Key,可与uname -a相比较对应。

lquerypr -ch /dev/vpathX可以用来清除persistentreservation。注意:该命令慎用!!!

在SDDPCM的环境下用pcmquerypr。

3) 处理DS4000上的persistent reservation。

通过SM中Advanced->Maintenance->PersistentReservations查看与清除logical drive的

SCSI-3reservation。

4. 处理SCSI-2锁

有时我们用lquerypr无法看到vpath上有锁,或者SM的persistentreservation输出也显示

无锁,但hdisk/vpath就是无法访问。这时请检查是否有SCSI-2reservation。

注意:以下命令方式不仅限于SCSI-2锁,对SCSI-3锁也适用。

1) DS4000: hlmTestLunShow SSID查看。

hlmTestLunShow 8

LunNumber:0x8 LunInfo :0x6642c5c State:0x0

QuiescenceFlag:0x0 Owner:0x1 IsReady :0x1

reserveId:0xe resv3rdId:0xffff

value = 128 = 0x80

输出中reseveId表示SCSI-2 reservation,resv3rdId表示SCSI-3 reservation。值为0xffff

表示没有锁,0xe表示被hostid为0xe的host占用。

解锁方法:

ü hlmTestRelease reservId,SSID

ü 将Lun从一个控制器切换到另一个控制器

ü 在AIX上 ,使用HACMP的相关命令

/usr/sbin/cluster/events/utils/cl_flutereset /dev/hdiskXX

2) DS6800: catreef "fb/volstatuslss"查看

catreef "fb/volstatus 0x12"

Vol Rsv DA State FB Status Known Format Status

---- ----- ------------------ --------------------- -------------------------

1200 PPRC GOOD Ready formatted

1201 TRAD GOOD Ready formatted