Cos'è la prenotazione SCSI
La prenotazione SCSI è un meccanismo che consente agli iniziatori SCSI di riservare un LUN per l'accesso esclusivo e impedire ad altri iniziatori di apportare modifiche. La funzionalità viene solitamente utilizzata nel cluster. Questo post elabora l'utilizzo di base della prenotazione SCSI nei sistemi CentOS/RHEL.
La prenotazione SCSI prevede due fasi:in primo luogo, gli iniziatori devono registrare una chiave di prenotazione, quindi continuare a prenotare il dispositivo utilizzando la stessa chiave di prenotazione quando un host necessita dell'accesso esclusivo. Vediamo come possiamo utilizzare la prenotazione SCSI e le funzioni necessarie per la prenotazione SCSI.
Installa le utilità necessarie
Il sg_persist fornisce tutte le funzioni necessarie per la prenotazione SCSI, è contenuto nel pacchetto sg3_utils .
# yum install sg3_utils
Visualizza la registrazione
Nell'esempio mostrato di seguito, non è stata ancora registrata alcuna chiave di prenotazione.
# 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
Registra una chiave di prenotazione
La chiave di prenotazione deve essere stringhe esadecimale e lunga fino a 8 byte, qui utilizziamo ad esempio abc123.
# sg_persist --out --register --param-sark=abc123 /dev/sdc
L'output seguente mostra un LUN SCSI con 2 chiavi di prenotazione (o 2 host) registrate.
# 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
Prenota una LUN registrata per conto di una determinata chiave
# sg_persist --out --reserve --param-rk=abc123 --prout-type=3 /dev/sdc IET VIRTUAL-DISK 0001 Peripheral device type: disk
Il -tipo di prout parametro ha specificato il tipo di prenotazione, dalla manpage, tipi validi inclusi:
- 1 :scrivi in esclusiva
- 3 :accesso esclusivo
- 5 :scrivi esclusivo – solo iscritti
- 6 :accesso esclusivo – solo iscritti
- 7 :scrivi in esclusiva – tutti gli iscritti
- 8 :accesso esclusivo – tutti gli iscritti
Visualizza la prenotazione
L'output indicava che il server era riservato dalla chiave abc123, con tipo 3 (accesso esclusivo):
# 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
Verifica la prenotazione
Sul nodo1 che ha /dev/sdc1 riservato, è stato in grado di montare il disco.
# 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
Nel frattempo, non è stato in grado di accedere allo stesso disco su node2
# mount /dev/sdc1 /mnt mount: mount /dev/sdc1 on /mnt failed: Invalid exchange
Il dmesg mostra un conflitto di prenotazione
# 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
Rilascia la prenotazione
# sg_persist --out --release --param-rk=abc123 --prout-type=3 /dev/sdc
Annulla la registrazione di una chiave di prenotazione
# sg_persist --out --register --param-rk=abc123 /dev/sdcServizio del sistema operativo Linux 'scsi_reserve'