Iscsi

De Linuxmemo.

http://www.open-iscsi.org/

Protocole réseau qui encapsule le protocole SCSI dans des paquets TCP.

On peut déployer une solution logicielle pure qui nécessite seulement un driver spécifique dont le rôle sera de traduire les ordres SCSI en paquets réseau. Mais pour ceux qui ne disposent pas de matériel iSCSI, nous verrons comment Linux émule une target.

L’espace de stockage étant accédé en mode bloc à travers le réseau, le noyau Linux considère cet espace disque comme s’il était local. Il n’est pas question de partager le même espace physique entre plusieurs initiators.

Sommaire

[modifier] Vocabulaire

Le client est appelé " initiator "

Le serveur est appelé " target "

Le " Portals ": Lorsque l’initiator souhaite établir une session TCP avec la target, il a besoin de connaître le port TCP de la target. L’association (adresse IP, port TCP) est appelé un " portal ". Il y a donc un portal sur l’initiator et la target. Le port par défaut sur la target est le 3260. Notons qu’un initiator peut établir plusieurs connexions TCP avec la même cible. L’ensemble de ces connexions définit une " session iSCSI ".

LUN, les numéros d'unité logique

[modifier] Format des adresses iSCSI

Les adresses iSCSI peuvent avoir deux formats (voir [RFCB]) :

  • Le format iqn (iSCSI Qualified Name) : c’est une chaîne préfixée par " iqn. " et suivie d’une date (au format AAAA-MM), du nom de l’autorité qui a attribué le nom (c’est le nom de domaine à l’envers), puis une chaîne unique qui identifie le nœud. Par exemple : iqn.2007-07.org.zereso:serveur1:123456789ABCDEF.12345.
  • Le format eui (Enterprise Unique Identifier) : c’est une chaîne préfixée par " eui. " et suivie de 16 chiffres hexadécimaux. Par exemple : eui.00803A4B887A8D05.

Chaque nœud iSCSI peut aussi disposer d’Alias. Ce sont des noms logiques qui peuvent être utilisés uniquement après la connexion (qui utilise donc toujours le nom unique officiel) et permettent de proposer des comptes-rendus plus lisibles pour les administrateurs. Toujours suivant le bon vieux principe qu’une vision logique est préférable à une vision physique...

[modifier] Découverte automatique

Le mode SendTargets qui est réalisé à la demande de l’initiator et qui utilise une commande native du protocole iSCSI pour cela.

  • L’initiator connaît (via un fichier de configuration) la liste des targets.
  • Il effectue alors des requêtes de découverte (SendTargets) ;
  • Chaque target iSCSI retourne les noms des cibles disponibles au driver ;
  • Le driver essaye de se connecter et reçoit les ID des cibles ;
  • Le driver iSCSI demande des infos pour chaque périphérique ;
  • Puis, il crée une table des périphériques disponibles ;
  • Les périphériques sont alors montables et utilisables.

[modifier] Installation de la cible "serveur=target"

  • iscsi_trgt.ko : un module noyau qui émule une cible iSCSI et implémente le protocole
  • une commande de contrôle ietadm
  • quelques fichiers de configuration
  • un script de démarrage nommé iscsi-target sous /etc/init.d

[modifier] Configuration de la cible "serveur=target"

La liste des cibles est définie dans le fichier /etc/ietd.conf.

Target iqn.2007-07.org.zereso:storage.disk1
...
Lun 0 Path=/dev/sdb2,Type=blockio

Vous pouvez vous aider de la commande iscsi-iname pour générer un nom arbitraire de cible est au format iqn.

L’accès à la cible est contrôlé par les fichiers /etc/initiators.{allow,deny}

iqn.2007-07.org.zereso:storage.disk1 a.b.c.d*

(où a.b.c.d est l’adresse IP de l’initiator). Nous pouvons charger le module iscsi_trgt et lancer le démon ietd.

/etc/init.d/iscsi-target start
Starting iSCSI enterprise target service: OK/succeeded
target # /etc/init.d/iscsi-target status
ietd (pid 4576) is running...
target # cat /proc/net/iet/volume
tid:1 name:iqn.2007-07.org.zereso:storage.disk1
lun:0 state:0 iotype:blockio iomode:wt path:/dev/sb2
lun:1 state:0 iotype:fileio iomode:wt path:/tmp/itarget

[modifier] Installation de l'initiator "client=initiator"

  • installer le logiciel open-iscsi

[modifier] Configuration de l’initiator "client=initiator"

éditer le fichier initiatorname.iscsi et y placer le nom unique de l’initiator, au format iqn.

InitiatorName=iqn.2007-07.org.zereso:client.babbe4e54ab
/etc/init.d/open-iscsi start
log:
...iscsid: Loading iSCSI transport class...: registered transport (tcp)
...iscsid: iscsi: registered transport (iser)

[modifier] Connecter l’initiator à la cible

Dans le fichier iscsid.conf, il faut vérifier que pour l’instant les lignes discovery.sendtargets et node.session.auth sont en commentaire, puis il faut directement utiliser la commande iscsiadm qui va construire la base utiilisée par le démon iscsid.

iscsiadm –-mode discovery –-type sendtargets –-portal=x.y.z.t:3260
x.y.z.t:3260, 1 iqn.2007-07.org.zereso:storage.disk1

