Was ist eine SCSI-Reservierung
Die SCSI-Reservierung ist ein Mechanismus, der es SCSI-Initiatoren ermöglicht, eine LUN für exklusiven Zugriff zu reservieren und andere Initiatoren daran zu hindern, Änderungen vorzunehmen. Das Feature wird normalerweise im Cluster verwendet. Dieser Beitrag erläutert die grundlegende Verwendung der SCSI-Reservierung in CentOS/RHEL-Systemen.
Die SCSI-Reservierung besteht aus zwei Phasen:Zuerst müssen Initiatoren einen Reservierungsschlüssel registrieren und dann das Gerät mit demselben Reservierungsschlüssel weiter reservieren, wenn ein Host exklusiven Zugriff benötigt. Sehen wir uns an, wie wir die SCSI-Reservierung und die notwendigen Funktionen für die SCSI-Reservierung verwenden können.
Installieren Sie die notwendigen Dienstprogramme
Die sg_persist Der Befehl stellt alle notwendigen Funktionen für die SCSI-Reservierung bereit und ist im Paket sg3_utils enthalten .
# yum install sg3_utils
Sehen Sie sich die Registrierung an
Im unten gezeigten Beispiel wurde noch kein Reservierungsschlüssel registriert.
# sg_persist /dev/sdc >> No service action given; assume Persistent Reserve In command >> with Read Keys service action IET VIRTUAL-DISK 0001 Peripheral device type: disk PR generation=0x4, there are NO registered reservation keys
Registrieren Sie einen Reservierungsschlüssel
Der Reservierungsschlüssel muss aus Hex-Strings bestehen und bis zu 8 Bytes lang sein, hier verwenden wir zum Beispiel abc123.
# sg_persist --out --register --param-sark=abc123 /dev/sdc
Die folgende Ausgabe zeigt eine SCSI-LUN, die 2 Reservierungsschlüssel (oder 2 Hosts) registriert hat.
# sg_persist /dev/sdc >> No service action given; assume Persistent Reserve In command >> with Read Keys service action IET VIRTUAL-DISK 0001 Peripheral device type: disk PR generation=0x6, 2 registered reservation keys follow: 0xabc123 0x123abc
Reservieren Sie eine registrierte LUN im Namen eines bestimmten Schlüssels
# sg_persist --out --reserve --param-rk=abc123 --prout-type=3 /dev/sdc IET VIRTUAL-DISK 0001 Peripheral device type: disk
Der –prout-Typ Der Parameter spezifizierte den Reservierungstyp, von der Manpage, gültige Typen einschließlich:
- 1 :Exklusiv schreiben
- 3 :exklusiver Zugriff
- 5 :Exklusiv schreiben – nur für Registranten
- 6 :exklusiver Zugang – nur für registrierte Personen
- 7 :Exklusiv schreiben – alle Registranten
- 8 :exklusiver Zugang – alle Registranten
Reservierung ansehen
Die Ausgabe zeigte an, dass der Server durch den Schlüssel abc123 reserviert wurde, mit Typ 3 (exklusiver Zugriff):
# sg_persist -r /dev/sdc IET VIRTUAL-DISK 0001 Peripheral device type: disk PR generation=0x6, Reservation follows: Key=0xabc123 scope: LU_SCOPE, type: Exclusive Access
Bestätigen Sie die Reservierung
Auf Knoten1, der /dev/sdc1 reserviert hat, konnte er die Festplatte mounten.
# mount /dev/sdc1 /mnt # mount | grep mnt /dev/sdc1 on /mnt type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered) # umount /mnt
In der Zwischenzeit war es nicht möglich, auf denselben Datenträger auf node2
zuzugreifen# mount /dev/sdc1 /mnt mount: mount /dev/sdc1 on /mnt failed: Invalid exchange
Der dmesg zeigt einen Reservierungskonflikt an
# dmesg | tail [6902380.608058] sd 11:0:0:1: [sdc] tag#16 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_OK [6902380.608060] sd 11:0:0:1: [sdc] tag#16 CDB: Read(10) 28 00 00 1f ff 80 00 00 08 00 [6902380.608061] blk_update_request: critical nexus error, dev sdc, sector 2097024 [6902380.608064] Buffer I/O error on dev sdc1, logical block 261872, async page read [6902380.609007] sd 11:0:0:1: reservation conflict [6902380.609011] sd 11:0:0:1: [sdc] tag#14 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_OK [6902380.609013] sd 11:0:0:1: [sdc] tag#14 CDB: Read(10) 28 00 00 00 08 00 00 00 01 00 [6902380.609015] blk_update_request: critical nexus error, dev sdc, sector 2048 [6902380.609523] sd 11:0:0:1: reservation conflict [6902380.609526] blk_update_request: critical nexus error, dev sdc, sector 0
Reservierung freigeben
# sg_persist --out --release --param-rk=abc123 --prout-type=3 /dev/sdc
Einen Reservierungsschlüssel abmelden
# sg_persist --out --register --param-rk=abc123 /dev/sdcLinux-Betriebssystemdienst „scsi_reserve“