# Howto iSCSI Vocabulaire : l'initiator est le client iSCSI, le target est le serveur iSCSI. ## Installation d'un initiator Sous Debian, l'utilitaire pour avoir un initiator iSCSI est fourni avec le paquet _open-iscsi_. ~~~ # apt install open-iscsi ~~~ S'assurer que _iscsid_ est bien démarré : ~~~ # systemctl status open-iscsi ~~~ A l'installation, l'IQN de l'initiator est généré, on peut le trouver dans */etc/iscsi/initiatorname.iscsi* ~~~ # cat /etc/iscsi/initiatorname.iscsi ## DO NOT EDIT OR REMOVE THIS FILE! ## If you remove this file, the iSCSI daemon will not start. ## If you change the InitiatorName, existing access control lists ## may reject this initiator. The InitiatorName must be unique ## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames. InitiatorName=iqn.1993-08.org.debian:01:bf80c8fe52 ~~~ Scanner les devices disponibles : ~~~ # iscsiadm -m discovery -t sendtargets -p IP_ADDRESS ~~~ ### Configuration simple Une configuration simple est lorsque vous avez une liaison iSCSI via une seule interface Ethernet. Exemple pour attacher le device iSCSI : ~~~ # iscsiadm --mode node --targetname iqn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS:3260 --login Logging in to [iface: default, target: iqn.2002-10.com.infortrend:raid.sn8128457.001, portal: IP_ADDRESS,3260] Login to [iface: default, target: iqn.2002-10.com.infortrend:raid.sn8128457.001, portal: IP_ADDRESS,3260]: successful ~~~ Un dmesg nous confirme que le device iSCSI est attaché : ~~~ [589633.268035] Loading iSCSI transport class v2.0-870. [589634.206569] iscsi: registered transport (tcp) [589634.533062] iscsi: registered transport (iser) [590317.751042] scsi2 : iSCSI Initiator over TCP/IP [590318.406292] scsi 2:0:0:0: Direct-Access IFT DS S12E-G2140-4 386C PQ: 0 ANSI: 5 [590318.500371] scsi 2:0:0:0: Attached scsi generic sg1 type 0 [590318.502537] scsi 2:0:0:1: Enclosure IFT DS S12E-G2140-4 386C PQ: 0 ANSI: 4 [590318.502613] scsi 2:0:0:1: Attached scsi generic sg2 type 13 [590318.568943] sd 2:0:0:0: [sda] 19528073216 512-byte logical blocks: (9.99 TB/9.09 TiB) [590318.598211] sd 2:0:0:0: [sda] Write Protect is off [590318.598214] sd 2:0:0:0: [sda] Mode Sense: 83 00 00 08 [590318.599120] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [590318.664632] sda: unknown partition table [590318.703094] sd 2:0:0:0: [sda] Attached SCSI disk [590318.725349] ses 2:0:0:1: Attached Enclosure device ~~~ ### Gestion des volumes Pour lister les sessions iSCSI ouvertes : ~~~ # iscsiadm -m session ~~~ Pour se déconnecter proprement d'un target (après avoir démonté les disques) : ~~~ # iscsiadm -m node -u ~~~ Pour déconnecter un seul LUN d'un target : ~~~ # iscsiadm -m node -T [iqn du LUN] --logout ~~~ ## Montage au démarrage Une fois la configuration testée et validée, il est souhaitable que les volumes iSCSI soient montés automatiquement au démarrage du serveur. ### Connexion aux LUNs Lorsqu'on lance la détection des volumes d'un target, ou que l'on se connecte à ce dernier, la commande _iscsiadm_ créée des fichiers de configuration dans /etc/iscsi/nodes et /etc/iscsi/send_targets. Ces fichiers sont relativement simples à comprendre, mais une option nous intéresse plus particulièrement : Dans le répertoire /etc/iscsi/nodes sont stockés les nodes auxquels nous nous sommes déjà connecté sous la forme : ~~~ [iqn]/[ip],[port],1/default ~~~ Par exemple, pour un SAN MD3600i en multipath nous avons : ~~~ # ls -l /etc/iscsi/nodes/iqn.1984-05.com.dell\:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx/ drw------- 2 root root 4096 Oct 26 2011 192.0.2.101,3260,1 drw------- 2 root root 4096 Oct 26 2011 192.0.2.102,3260,1 ~~~ Pour se connecter automatiquement aux LUNs au démarrage du serveur, il faut modifier la directive "node.startup" en la passant de "manual" à "automatic" : ~~~ # cat /etc/iscsi/nodes/iqn.1984-05.com.dell\:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx/192.0.2.101\,3260\,1 node.name = iqn.1984-05.com.dell:powervault.md3600i.36782bcb00050034200000xxxxxxxxxx node.tpgt = 1 node.startup = automatic iface.iscsi_ifacename = default iface.transport_name = tcp node.discovery_address = 192.0.2.101 node.discovery_port = 3260 node.discovery_type = send_targets [...] ~~~ ### /etc/fstab Lorsque les partition d'un device iSCSI sont ajoutées au fichier fstab, ne pas oublier l'option "netdev": elle permet non seulement d'attendre que le réseau soit actif avant de chercher à monter la partition (pour ne pas bloquer le démarrage du serveur, ce serait dommage...) mais aussi de démonter la/les partitions à l'extinction de la machine avant de couper le réseau afin d'éviter toute corruption du filesystem (encore une fois, ce serait dommage). ~~~ /dev/mapper/data /home ext3 _netdev,defaults,noexec,nosuid,nodev 0 0 ~~~ ### Configuration avec deux interfaces et deux liaisons indépendantes vers un target Vous configurez vos 2 interfaces sur une plage réseau différente. Vous pouvez ainsi scanner le target sur 2 IPs complètement distinctes : ~~~ # iscsiadm -m discovery -t sendtargets -p IP_ADDRESS1 # iscsiadm -m discovery -t sendtargets -p IP_ADDRESS2 ~~~ Puis attacher les devices deux fois indépendamment : ~~~ # iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS1:3260 --login # iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS2:3260 --login ~~~ Vous pouvez ainsi accéder au target via plusieurs devices ! Pour gérer du multipath, voir ci-dessous. ### Configuration avec deux interfaces et liaison unique vers un target Si vous êtes connectés avec d'autres initiator iSCSI (c'est souvent le cas), vous serez sûrement connectés sur un switch dédié au iSCSI. Le target qui a en général plusieurs interfaces Ethernet aura probablement des adresses IP sur la même plage. Vous allez donc configurer vos deux interfaces avec des IPs sur la même plage : ~~~ # ifconfig eth2 192.0.2.200/24 # ifconfig eth3 192.0.2.201/24 ~~~ Il faut alors créer des interfaces iSCSI pour chaque carte réseau : ~~~ # iscsiadm --mode iface --op=new --interface iscsi-0 New interface iscsi-0 added # iscsiadm --mode iface --op=new --interface iscsi-1 New interface iscsi-1 added # iscsiadm --mode iface --op=update --interface iscsi-0 --name=iface.net_ifacename --value=eth2 iscsi-0 updated. # iscsiadm --mode iface --op=update --interface iscsi-1 --name=iface.net_ifacename --value=eth3 iscsi-1 updated. # iscsiadm --mode iface default tcp,,,, iser iser,,,, iscsi-0 tcp,,,eth2, iscsi-1 tcp,,,eth3, # iscsiadm --mode iface --interface iscsi-0 # BEGIN RECORD 2.0-871 iface.iscsi_ifacename = iscsi-0 iface.net_ifacename = eth2 iface.ipaddress = iface.hwaddress = iface.transport_name = tcp iface.initiatorname = # END RECORD # iscsiadm --mode iface --interface iscsi-1 # BEGIN RECORD 2.0-871 iface.iscsi_ifacename = iscsi-1 iface.net_ifacename = eth3 iface.ipaddress = iface.hwaddress = iface.transport_name = tcp iface.initiatorname = # END RECORD ~~~ Puis attacher les devices deux fois via chaque interface iSCSI : ~~~ # iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS:3260 -I iscsi-0--login # iscsiadm --mode node --targetname qn.2002-10.com.infortrend:raid.sn8128457.001 --portal IP_ADDRESS:3260 -I iscsi-1 --login ~~~ On obtient donc plusieurs périphériques identiques. Pour gérer du multipath, voir ci-dessous. ## Multipath Lorsque l'on a plusieurs paths vers un device (voir ci-dessus), l'idée est de profiter de cela pour avoir une tolérance de panne et une agrégation des débits. ### Utilisation du multipath ~~~ # apt install multipath-tools modprobe dm_multipath ~~~ On peut voir les différents chemins pour accèder à un même périphérique : ~~~ # multipath -ll 3600d0231000b3f9e55030d29266ffe95 dm-2 IFT,DS S12E-G2140-4 size=1.8T features='0' hwhandler='0' wp=rw |-+- policy='round-robin 0' prio=1 status=active | `- 7:0:0:0 sdd 8:48 active ready running `-+- policy='round-robin 0' prio=1 status=enabled `- 8:0:0:0 sdg 8:96 active ready running 3600d0231000b3f9e6075561c390db5ce dm-4 IFT,DS S12E-G2140-4 size=836G features='0' hwhandler='0' wp=rw |-+- policy='round-robin 0' prio=1 status=active | `- 7:0:0:2 sdf 8:80 active ready running `-+- policy='round-robin 0' prio=1 status=enabled `- 8:0:0:2 sdi 8:128 active ready running 3600d0231000b3f9e68e8e32f513c36b5 dm-3 IFT,DS S12E-G2140-4 size=3.6T features='0' hwhandler='0' wp=rw |-+- policy='round-robin 0' prio=1 status=active | `- 7:0:0:1 sde 8:64 active ready running `-+- policy='round-robin 0' prio=1 status=enabled `- 8:0:0:1 sdh 8:112 active ready running ~~~ On doit ensuite configurer _multipathd_ via un fichier */etc/multipath.conf*. Voici un exemple (utilisé avec un SAN LENOVO S2200) : ~~~ defaults { polling_interval 5 user_friendly_names yes path_selector "round-robin 0" } blacklist { wwid ".*" } blacklist_exceptions { wwid "3600c0ff00026xxxxxxxxxxxxxxxxxxxx" } multipaths { multipath { wwid 3600c0ff00026xxxxxxxxxxxxxxxxxxxx alias data } } devices { device { vendor "Lenovo" product "S2200" path_grouping_policy multibus failback immediate no_path_retry fail features "1 queue_if_no_path" } } ~~~ * Pour trouver le `wwid` du volume on peux faire la commande suivante, exemple avec le volume `/dev/sdd/` ~~~ # /lib/udev/scsi_id -g /dev/sdd 3600c0ff00026edf2aff87c5801000000 ~~~ On relance le daemon : ~~~ # /etc/init.d/multipath-tools restart ~~~ Et on vérifie : ~~~ # multipath -ll data (3600c0ff00026xxxxxxxxxxxxxxxxxxxx) dm-0 Lenovo,S2200 size=8.6T features='0' hwhandler='0' wp=rw `-+- policy='round-robin 0' prio=1 status=active |- 5:0:0:0 sdb 8:16 active ready running |- 6:0:0:0 sdd 8:48 active ready running |- 7:0:0:0 sdf 8:80 active ready running `- 8:0:0:0 sdh 8:112 active ready running ~~~ La politique multibus semble la plus intéressante car elle permet de gérer aussi bien le fail-over (en cas de perte d'un lien) que l'agrégation de débit. L'option "failback immediate" indique de basculer sur le ou les lien(s) restant(s) dès qu'une erreur apparait, mais la bascule met 130s dans la configuration précédente, car c'est la couche SCSI qui remonte l'erreur à multipathd et le timeout par défaut d'open-iscsi est de 120 secondes. On peut régler la valeur de ce timeout dans le fichier /etc/iscsi/iscsid.conf pour les nouveaux targets, mais il ne faut pas oublier que les targets déjà configurés (même après déconnexion/reconnexion) conservent leurs paramètres dans /etc/iscsi/send_targets/[...], on modifiera donc également ces fichiers. Exemple avec notre baie Dell : ~~~ # cat /etc/iscsi/nodes/iqn.2002-09.com.lenovo\:01.array.00xxxxxxxx/192.0.2.101\,3260\,1/default # BEGIN RECORD 2.0-873 node.name = iqn.2002-09.com.lenovo:01.array.00xxxxxxxx node.tpgt = 1 node.startup = automatic node.leading_login = No iface.iscsi_ifacename = default iface.transport_name = tcp iface.vlan_id = 0 iface.vlan_priority = 0 iface.iface_num = 0 iface.mtu = 0 iface.port = 0 node.discovery_address = 192.0.2.101 node.discovery_port = 3260 node.discovery_type = send_targets node.session.initial_cmdsn = 0 node.session.initial_login_retry_max = 8 node.session.xmit_thread_priority = -20 node.session.cmds_max = 128 node.session.queue_depth = 32 node.session.nr_sessions = 1 node.session.auth.authmethod = None node.session.timeo.replacement_timeout = 10 # END RECORD ~~~ ### Pour ne plus utiliser multipathd Commencer par démonter les partitions : ~~~ # umount /dev/mapper/data ~~~ Stopper les utilitaires multipath : ~~~ # /etc/init.d/multipath-tools stop ~~~ Et purger la liste des différents paths pour la/les ressource(s) : ~~~ # multipath -F ~~~ On peut vérifier : ~~~ # multipath -ll ~~~ Éventuellement, on peut retirer les modules à présent inutilisés : ~~~ # rmmod dm_round_robin dm_multipath ~~~