Ce qui a créé le fichier x.y.z.t,3260 sous le répertoire /etc/iscsi/nodes/iqn.2007-07.org.zereso:storage.disk1, sur une Debian. Note Sur OpenSuSE, les commandes iscsiadm précédentes retournent en outre un identifiant (un Resource ID) qui permet d’accéder au contenu des bases de données nodes.db et discovery.db.

initiator # iscsiadm –m discovery –t st –p x.y.z.t
[8bf963] x.y.z.t:3260, 1 iqn.2007-07.org.zereso:storage.disk1 
iscsiadm –m node –r 8bf963

L’équivalent sur Debian et RedHat est d’utiliser la syntaxe suivante :

initiator # iscsiadm –m node -T iqn.2007-07.org.zereso:storage.disk1 –p x.y.z.t

[modifier] Tests de connexion et établissement de session

initiator # cat /proc/scsi/scsi
...
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: IET Model: VIRTUAL-DISK ANSI SCSI revision: 04
Host: scsi1 Channel: 00 Id: 00 Lun: 01
Vendor: IET Model: VIRTUAL-DISK ANSI SCSI revision: 04
target # cat /proc/net/iet/session
tid:1 name:iqn.2007-07.org.zereso:storage.disk1
sid:844424934130176 initiator:iqn.2007-07.org.zereso:client.babbe4e54ab
cid:0 ip:a.b.c.d state:active hd:none dd:none

On suppose que /dev/sdc est le nom d’un nouveau périphérique vu par l’initiator.

initiator # fdisk /dev/sdc
...
(créez ici la 1ère partition primaire dont la taille est la taille du disque)
...
initiator # mke2fs -j /dev/sdc1
initiator # mkdir /iscsi
initiator # mount /dev/sdc1 /iscsi

[modifier] déconnexion

initiator # iscsiadm –m node –T iqn.2007-07.org.zereso:storage.disk1 –p x.y.z.t -u

Mais c'est l'appel au script de démarrage qui permet de déconnecter toutes les sessions :

   # /etc/init.d/open-iscsi stop

[modifier] Connexion automatique au démarrage

il faut modifier la valeur des paramètres contenus dans la base des nœuds.

initiator # iscsiadm –m node –T iqn.2007-07.org.zereso:storage.disk1 –p x.y.z.t
node.name = iqn.2007-07.org.zereso:storage.disk1
node.transport_name = tcp
...
node.conn[0].address = x.y.z.t
node.conn[0].port = 3260
node.conn[0].startup = manual
initiator # iscsiadm –m node –T iqn.2007-07.org.zereso:storage.disk1 –p x.y.z.t -o update –n «node.conn[0].startup» –v automatic
# /etc/init.d/iscsi stop
# /etc/init.d/iscsi start

[modifier] Connexion avec authentification

authentification via la méthode CHAP (Challenge Handshake Authentication Protocol – [RFCC]) et nécessite donc de définir un couple (utilisateur,mot_de_passe) sur l’initiator et la cible. Mais la spécification précise aussi qu’il existe deux modes d’authentification : Avec le mode in, c’est la cible qui doit s’authentifier auprès de l’initiator. Avec le mode out, c’est l’initiator qui doit s’authentifier auprès de la cible.

  • Sur la cible, éditez le fichier /etc/ietd.conf et décommentez la ligne IncomingUser dans la rubrique relative à la cible et indiquez le nom d’utilisateur et le mot de passe que vous souhaitez.
  • configurer l’initiator pour qu’il puisse s’authentifier
initiator # iscsiadm –m node –T iqn.2007-07.org.zereso:storage.disk1 –p x.y.z.t -o update –n node.session.auth.username –v iscsi_u
initiator # iscsiadm –m node –T iqn.2007-07.org.zereso:storage.disk1 –p x.y.z.t -o update –n node.session.auth.password –v monsecret

[modifier] Montage automatique

l'accès aux périphériques iSCSI s’effectue à travers le réseau, or le montage des ressources listées dans /etc/fstab est effectué avant le lancement du réseau. solution consiste à ajouter l’option _netdev

/dev/sdc1 /point/de/montage ext3 defaults,_netdev 0 0

Attention!!!

Le noyau Linux affecte un nom de périphérique logique SCSI dans l’ordre dans lequel ils sont détectés. /dev/sda /dev/sdb /dev/sdc Vous incitent fortement à ne pas référencer les systèmes de fichiers par leur nom physique, de la forme /dev/XXX, mais soit par un label, soit par un UUID (Universal Unique IDentifier). Chaque système de fichiers dispose déjà d’un UUID. Pour l’obtenir, vous pouvez employer blkid, /ulib/udev/vol_id ou udevinfo

initiator # blkid
...
/dev/sdc1: UUID=»637b46fe-c1bb-4080-b21a-042116976ae6» TYPE=»ext3» 

UUID=637b46fe-c1bb-4080-b21a-042116976ae6 /pt/montage ext3 defaults,_netdev 0 2

[modifier] Suivi des sessions

liste des toutes les sessions iSCSI actives:

initiator # iscsiadm –m session
tcp: [0] x.y.z.t:3260,1 iqn.2007-07.org.zereso:storage.disk1

Repérer l’identifiant de Session : c’est toujours la valeur entre crochets. On peut alors obtenir des statistiques réseau sur cette session :

initiator # iscsiadm –m session –r 0 –-stats
[00]
iSCSI SNMP:
txdata_octets: 4492
rxdata_octets: 311088
...

[modifier] Source

http://www.unixgarden.com/index.php/gnu-linux-magazine/le-support-du-protocole-iscsi-dans-linux

Outils personnels