iSCSI

Au cours de cet article nous allons voir comment mettre en œuvre iSCSI. Ce protocole permet la publication de périphériques à travers un réseau IP. L'objet est ici de publier à travers le réseau des volumes qui seront ensuite utilisés comme espace de stockage. La distribution utilisée est ici une Gentoo, il sera donc éventuellement nécessaire d'adapter quelques points si vous utilisez une distribution différente.

ajout du support iSCSI au noyau

routeur linux # grep '#*ISCSI*' .config                                                                                                                          04/06/10 10:22:55
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_ISCSI_TCP=m

NOTE : si vous ne compilez pas ISCSI_TCP en modules vous aurez le droit à ce joli petit message

 * ERROR: sys-block/open-iscsi-2.0.871.3 failed:
 *   ISCSI_TCP needs to be built as module (builtin doesn't work)

s'en suivent les classiques :

routeur linux # make && make modules_install

on installe ensuite open-iscsi

routeur linux # emerge open-iscsi

afin de charger les modules nécessaires on va lancer une premières fois le service (qui va tomber en erreur du fait qu'il ne trouvera d'entrées.

routeur linux # /etc/init.d/iscsid start                                                                                                              
 * Caching service dependencies ...
1                                                                                                       [ ok ]
 * Checking open-iSCSI configuration ...
 * Loading iSCSI modules ...
 * Loading libiscsi ...                                                                            [ ok ]
 * Loading scsi_transport_iscsi ...                                                          [ ok ]
 * Loading iscsi_tcp ...                                                                          [ ok ]
 * Starting iscsid ...
 * Setting up iSCSI targets ...
iscsiadm: No records found!                                                                  [ !! ]
 * ERROR: iscsid failed to start
routeur linux #

voila nous pouvons a présent mettre en œuvre la configuration du client iSCSI

on déclare une nouvelle interface reseau dans iscsi : Pour l'interface netshare

localhost ~ # iscsiadm -m iface -I netshare --op=new

On liste ensuite les nodes disponibles sur cette interface

localhost ~ # iscsiadm --mode discovery --type sendtargets --portal 192.168.10.254
192.168.10.254:3260,1 iqn.2000-01.com.tools-fm:DS1010p.www
192.168.10.254:3260,1 iqn.2000-01.com.synology:DS1010p.name1

on indique ensuite le node que l'on souhaite monter automatiquement au lancement du iscsi initiator

localhost ~ # iscsiadm -m node -T iqn.2000-01.com.synology:DS1010p.name1 -p 192.168.10.254 -I netshare -o update -n node.startup -v automatic

On relance ensuite le deamon pour verifier

localhost ~ # /etc/init.d/iscsid restart
 * Disconnecting iSCSI targets ...                                                     [ ok ]
 * Stopping iscsid ...                                                                       [ ok ]
 * Removing iSCSI modules iscsi_tcp ...                                            [ ok ]
 * Removing iSCSI modules scsi_transport_iscsi ...                             [ ok ]
 * Removing iSCSI modules libiscsi ...                                               [ ok ]
 * Checking open-iSCSI configuration ...
 * Loading iSCSI modules ...
 * Loading libiscsi ...                                                                        [ ok ]
 * Loading scsi_transport_iscsi ...                                                      [ ok ]
 * Loading iscsi_tcp ...                                                                      [ ok ]
 * Starting iscsid ...
 * Setting up iSCSI targets ...
Logging in to [iface: netshare, target: iqn.2000-01.com.synology:DS1010p.name1, portal: 192.168.10.254,3260]
Login to [iface: netshare, target: iqn.2000-01.com.synology:DS1010p.name1, portal: 192.168.10.254,3260]: successful                                                 [ ok ]
localhost ~ #

Un petit tour dans les logs nous montre que l'opération s'est correctement effectuée

localhost ~ # tail -f /var/log/messages
Jun  3 09:38:05 localhost iscsid: iSCSI logger with pid=9983 started!
Jun  3 09:38:05 localhost kernel: [ 4755.296980] scsi7 : iSCSI Initiator over TCP/IP
Jun  3 09:38:06 localhost kernel: [ 4755.564589] scsi 7:0:0:0: Direct-Access     IET      VIRTUAL-DISK     0    PQ: 0 ANSI: 4
Jun  3 09:38:06 localhost kernel: [ 4755.564768] sd 7:0:0:0: Attached scsi generic sg3 type 0
Jun  3 09:38:06 localhost kernel: [ 4755.569880] sd 7:0:0:0: [sdd] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
Jun  3 09:38:06 localhost kernel: [ 4755.571255] sd 7:0:0:0: [sdd] Write Protect is off
Jun  3 09:38:06 localhost kernel: [ 4755.571258] sd 7:0:0:0: [sdd] Mode Sense: 77 00 00 08
Jun  3 09:38:06 localhost kernel: [ 4755.575233] sd 7:0:0:0: [sdd] Write cache: enabled, read cache: enabled, doesn t support DPO or FUA
Jun  3 09:38:06 localhost kernel: [ 4755.582144]  sdd: sdd1
Jun  3 09:38:06 localhost kernel: [ 4755.593632] sd 7:0:0:0: [sdd] Attached SCSI disk
Jun  3 09:38:06 localhost iscsid: transport class version 2.0-870. iscsid version 2.0-871
Jun  3 09:38:06 localhost iscsid: iSCSI daemon with pid=9984 started!
Jun  3 09:38:06 localhost iscsid: send fail Connection reset by peer
Jun  3 09:38:06 localhost iscsid: connection1:0 is operational now

Dans le cas d'un resize à chaud de la cible iSCSI il suffit coté client de simplement relancer le service iSCSI pour le que la mise a jour de la taille du volume soit prise en compte:

localhost ~ # fdisk -l /dev/sdd
Disque /dev/sdd: 32.2 Go, 32212254720 octets
localhost ~ # /etc/init.d/iscsid restart
 * Disconnecting iSCSI targets ...
Logging out of session [sid: 1, target: iqn.2000-01.com.synology:DS1010p.name1, portal: 192.168.10.254,3260]
Logout of [sid: 1, target: iqn.2000-01.com.synology:DS1010p.name1, portal: 192.168.10.254,3260]: successful
[...]
Logging in to [iface: netshare, target: iqn.2000-01.com.synology:DS1010p.name1, portal: 192.168.10.254,3260]
Login to [iface: netshare, target: iqn.2000-01.com.synology:DS1010p.name1, portal: 192.168.10.254,3260]: successful               [ ok ]
localhost ~ # fdisk -l /dev/sdd
Disque /dev/sdd: 32.2 Go, 32212254720 octets

Et voila le travail :)

Petite touche en plus à présent pour ajouter la prise en charge de CHAP

localhost ~ # iscsiadm -m node -T iqn.2000-01.com.synology:DS1010p.name1 -p 192.168.10.254 -I netshare -o update -n node.session.auth.authmethod -v CHAP
localhost ~ # iscsiadm -m node -T iqn.2000-01.com.synology:DS1010p.name1 -p 192.168.10.254 -I netshare -o update -n node.session.auth.username -v monuser
localhost ~ # iscsiadm -m node -T iqn.2000-01.com.synology:DS1010p.name1 -p 192.168.10.254 -I netshare -o update -n node.session.auth.password -v monmotdepassedefou

Il suffit également de relancer le service pour que les modifications soient prises en charge. Il faut aussi noter que toutes les inforamtions de configuration d'un node sont stockées dans un fichier à plat disponible au chemin suivant pour mon exemple: /etc/iscsi/nodes/iqn.2000-01.com.synology\:DS1010p.name1/192.168.10.254\,3260\,1/netshare

J'ai rencontré un petit souci avec le script d'arret du service. En effet ce dernier ne vérifie pas que le volume est actuellement utilisé avant de le démonter. C'est ainsi que je me retrouvais des fois avec un retour de ce genre :

routeur ~ # /etc/init.d/iscsid stop                                                              12/07/10 03:21:41
 * Caching service dependencies ...
1                                                                                                            [ ok ]
 * Disconnecting iSCSI targets ...
Logging out of session [sid: 1, target: iqn.2000-01.com.synology:DS1010p.www, portal: 192.168.10.254,3260]
iscsiadm: can not connect to iSCSI daemon (111)!
iscsiadm: initiator reported error (20 - could not connect to iscsid)                                        [ !! ]
 * Stopping iscsid ...                                                                                       [ ok ]
 * Removing iSCSI modules iscsi_tcp ...
FATAL: Module iscsi_tcp is in use.                                                                           [ !! ]
 * ERROR: iscsid failed to stop

J'ai donc ajouté une section à cet effet dans le script de gestion du service qui démonte le volume avant d'arrêter le service iSCSI: Dans le fichier /etc/init.d/iscsid ajouter la section suivante afin de bien démonter un volume avant d'arrêter sa publication:

umounttagerts() {
        ebegin "Umounting iSCSI targets actualy mounted"
        mounted_device=$(find /dev/disk/by-path/ -name "ip*" -printf '%l' | cut -d'/' -f3)
        if [[ ! -z "$mounted_device" ]];
        then
                for device in $mounted_device;
                        do
                        if [[ ! -z $(mount | grep $device) ]];
                        then
                                umount /dev/$device
                                ret=$?
                                if  [ $ret -ne 0 ];
                                then
                                        ebegin "Device /dev/$device is busy"
                                        eend 1
                                        return 1
                                fi
                        fi
                done
        fi
}

j'ai pour ma part inséré cette fonction juste en dessous de la fonction starttargets()

j'ai ensuite édité la fonction stop comme ceci pour qu'elle exploite mon ajout.

stop() {
        umounttagerts
        ret=$?
        if [ $ret -ne 0 ]; then
        exit 1
        fi
        stoptargets
        ebegin "Stopping ${SVCNAME}"
        start-stop-daemon --signal HUP --stop --quiet --exec /usr/sbin/iscsid #--pidfile $PID_FILE
        eend $?
...
}

voici les différents états du script:

routeur web # /etc/init.d/iscsid stop                                                            12/07/10 03:43:49
 * Caching service dependencies ...
1                                                                                                            [ ok ]
 * Umounting iSCSI targets actualy mounted ...
démontage : /mnt/web: périphérique occupé.
       (Dans certains cas, des infos sur les processus l utilisant
        sont récupérables par lsof(8) ou fuser(1))
 * Device /dev/sda is busy ...                                                                               [ !! ]
 * ERROR: iscsid failed to stop

routeur ~ # /etc/init.d/iscsid stop                                                              12/07/10 03:44:23
 * Umounting iSCSI targets actualy mounted ...
 * Disconnecting iSCSI targets ...
Logging out of session [sid: 1, target: iqn.2000-01.com.synology:DS1010p.www, portal: 192.168.10.254,3260]
Logout of [sid: 1, target: iqn.2000-01.com.synology:DS1010p.www, portal: 192.168.10.254,3260]: successful    [ ok ]
 * Stopping iscsid ...                                                                                       [ ok ]
 * Removing iSCSI modules iscsi_tcp ...                                                                      [ ok ]
 * Removing iSCSI modules scsi_transport_iscsi ...                                                           [ ok ]
 * Removing iSCSI modules libiscsi ...                                                                       [ ok ]

exemple d'application monter via iSCSI /var/portage sur plusieurs serveurs :

il faut utiliser un système de fichier supportant le mode d'accès multiple: http://en.wikipedia.org/wiki/Clustered_file_system Et prendre soin d'activer l'accès multiple a la publication du node iSCSI

la mise a jour de portage est effectuée par un seul des clients iSCSI en effectuant la commande eix-sync

les autres clients effectuent ensuite un simple emerge --metadata

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

La discussion continue ailleurs

URL de rétrolien : http://blog.tools-fm.com/index.php?trackback/99

Fil des commentaires de ce billet