RHEL7: configurare un sistema come target o initiator iSCSI

By | Novembre 27, 2018

Nota: questo è un obiettivo d’esame RHCE 7.

Presentazione

Nel mondo iSCSI, hai due tipi di agenti:

una destinazione (target) iSCSI fornisce lo spazio (qui chiamato server),
un iniziatore (initiator) iSCSI chi utilizza questo spazio disponibile (qui chiamato client).

Come hai già intuito, useremo due macchine virtuali, chiamate rispettivamente server e client. Se necessario, il server e le macchine virtuali client possono essere una e una sola macchina.

Configurazione target iSCSI

La maggior parte della configurazione di destinazione viene eseguita in modo interattivo tramite il comando targetcli. Questo comando utilizza un albero di directory per accedere ai diversi oggetti. Per creare una iSCSI target, è necessario seguire diversi passaggi sulla macchina virtuale del server.

Installa i seguenti pacchetti:

# yum install -y targetcli

Attivare il server target all’avvio:

# systemctl enable target

Nota: questo è obbligatorio, altrimenti la configurazione non verrà letta dopo un riavvio!

Esegui il comando targetcli:

# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb34
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/>

Hai due opzioni:

È possibile creare un file backstore denominato shareddata di 100 MB nella directory /opt (non esitare a utilizzare il tab completion):

/> backstores/fileio/ create shareddata /opt/shareddata.img 100M
Created fileio shareddata with size 104857600

Nota: se non si specifica write_back = false alla fine del comando precedente, si assume write_back = true. L’opzione write_back impostata su true abilita la cache del file system locale. Ciò migliora le prestazioni ma aumenta il rischio di perdita di dati. Negli ambienti di produzione, si consiglia di utilizzare write_back = false.

