Configurazione di iSCSI con LVM e GFS2
Configurazione di un server iSCSI basato su Ubuntu LTS 10.04 e dei suoi client basati su CentOS 5.6 e Ubuntu LTS 10.04. In ultimo vedremo come creare un file system GFS2 (Global File System 2) su queste partizioni
Premessa
Se siete a corto di budget e non potete permettervi una soluzione di storage basata su fibre channel, allora iSCSI (Internet Small Computer System Interface) potrà fare al caso vostro, una soluzione economica e abbastanza scalabile, in quanto a seconda delle proprie possibilità si potranno avere prestazioni anche di tutto rispetto, basterà dotarsi di un buon controller SCSI, di dischi veloci e di un'interfaccia di rete adeguata come ad esempio una 10Gb.
Architettura utilizzata
Nel seguente esempio andremo ad utilizzare un server iSCSI, detto Target, su Ubuntu LTS 10.04, mentre i nostri client, che nella nomenclatura iSCSI vengono chiamati Initiator, saranno host basati sia su Ubuntu LTS 10.04, che su CentOS/Red Hat Enterprise Linux 5.x. Di seguito un semplice diagramma dell'architettura utilizzata

Dove come potete vedere il nostro server iSCSI (Target) l64ubuntu01, conterrà i dischi di storage magari basata su array scsi e dischi da 10000 o 15000 rpm esportando alle macchine l64centos501, l64centos502 e l64ubuntu02 i comandi scsi su IP.
Di seguito per maggiore chiarezza una tabella riassuntiva delle informazioni di asset contenute in questo howto:
| l64ubuntu01 |
l64ubuntu02 | l64centos501 |
l64centos502 | |
|---|---|---|---|---|
| IP |
192.168.1.100 | 192.168.1.64 | 192.168.1.60 | 192.168.1.62 |
| S.O. |
Ubuntu LTS 10.04 |
Ubuntu LTS 10.04 |
CentOS 5.6 |
CentOS 5.6 |
| Kernel |
2.6.32-31-server | 2.6.32-31-server | 2.6.18-238.9.1.el5 | 2.6.18-238.9.1.el5 |
| Tipologia |
Target | Initiator | Initiator | Initiator |
Preparazione del disco in LVM
Prima di poter esportare lo strato SCSI su IP è opportuno configurare i dischi con LVM in modo che successivamente potremo ridimensionare a piacimento la dimensione stessa dei dischi.
Ipotizzando di avere a disposizione il device a blocchi /dev/sda possiamo procedere inizializzando il disco con LVM
root@l64ubuntu01:~# pvcreate /dev/sda Physical volume "/dev/sda" successfully created
Creazione del volume group ISCSI_VG0 con dimensione di 8Mb per extent
root@l64ubuntu01:~# vgcreate -s 8M ISCSI_VG0 /dev/sda Volume group "ISCSI_VG0" successfully created
Adesso procediamo con il creare due logical volume, uno con il nome GFS_LUN0 di 400Mb che utilizzeremo per creare un file system gfs sulle nostre macchine CentOS 5 ed un'altro LOC_LUN1 da 200Mb che utilizzeremo come file system locale sul nostro initiator ubuntu.
root@l64ubuntu01:~# lvcreate -n GFS_LUN0 -l 50 ISCSI_VG0 Logical volume "GFS_LUN0" created root@l64ubuntu01:~# lvcreate -n LOC_LUN1 -l 25 ISCSI_VG0 Logical volume "LOC_LUN1" created
Installazione e configurazione del Target
Installazione
Iniziamo con l'installazione delle componenti iSCSI Target sulla nostra macchina l64ubuntu01:
root@l64ubuntu01:~# apt-get install iscsitarget
Una volta installato il pacchetto iscsitarget di default questo è disabilitato, e per abilitarlo bisogna porre a "true" la variabile ISCSITARGET_ENABLE nel file /etc/default/iscsitarget. Per fare questo apritelo con l'editor che preferite e sostituite "false" con "true"
Il contenuto del file successivamente corrisponderà a:
root@l64ubuntu01:~# cat /etc/default/iscsitarget ISCSITARGET_ENABLE=true
E si potrà avviare il servizio iscsitarget tramite il comando
root@l64ubuntu01:~# /etc/init.d/iscsitarget start
Configurazione del Target
Ora iniziamo la configurazione del nostro target andando ad editare il file principale che corrisponde a /etc/ietd.conf immettendo la seguente stanza:
Target iqn.2011-04.com.example:gfs.lun0
IncomingUser iscsiuser iscsipassword
OutgoingUser
Lun 0 Path=/dev/ISCSI_VG0/GFS_LUN0,Type=fileio
Alias LUN0
Target iqn.2011-04.com.example:loc.lun1
IncomingUser iscsiuser iscsipassword
OutgoingUser
Lun 0 Path=/dev/ISCSI_VG0/LOC_LUN1,Type=fileio
Alias LUN1
Dove con il Target iqn.2011-04.com.example:gfs.lun0 e iqn.2011-04.com.example:loc.lun1 definiremo il nome univoco con il quale esporteremo la nostra partizione; con IncomingUser deniremo l'utenza "iscsiuser" e la password "iscsipassword" con il quale i client si dovranno autenticare per poter esportare la partizione; in ultimo con la variabile Path definiremo il puntamento ai device LVM creati precedentemente /dev/ISCSI_VG0/GFS_LUN0 e /dev/ISCSI_VG0/LOC_LUN1.
Adesso andiamo a modificare il file /etc/initiators.allow definendo i client che si potranno collegare alla LUN appena create, immettendo le seguenti entry
... iqn.2011-04.com.example:gfs.lun0 192.168.1.60 iqn.2011-04.com.example:gfs.lun0 192.168.1.62 iqn.2011-04.com.example:loc.lun1 192.168.1.64 ...
In ultimo restartiamo il demone iSCSI
root@l64ubuntu01:~# /etc/init.d/iscsitarget restart
Configurazione del primo initiator su CentOS
Installazione
Verifichiamo prima che il software sia installato
[root@l64centos501 ~]# yum install iscsi-initiator-utils
E che il servizio iscsid parta in automatico
[root@l64centos501 ~]# chkconfig --list iscsid iscsid 0:off 1:off 2:off 3:on 4:on 5:on 6:off
Nel caso così non fosse impostare l'avvio automatico del servizio:
[root@l64centos501 ~]# chkconfig iscsid on [root@l64centos501 ~]# service iscsid start
Discovery e login sulla partizione
Per prima cosa effettuiamo il discovery
[root@l64centos501 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.100 --discover 192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1 192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
E procediamo con il configurare l'autenticazione
[root@l64centos501 ~]# iscsiadm -m node
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
[root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --op=update --name node.session.auth.authmethod --value=CHAP
[root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --op=update --name node.session.auth.username --value=iscsiuser
[root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --op=update --name node.session.auth.password --value=iscsipassword
Fatto questo possiamo eseguire la login
root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \ --portal 192.168.1.100 --login Logging in to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260] Login to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260] successful.
E come possiamo vedere nel file speciale /proc/net/iet/session segnalerà la nostra sessione
root@l64ubuntu01:~# cat /proc/net/iet/session
tid:1 name:iqn.2011-04.com.example:gfs.lun0
sid:281474997486080 initiator:iqn.1994-05.com.redhat:831f8bf7e68e
cid:0 ip:192.168.1.60 state:active hd:none dd:none
E sulla nostra macchina client avremo un nuovo device SCSI
[root@l64centos501 ~]# fdisk -l /dev/sda Disk /dev/sda: 419 MB, 419430400 bytes 13 heads, 62 sectors/track, 1016 cylinders Units = cylinders of 806 * 512 = 412672 bytes Disk /dev/sda doesn't contain a valid partition table
Configurazione del secondo initiator su CentOS
Per poter configurare anche sulla seconda macchina CentOS 5 l'aggancio verso la partizione appena creata basterà ripetere i passi precedentemente utilizzati sulla prima, che sono:
[root@l64centos502 ~]# yum install iscsi-initiator-utils
[root@l64centos502 ~]# chkconfig iscsid on
[root@l64centos502 ~]# service iscsid start
[root@l64centos502 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.100 --discover
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
[root@l64centos502 ~]# iscsiadm -m node
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --op=update --name node.session.auth.authmethod --value=CHAP
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --op=update --name node.session.auth.username --value=iscsiuser
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --op=update --name node.session.auth.password --value=iscsipassword
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
--portal 192.168.1.100 --login
Logging in to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260]
Login to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260] successful.
Configurazione del terzo initiator su Ubuntu
Non ci resta che configurare l'initiator sulla terza macchina ubuntu 10.04 e adesso vediamo i passi da seguire.
Installazione
Installiamo il pacchetto open-iscsi
root@l64ubuntu02:~# apt-get install open-iscsi
Di default il servizio viene avviato in automatico verificate che sia così con il comando chkconfig o sysv-rc-conf
root@l64ubuntu02:~# sysv-rc-conf --list open-iscsi open-iscsi 0:on 1:on 6:on S:on root@l64ubuntu02:~# chkconfig -l open-iscsi open-iscsi 0:on 1:on 2:off 3:off 4:off 5:off 6:off S:on
Adesso apriamo il file di configurazione /etc/iscsi/iscsid.conf con qualsiasi editor di testo e modifichiamo il valore della variabile node.startup da "manual" a "automatic" in modo che le sessioni iSCSI vengano avviate automaticamente. Il file conterrà la seguente valorizzazione:
... node.startup = automatic ...
In ultimo riavviamo il demone per fargli caricare la nuova configurazione
root@l64ubuntu02:~# /etc/init.d/open-iscsi restart
Discovery e login sulla partizione
Adesso è arrivato il momento di effettuare il discovery della partizione appena "locale"
root@l64ubuntu02:~# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.100 192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0 192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
Impostiamo i parametri di autenticazione
root@l64ubuntu02:~# iscsiadm -m node
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
--portal 192.168.1.100 --op=update --name node.session.auth.authmethod --value=CHAP
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
--portal 192.168.1.100 --op=update --name node.session.auth.username --value=iscsiuser
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
--portal 192.168.1.100 --op=update --name node.session.auth.password --value=iscsipassword
Ed in ultimo eseguiamo la login
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
--portal 192.168.1.100 --login
Logging in to [iface: default, target: iqn.2011-04.com.example:loc.lun1, portal: 192.168.1.100,3260]
Login to [iface: default, target: iqn.2011-04.com.example:loc.lun1, portal: 192.168.1.100,3260]: successful
Creazione del file system locale su l64ubuntu02
Di seguito i passi necessari per creare una partizione primaria con fdisk e poi un file system ext4
root@l64ubuntu02:~# fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x408a6f13.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p
Disk /dev/sda: 209 MB, 209715200 bytes
7 heads, 58 sectors/track, 1008 cylinders
Units = cylinders of 406 * 512 = 207872 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x408a6f13
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1008, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1008, default 1008):
Using default value 1008
Command (m for help): p
Disk /dev/sda: 209 MB, 209715200 bytes
7 heads, 58 sectors/track, 1008 cylinders
Units = cylinders of 406 * 512 = 207872 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x408a6f13
Device Boot Start End Blocks Id System
/dev/sda1 1 1008 204595 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
Ora non ci resta che creare il file system ext4 su /dev/sda1
root@l64ubuntu02:~# mkfs.ext4 -m 1 /dev/sda1
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204592 blocks
2045 blocks (1.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Non ci resta che procedere a con il montare la partizione appena creata ed utilizzarla
root@l64ubuntu02:~# mkdir /mnt/app1 root@l64ubuntu02:~# mount /dev/sda1 /mnt/app1
Creazione della partizione GFS2
Adesso procediamo con la parte più interessante ovvero con la creazione della partizione GFS2 in modo da poterla montare contemporaneamente sulle due macchine l64centos501 e l64centos502.
Installazione dei pacchetti necessari
Il Global File System sui sistemi Red Hat o derivati come CentOS fa parte della Red Hat Cluster Suite, pertanto per poterlo utilizzare andremo ad installare il gruppo di pacchetti Clustering e Cluster Storage.
Su l64centos501
[root@l64centos501 ~]# yum groupinstall Clustering [root@l64centos501 ~]# yum groupinstall 'Cluster Storage'
Su l64centos502
[root@l64centos502 ~]# yum groupinstall Clustering [root@l64centos502 ~]# yum groupinstall 'Cluster Storage'
Preparazione del disco con LVM
Adesso prepariamo anche sull'initiator la partizione LVM sul quale immettere il file system GFS2, attività da effettuare soltanto su un nodo
[root@l64centos501 ~]# pvcreate /dev/sda Physical volume "/dev/sda" successfully created [root@l64centos501 ~]# vgcreate -s 8M GFS2_VG0 /dev/sda Volume group "GFS2_VG0" successfully created [root@l64centos501 ~]# lvcreate -l 49 -n GFS2_LV01 GFS2_VG0 Logical volume "GFS2_LV01" created
Preparazione di un finto cluster
Essendo il file system GFS dipendente dalla clusterizzazione risulta mandatorio startare il servizio cman di clusterizzazione e per fare questo dobbiamo costruirci il file di configurazione /etc/cluster/cluster.conf dove metteremo i nodi l64centos501 e l64centos502.
Per prima cosa andiamo ad inserire nel file /etc/hosts le relative corrispondenze, queste devono essere immesse su tutti e i due nodi del cluster in modo tale che riescano a risolvere reciprocamente l'hostname in IP
... 192.168.1.60 l64centos501.example.com l64centos501 192.168.1.62 l64centos502.example.com l64centos502 ...
Successivamente potete andare a costruire il file di configurazione del cluster tramite il tool system-config-cluster definendo soltanto i nodi interessati che sono l64centos501 e l64centos502, oppure copiare il seguente file cluster.conf nella directory /etc/cluster
[root@l64centos501 ~]# cat /etc/cluster/cluster.conf
<?xml version="1.0" ?>
<cluster alias="CLUGFS" config_version="2" name="CLUGFS">
<fence_daemon post_fail_delay="0" post_join_delay="3"/>
<clusternodes>
<clusternode name="l64centos501" nodeid="1" votes="1">
<fence>
<method name="1">
<device name="fence-manual" nodename="l64centos501"/>
</method>
</fence>
</clusternode>
<clusternode name="l64centos502" nodeid="2" votes="1">
<fence>
<method name="1">
<device name="fence-manual" nodename="l64centos502"/>
</method>
</fence>
</clusternode>
</clusternodes>
<cman expected_votes="1" two_node="1"/>
<fencedevices>
<fencedevice agent="fence_manual" name="fence-manual"/>
</fencedevices>
<rm>
<failoverdomains/>
<resources/>
</rm>
</cluster>
Successivamente trasferite lo stesso file sul secondo nodo l64centos02 ed una volta fatto questo avviare il servizio cman contemporaneamente sui due nodi
Su l64centos501
[root@l64centos501 ~]# service cman start
Su l64centos502
[root@l64centos502 ~]# service cman start
Creazione del file system GFS2
Non ci resta che creare il file system GFS2 e montarlo. Iniziamo con il crearlo con due journaling
[root@l64centos501 ~]# mkfs.gfs2 -p lock_dlm -j 2 -t CLUGFS:gfsdata1 /dev/GFS2_VG0/GFS2_LV01 This will destroy any data on /dev/GFS2_VG0/GFS2_LV01. It appears to contain a gfs2 filesystem. Are you sure you want to proceed? [y/n] y Device: /dev/GFS2_VG0/GFS2_LV01 Blocksize: 4096 Device Size 0.38 GB (100352 blocks) Filesystem Size: 0.38 GB (100349 blocks) Journals: 2 Resource Groups: 2 Locking Protocol: "lock_dlm" Lock Table: "CLUGFS:gfsdata1" UUID: B30FC4D3-1CDA-899C-FB04-E5F43EC7A204
Una volta creato ci sarà possibile montarlo.
Su l64centos501
[root@l64centos501 ~]# mkdir -p /gfs01 [root@l64centos501 ~]# mount /dev/GFS2_VG0/GFS2_LV01 /gfs01
Su l64centos502 sarà necessario effettuare uno scan dell'LVM ed eventualmente se la partizione fosse marcata come inattiva renderla available
[root@l64centos502 ~]# lvscan ... inactive '/dev/GFS2_VG0/GFS2_LV01' [392.00 MB] inherit [root@l64centos502 ~]# lvchange -a y /dev/GFS2_VG0/GFS2_LV01 [root@l64centos502 ~]# mkdir -p /gfs01 [root@l64centos502 ~]# mount /dev/GFS2_VG0/GFS2_LV01 /gfs01
Ora provate a creare un file su un nodo e verificare che anche sul secondo si veda
[root@l64centos501 ~]# echo "Hello world! by $(hostname)" > /gfs01/foo.log
Dal secondo nodo
[root@l64centos502 ~]# echo "Hello world! by $(hostname)" >> /gfs01/foo.log
Verificate adesso il contenuto del file
[root@l64centos502 ~]# cat /gfs01/foo.log Hello world! by l64centos501.example.com Hello world! by l64centos502.example.com
Mount automatico delle partizioni appena create
Vediamo come montare in automatico le partizioni appena create.
Lun Locale con file system dedicato
Il caso più semplice riguarda la macchina l64ubuntu02 che utilizza un device di storage dedicato, pertanto per poter montare la nostra partizione basterà inserire un puntamento nel file /etc/fstab allo special device /dev/sda1 oppure meglio ancora lo faremo puntare al suo UUID in modo tale che se varierà l'ordine di scansione degli special device non dovremo editare nuovamente il file /etc/fstab. Iniziamo a ricavarci l'UUID con il comando blkid:
root@l64ubuntu02:~# blkid ... /dev/sda1: UUID="9e9a69ca-65ba-4211-a45e-949b66b7aed6" TYPE="ext4" ...
Con questo valore possiamo andare ad editare il file /etc/fstab immettendo una entry di questo genere:
... UUID="9e9a69ca-65ba-4211-a45e-949b66b7aed6" /mnt/app1 ext4 defaults,_netdev 0 0 ...
Si sconsiglia di porre nel predetto file il file system check abilitato, ma di lasciarlo a zero ed effettuare l'eventuale check manualmente.
Partizione GFS2 con LUN shared
Nel caso del Global File System il discorso è leggermente diverso infatti bisognerà abilitare il servizio cman ed gfs2
Su l64centos501
[root@l64centos501 ~]# chkconfig cman on [root@l64centos501 ~]# chkconfig gfs2 on
Su l64centos502
[root@l64centos502 ~]# chkconfig cman on [root@l64centos502 ~]# chkconfig gfs2 on
Adesso basta configurare il file /etc/hosts su ambo i nodi mettendo la seguente entry
... /dev/GFS2_VG0/GFS2_LV01 /gfs01 gfs2 defaults,_netdev 0 0 ...
Anche qui il consiglio è impostare il file system check a zero (0).
Conclusioni
Abbiamo visto come configurare un iSCSI target e tre initiator basati su Red Hat/CentOS e Ubuntu. In aggiunta abbiamo anche visto come creare un file system shared basato su GFS2 e prossimamente vedremo come aggiungere un journaling per poter aggiungere un nuovo nodo ed anche come ingrandire i file system GFS. Mentre se siete interessati a vedere come estendere o diminuire la partizione ext4 appena creata potete leggere qui.
