iSCSI
Par flo|va-nu-pied le jeudi, 22 juillet 2010, 09:36 - linux - Lien permanent
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