È possibile creare un backstore di blocchi che di solito offre le migliori prestazioni. È possibile utilizzare un dispositivo a blocchi come /dev/sdb o un logical volume precedentemente creato (# lvcreate -name lv_iscsi -size 100M vg):

/> backstores/block/ create block1 /dev/vg/lv_iscsi
Created block storage object block1 using /dev/vg/lv_iscsi.

Quindi, creare un IQN (nome qualificato Iscsi) denominato iqn.2014-08.com.example con un obiettivo denominato t1 e ottenere un TPG associato (Target Portal Group):

/> iscsi/ create iqn.2014-08.com.example:t1
Created target iqn.2014-08.com.example:t1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

Nota: l’IQN segue la convenzione della RFC 3270 (vedi http://en.wikipedia.org/wiki/ISCSI per ottenere maggiori dettagli).

Ora possiamo andare alla directory appena creata:

/> cd iscsi/iqn.2014-08.com.example:t1/tpg1
/iscsi/iqn.20...ample:t1/tpg1> ls
o- tpg1 ................................................. [no-gen-acls, no-auth]
  o- acls ............................................................ [ACLs: 0]
  o- luns ............................................................ [LUNs: 0]
  o- portals ...................................................... [Portals: 1]
    o- 0.0.0.0:3260 ....................................................... [OK]

Sotto tpg1, sono stati definiti tre oggetti:

acl (access control lists: limitare l’accesso alle risorse),
lun (logical unit number: definire le risorse esportate),
portals (definire i modi per raggiungere le risorse esportate, consistono in coppie di indirizzi IP e porte).

Se si utilizza una versione pre-RHEL 7.1 (questo passaggio viene ora eseguito automaticamente dal comando iscsi/create), è necessario creare un portals (una coppia di indirizzo IP e una porta attraverso cui il target può essere contattato dagli initiators):

/iscsi/iqn.20...ple:t1/tpg1> portals/ create
Using default IP port 3260
Binding to INADDR_ANY (0.0.0.0)
Created network portal 0.0.0.0:3260.

Qualunque sia la versione, crea un lun in base al tipo di backstore che hai scelto in precedenza:

Fileio backstore:

/iscsi/iqn.20...ample:t1/tpg1> luns/ create /backstores/fileio/shareddata
 Created LUN 0.

Block

backstore:

/iscsi/iqn.20...ample:t1/tpg1> luns/ create /backstores/block/block1
 Created LUN 0.

Creare un acl con l’IQN precedentemente creato (qui iqn.2014-08.com.example) e un identificatore scelto (qui client), creando insieme il nome dell’iniziatore futuro:

/iscsi/iqn.20...ample:t1/tpg1> acls/ create iqn.2014-08.com.example:client
Created Node ACL for iqn.2014-08.com.example:client
Created mapped LUN 0

Facoltativamente, imposta un ID utente e una password:

/iscsi/iqn.20...ample:t1/tpg1> cd acls/iqn.2014-08.com.example:client/
/iscsi/iqn.20...xample:client> set auth userid=usr
Parameter userid is now 'usr'.
/iscsi/iqn.20...xample:client> set auth password=pwd
Parameter password is now 'pwd'.

Ora, per verificare la configurazione, digitare:

/iscsi/iqn.20...om.example:d1> cd ../..
/iscsi/iqn.20...ple:tgt1/tpg1> ls
o- tpg1 ................................................. [no-gen-acls, no-auth]
  o- acls ............................................................ [ACLs: 1]
  | o- iqn.2014-08.com.example:client ......................... [Mapped LUNs: 1]
  |   o- mapped_lun0 ............................. [lun0 fileio/shareddata (rw)]
  o- luns ............................................................ [LUNs: 1]
  | o- lun0 .......................... [fileio/shareddata (/opt/shareddata.img)]
  o- portals ...................................................... [Portals: 1]
    o- 0.0.0.0:3260 ....................................................... [OK]

Infine, puoi uscire dal comando targetcli:

/iscsi/iqn.20...ple:tgt1/tpg1> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

Nota: la configurazione viene automaticamente salvata nel file /etc/target/saveconfig.json.

Inoltre, può essere utile controllare le porte attualmente utilizzate:

# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN
tcp        0      0 192.168.1.81:22         192.168.1.81:33584      ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 ::1:25                  :::*                    LISTEN

Infine, apri la porta TCP 3260 nella configurazione del firewall:

# firewall-cmd --permanent --add-port=3260/tcp
Success

Nota 1: con RHEL 7.2 (RHBZ # 1150656), esiste ora un file di configurazione firewalld per il servizio iscsi-target. Quindi puoi digitare: #firewall-cmd –permanent –add-service iscsi-target
Nota 2: nel nuovo file di configurazione /usr/lib/firewalld/services/iscsi-target.xml, sono specificate due linee per le porte: TCP 3260 e UDP 3260. Poiché tutto funzionava correttamente fino ad ora con l’argomento TCP 3260, Io suppongo di poter anche eseguire iSCSI su UDP ma non è l’opzione predefinita (non ho trovato alcun dettaglio nella RFC7143 su questo punto).

Ricarica la configurazione del firewall:

# firewall-cmd --reload
Success

iSCSI Initiator

Per creare un iSCSI initiator, è necessario seguire diversi passaggi sulla macchina virtuale del client.

Installa il seguente pacchetto:

# yum install -y iscsi-initiator-utils

Modificare /etc/iscsi/initiatorname.iscsi e sostituire il contenuto con il nome dell’iniziatore precedentemente configurato come acl sul lato di destinazione:

InitiatorName=iqn.2014-08.com.example:client

Se hai precedentemente impostato un ID utente e una password sul server, modifica il file /etc/iscsi/iscsid.conf e incolla le seguenti righe:

node.session.auth.authmethod = CHAP
node.session.auth.username = usr
node.session.auth.password = pwd

Avvia il servizio iscsi:

# systemctl start iscsi

Attenzione: questa azione è obbligatoria per poter smontare la risorsa remota al riavvio. Non confondere i servizi iscsid e iscsi!

Esegui il comando iscsiadm in modalità di ricerca con l’indirizzo IP del server (qui 192.168.1.81):

# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.81
192.168.1.81:3260,1 iqn.2014-08.com.example:t1

Nota 1: se non si specifica alcuna porta, la porta predefinita è 3260.
Nota 2: Non usare una voce DNS come indirizzo del portal (qui 192.168.1.81), poichè sarebbe una cattiva idea e causa un sacco di problemi.

Esegui il comando iscsiadm in modalità nodo con l’indirizzo IP del server (qui 192.168.1.81):

# iscsiadm --mode node --targetname iqn.2014-08.com.example:t1 --portal 192.168.1.81 --login
Logging in to [iface: default, target: iqn.2014-08.com.example:t1, portal: 192.168.1.81,3260] (multiple)
Login to [iface: default, target: iqn.2014-08.com.example:t1, portal: 192.168.1.81,3260] successful.

Nota: come in precedenza, se non si specifica alcuna porta, la porta predefinita è 3260. L’uso della voce DNS come indirizzo del portal porta solo problemi quindi usa l’indirizzo ip.

Per verificare la configurazione, digitare:

# lsblk --scsi
NAME HCTL       TYPE VENDOR   MODEL             REV TRAN
sda  2:0:0:0    disk LIO-ORG  shareddata       4.0  iscsi

Per essere sicuro che la tua risorsa non sia in modalità di sola lettura (1 = modalità di sola lettura), digita:

# lsblk | egrep "NAME|sda"
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0  100M  0 disk

Ora puoi creare un file system:

# mkfs.ext4 /dev/sda
mke2fs 1.42.9 (28-Dec-2013)
/dev/sda is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=4096 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Recupera l’UUID di questo disco:

# blkid | grep "/dev/sda"
/dev/sda: UUID="4a184c70-20ad-4d91-a0b1-c2cf0eb1986f" TYPE="ext4"

Aggiungi l’UUID del disco al file /etc/fstab:

# echo "UUID=..." >> /etc/fstab

Nota: fai molta attenzione a digitare >> e non >, altrimenti questo distruggerà tutta la tua configurazione!
Fai una copia del file /etc/fstab prima di fare questa operazione se non vuoi correre alcun rischio.

Modifica il file /etc/fstab e aggiungi il mount point (qui /mnt), il tipo di file system (qui ext4) e le opzioni di mount (_netdev):

UUID=... /mnt ext4 _netdev 0 0

Nota: l’opzione di montaggio _netdev è obbligatoria per posticipare l’operazione di montaggio dopo l’inizializzazione della rete. Se non lo fai, il processo di avvio dell’iniziatore verrà arrestato dopo un timeout in modalità di manutenzione (ulteriori informazioni sull’opzione _netdev qui).

Per verificare la configurazione, digitare:

# mount /mnt
# touch /mnt/testFile

Nota: è consigliabile eseguire il comando mount -a ogni volta che si modifica qualcosa nel file /etc/fstab per rilevare eventuali problemi di avvio prima che si verifichi.

Facoltativamente, puoi scaricare tutta la configurazione del programma di avvio (3 = max output, 0 = min output):

# iscsiadm -m session -P 3
iSCSI Transport Class version 2.0-870
version 6.2.0.873-28
Target: iqn.2014-08.com.example:t1 (non-flash)
	Current Portal: 192.168.1.81:3260,1
	Persistent Portal: 192.168.1.81:3260,1
		**********
		Interface:
		**********
		Iface Name: default
		Iface Transport: tcp
		Iface Initiatorname: iqn.2014-08.com.example:client
		Iface IPaddress: 192.168.1.10
		Iface HWaddress: 
		Iface Netdev: 
		SID: 1
		iSCSI Connection State: LOGGED IN
		iSCSI Session State: LOGGED_IN
		Internal iscsid Session State: NO CHANGE
		*********
		Timeouts:
		*********
		Recovery Timeout: 120
		Target Reset Timeout: 30
		LUN Reset Timeout: 30
		Abort Timeout: 15
		*****
		CHAP:
		*****
		username: usr
		password: ********
		username_in: 
		password_in: ********
		************************
		Negotiated iSCSI params:
		************************
		HeaderDigest: None
		DataDigest: None
		MaxRecvDataSegmentLength: 262144
		MaxXmitDataSegmentLength: 262144
		FirstBurstLength: 65536
		MaxBurstLength: 262144
		ImmediateData: Yes
		InitialR2T: Yes
		MaxOutstandingR2T: 1
		************************
		Attached SCSI devices:
		************************
		Host Number: 2	State: running
		scsi2 Channel 00 Id 0 Lun: 0
			Attached scsi disk sda		State: running

Fonte: pagina man targetcli e wiki iSCSI Linux.

Consigli utili

Prima di riavviare, configurare una console virtuale, questo può essere utile!

Se è necessario arrestare target e initiator, arrestare prima l’iniziatore. Se si spegne prima il target, l’iniziatore non sarà in grado di smontare la risorsa remota e sarà bloccato nel processo di spegnimento.

Durante l’esame, come ulteriore precauzione, smonta la risorsa remota prima di riavviare l’iniziatore, eviterai brutte sorprese.

One thought on “RHEL7: configurare un sistema come target o initiator iSCSI

  1. Pingback: Obiettivi esame RHCE 7 - prometheusproject

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.