LINUX:ISCSI

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour à la gestion des disques

retour au menu de la Haute disponibilité


But

ISCSI est un protocole réseau qui permet d'utiliser à distance une partition de disque d'une machine "target" sur une autre machine "initiator" comme si ce disque était connecté localement.

Ce protocole est utilisé dans les SAN qui mettent à disposition un ensemble de disques durs à utiliser comme on le désire mais à distance.


Il ne faut le confondre avec les protocoles de partages de fichiers tels SMB (samba) et NFS. Un NAS est une machine qui offre des espaces de partage de fichiers.


Principe

Le protocole ISCSI travaille en mode Client-Serveur. Il est donc constitué de deux composantes:

  • Target : la machine qui met à disposition certain de ses disques
  • Initiator : la machine qui va utiliser les disques mis à disposition par le serveur

Nous allons expliquer la configuration de ces deux pièces: target et initiator.


Matériel et adressage IP

Dans notre exemple, nous utilisons deux serveurs ("target") et un client ("initiator"). Le schéma ci-dessous nous montre l'adressage IP et le nom de ces trois machines. Nous avons mis deux serveurs (target) ISCSI pour illustrer l'intérêt du terme "initiator-name" abordé ci-dessous.

LINUX:Iscsi.pdf


Serveur ou Target

Ces deux machines vont offrir à d'autres machines la possibilité d'utiliser un espace disque local. Ces opérations sont à effectuer sur les deux serveurs.


Installation

Un paquet est à installer:

dnf install scsi-target-utils

Notons qu'il existe d'autres méthodes de gestion.


Préparation du disque dur

Nous avons ajouté un disque dur de 160GB que nous nommons "/dev/sdb". Nous y faisons une seule partition de type Linux: "/dev/sdb1".


Configuration

Les fichiers de configuration se retrouvent dans le répertoire "/etc/tgt".

  • le fichier "tgtd.conf" fait référence au fichier "targets.conf" et aux fichiers de type ".conf" se trouvant dans le sous-répertoire "/etc/tgt/conf.d",
  • le fichier "targets.conf" contient les paramètres généraux.
  • Dans le sous-répertoire "/etc/tgt/conf.d", on crée le fichier, que l'on nommera "diskb.conf", contenant les paramètres permettant de mettre à disposition la partition "/dev/sdb1" aux clients ISCSI distants.

Voici son contenu pour la machine "sv1.home.dom":


<target iqn.2023-02.dom.home.sv1:sv1.target1>
   backing-store /dev/sdb1
   initiator-name iqn.2023-02.dom.home.sv:sv.initiator01
   incominguser diskuser Eupen2Marron
   initiator-address 192.168.1.73
</target>

Et voici son contenu pour la machine "sv2.home.dom":


<target iqn.2023-02.dom.home.sv2:sv2.target1>
   backing-store /dev/sdb1
   initiator-name iqn.2023-02.dom.home.sv:sv.initiator01
   incominguser diskuser Eupen2Marron
   initiator-address 192.168.1.73
</target>

Explications des options:

  • target <nom du target> : définit le nom du target sous lequel les clients ISCSI verront ce device. Normalement ce nom suit une structure de nommage: "iqn.<année>-<mois>.<nom de domaine en ordre inverse>:<intitulé personnel>". On a donné des noms du target différents pour les deux machines pour une question de lisibilité.
  • backing-store <nom de device disque> : définit le nom du device disque; il peut être une partition disque ou LVM
  • initiator-name <nom de l'initiator> : définit le nom de l'initiator, sorte de groupe de targets, ayant des options, permettant à un groupe de clients ISCSI d'y accéder; la structure de ce nom suit le même principe que le nom du target. Il est identique sur chaque machine, ainsi il forment un groupe de deux targets ISCSI.
  • incominguser <nom d'utilisateur> <mot de passe> : définit les paramètres d'authentification des clients ISCSI; lors d'une connexion, le client devra fournir de nom de cet utilisateur et son mot de passe pour cet "initiator-name". Ils sont liés au nom d'initiator.
  • initiator-address <adresse IP> : définit l'adresse IP d'un client ISCSI qui peut y accéder. Ils sont liés au nom d'initiator.

Il existe bon nombre d'autres options. Les trois dernières sont facultatives mais ajoute un aspect de sécurité.


Configurer le mur de feu ou FireWall

Si vous activez le Firewall, ce qui est recommandé, il faut y ajouter la règle suivante:


-A INPUT  -p tcp -m tcp --sport 3260 -s 192.168.1.73 -m conntrack --ctstate NEW -j ACCEPT


Activer et lancer le service

Le service à lancer est "tgtd.service". La première commande active le service pour qu'à chaque démarrage du serveur, le service se lance. La seconde lance directement le service.

systemctl enable tgtd.service
systemctl start tgtd.service

Eventuellement:

systemctl enable remote-fs.target

Quand on exécute la commande:

netstat -nltp | grep tgtd

on obtient:


Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      1767/tgtd
tcp6       0      0 :::3260                 :::*                    LISTEN      1767/tgtd

Nous remarquons que ce service écoute aussi en IPV6.

On peut aussi le constater avec la commande suivante:

tgtadm --lld iscsi --op show --mode portal

qui donne:


Portal: [::]:3260,1
Portal: 0.0.0.0:3260,1

Il est possible d'éliminer la première ligne par la commande:

tgtadm --lld iscsi --op delete --mode portal --param portal=[::]:3260

Nous allons l'intégrer au lancement du service. On crée le répertoire "/etc/systemd/system/tgtd.service.d"; dans ce répertoire, on ajoute le fichier "ipv4.conf" dont voici le contenu:


[Service]
ExecStartPost=/usr/sbin/tgtadm --lld iscsi --op delete --mode portal --param portal=[::]:3260

On recharge les paramètres de Systemd:

systemctl daemon-reload

On relance le service:

systemctl stop tgtd.service
systemctl start tgtd.service

L'entrée pour IPV6 a disparu.


Vérification

La commande suivante permet d'afficher les caractéristiques de ce target:

tgtadm --mode target --op show

qui donne:


Target 1: iqn.2023-02.dom.home.sv1:sv1.target1
   System information:
       Driver: iscsi
       State: ready
   I_T nexus information:
   LUN information:
       LUN: 0
           Type: controller
           SCSI ID: IET     00010000
           SCSI SN: beaf10
           Size: 0 MB, Block size: 1
           Online: Yes
           Removable media: No
           Prevent removal: No
           Readonly: No
           SWP: No
           Thin-provisioning: No
           Backing store type: null
           Backing store path: None
           Backing store flags:
       LUN: 1
           Type: disk
           SCSI ID: IET     00010001
           SCSI SN: beaf11
           Size: 160040 MB, Block size: 512
           Online: Yes
           Removable media: No
           Prevent removal: No
           Readonly: No
           SWP: No
           Thin-provisioning: No
           Backing store type: rdwr
           Backing store path: /dev/sdb1
           Backing store flags:
   Account information:
       diskuser
   ACL information:
       192.168.1.73
       iqn.2023-02.dom.home.sv:sv.initiator01


Client ou Initiator

Après avoir configuré nos serveurs Targets, on passe au client qui va profiter de ces ressources.


Installation

Un paquet est à installer:

dnf install iscsi-initiator-utils

En base, il est déjà installé sur FGedora, Edition Serveur.


Configuration

Les fichiers de configuration se retrouvent dans le répertoire "/etc/iscsi". Il contient deux fichiers: initiatorname.iscsi et iscsid.conf

  • Dans le fichier "iscsid.conf", nous allons y apporter quelques modifications.

Ces modifications permettent que la machine s'authentifie auprès des serveurs targets ISCSI. Il s'agit des deux paramètres de l'option "incominguser" activés sur les machines Targets: nom d'utilisateur et son mot de passe. On ajoute ou active ces lignes:


node.session.auth.authmethod = CHAP
node.session.auth.username = diskuser
node.session.auth.password = Eupen2Marron

  • Dans le fichier "initiatorname.iscsi", on remplace la ligne existante par le nom d'initiator défini sur les serveurs targets ISCSI:

InitiatorName=iqn.2023-02.dom.home.sv:sv.initiator01

Il ne peut y avoir qu'une ligne; seule la première ligne est utilisée.


Activer et lancer le service

Le service à lancer est "iscsid.service". La première et la seconde commandes active et lance le service "iscsid" et sont chargées d'établir les connexions aux "Targets" découverts:

systemctl enable iscsi.service
systemctl start  iscsi.service

Il est important de vérifier que le "target" de Systemd suivant est activé:

systemctl enable remote-fs.target

Et éventuellement:

systemctl enable iscsid.socket
systemctl enable iscsiuio.socket
systemctl enable iscsi-onboot.service
systemctl enable iscsid.service

Notons que par défaut, ils sont activés sous Fedora Server.


Récupération des informations disponibles sur les serveurs

La configuration faite et le service lancé, il est temps de récupérer les informations provenant des serveurs. On lance les deux commandes suivantes qui sont chargées de découvrir les "targets" auprès de nos deux serveurs:

iscsiadm --mode discoverydb --type sendtargets --portal 192.168.1.71 --discover

qui donne:


192.168.1.71:3260,1 iqn.2023-02.dom.home.sv1:sv1.target1

et:

iscsiadm --mode discoverydb --type sendtargets --portal 192.168.1.72 --discover

qui donne:


192.168.1.72:3260,1 iqn.2023-02.dom.home.sv2:sv2.target1


Dans le répertoire "/var/lib/iscsi/nodes", deux sous-répertoires sont apparus: "iqn.2023-02.dom.home.sv1:sv1.target1/192.168.1.71,3260,1" et "iqn.2023-02.dom.home.sv2:sv2.target1/192.168.1.72,3260,1". Dans chacun, le fichier "default" est créé. Il contient nombre de paramètres propres à ce "target".

En parallèle dans le répertoire "/var/lib/iscsi/send_targets", deux sous-répertoires sont apparus: "192.168.1.71,3260" et "192.168.1.72,3260". Dans chacun, le fichier "st_config" est créé. On y rencontre d'autres paramètres liés aux serveurs.


Mise en route de la liaison

Maintenant soit on relance la machine "initiator" soit on relance le service "iscsi.service":

systemctl restart iscsi.service


Vérification

On peut vérifier que les liaisons sont effectives.

  • par la commande:
lsblk

qui fait apparaître les deux nouvelles entrées suivantes:


NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb                   8:16   0   149G  0 disk
sdc                   8:32   0   149G  0 disk

Ce sont les deux partitions mises à disposition par les serveurs "target".

  • par la commande:
netstat -natp | grep iscsid

qui affiche la liaison IP avec nos deux serveurs "target".


Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 192.168.1.73:57520      192.168.1.71:3260       ESTABLISHED 2315/iscsid
tcp        0      0 192.168.1.73:58242      192.168.1.72:3260       ESTABLISHED 2315/iscsid

  • par la commande:
iscsiadm -m session -P 3

qui affiche plus d'informations, notamment la liaison entre le serveur et le device disque à la fin de chaque bloc:


iSCSI Transport Class version 2.0-870
version 6.2.1.4
Target: iqn.2023-02.dom.home.sv1:sv1.target1 (non-flash)
       Current Portal: 192.168.1.71:3260,1
       Persistent Portal: 192.168.1.71:3260,1
               **********
               Interface:
               **********
               Iface Name: default
               Iface Transport: tcp
               Iface Initiatorname: iqn.2023-02.dom.home.sv:sv.initiator01
               Iface IPaddress: 192.168.1.73
               Iface HWaddress: default
               Iface Netdev: default
               SID: 5
               iSCSI Connection State: LOGGED IN
               iSCSI Session State: LOGGED_IN
               Internal iscsid Session State: NO CHANGE
               *********
               Timeouts:
               *********
               Recovery Timeout: 120
               Target Reset Timeout: 30
               LUN Reset Timeout: 30
               Abort Timeout: 15
               *****
               CHAP:
               *****
               username: diskuser
               password: ********
               username_in: <empty>
               password_in: ********
               ************************
               Negotiated iSCSI params:
               ************************
               HeaderDigest: None
               DataDigest: None
               MaxRecvDataSegmentLength: 262144
               MaxXmitDataSegmentLength: 8192
               FirstBurstLength: 65536
               MaxBurstLength: 262144
               ImmediateData: Yes
               InitialR2T: Yes
               MaxOutstandingR2T: 1
               ************************
               Attached SCSI devices:
               ************************
               Host Number: 6  State: running
               scsi6 Channel 00 Id 0 Lun: 0
               scsi6 Channel 00 Id 0 Lun: 1
                       Attached scsi disk sdb          State: running
Target: iqn.2023-02.dom.home.sv2:sv2.target1 (non-flash)
       Current Portal: 192.168.1.72:3260,1
       Persistent Portal: 192.168.1.72:3260,1
               **********
               Interface:
               **********
               Iface Name: default
               Iface Transport: tcp
               Iface Initiatorname: iqn.2023-02.dom.home.sv:sv.initiator01
               Iface IPaddress: 192.168.1.73
               Iface HWaddress: default
               Iface Netdev: default
               SID: 6
               iSCSI Connection State: LOGGED IN
               iSCSI Session State: LOGGED_IN
               Internal iscsid Session State: NO CHANGE
               *********
               Timeouts:
               *********
               Recovery Timeout: 120
               Target Reset Timeout: 30
               LUN Reset Timeout: 30
               Abort Timeout: 15
               *****
               CHAP:
               *****
               username: diskuser
               password: ********
               username_in: <empty>
               password_in: ********
               ************************
               Negotiated iSCSI params:
               ************************
               HeaderDigest: None
               DataDigest: None
               MaxRecvDataSegmentLength: 262144
               MaxXmitDataSegmentLength: 8192
               FirstBurstLength: 65536
               MaxBurstLength: 262144
               ImmediateData: Yes
               InitialR2T: Yes
               MaxOutstandingR2T: 1
               ************************
               Attached SCSI devices:
               ************************
               Host Number: 7  State: running
               scsi7 Channel 00 Id 0 Lun: 0
               scsi7 Channel 00 Id 0 Lun: 1
                       Attached scsi disk sdc          State: running


Partitionnement

On partitionne ces deux disques "/dev/sdb" et "/dev/sdc" comme vu à l'article sur le Partitionnement du disque. Nous n'avons fait qu'une partition.


La commande:

lsblk

donne maintenant:


NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb                   8:16   0   149G  0 disk
└─sdb1                8:17   0   149G  0 part
sdc                   8:32   0   149G  0 disk
└─sdc1                8:33   0   149G  0 part


Formatage

Nous formatons ces deux partitions au format "xfs":

mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdc1


Montage classique via le fichier "/etc/fstab"

Nous allons les monter comme décrit dans l'article sur le Montage d'espace disque.


Nous créons deux répertoires vides pour le montage:

mkdir /datab
mkdir /datac


Comme nous ne connaissons pas à l'avance le nom du device disque, nous utiliserons son UUID.

Exécutons la commande:

blkid

qui donne ces deux UUID:


/dev/sdb1: UUID="74435bdf-f453-471f-aa85-ec5418d59cfd" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="2a4e45db-01"
/dev/sdc1: UUID="c45eb09d-3eae-4090-995f-3da5ab7d167c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="7cdf9c3a-01"


Nous avons le nécessaire pour ajouter toutes deux entrées au fichier "/etc/fstab":


UUID="74435bdf-f453-471f-aa85-ec5418d59cfd" /datab  xfs   defaults,_netdev        0 0
UUID="c45eb09d-3eae-4090-995f-3da5ab7d167c" /datac  xfs   defaults,_netdev        0 0

L'option "_netdev" est fondamentale car ce montage ne doit être fait qu'après l'exécution du service "iscsid.service" lors de la phase de Systemd nommée "remote-fs.target".


On peut monter ces nouveaux espaces disques:

mount -a

ou redémarrer la machine "cl1.home.dom".


La commande:

df

voit apparaître nos deux répertoires "/datab" et "/datac":


Sys. de fichiers            blocs de 1K Utilisé Disponible Uti% Monté sur
/dev/sdb1                     156211688 1122160  155089528   1% /datab
/dev/sdc1                     156211688 1122160  155089528   1% /datac


Montage via Systemd

Au lieu d'ajouter ces deux entrées au fichier "/etc/fstab", on peut utiliser la fonctionnalité de Systemd pour monter ces disques.

Dans le répertoire "/usr/lib/systemd/system", on crée deux fichiers, un pour chaque montage.

  • le fichier "datab.mount" dont voici le contenu:

[Unit]
Before=remote-fs.target
After=iscsid.service
Requires=iscsid.service
 
[Mount]
What=/dev/disk/by-uuid/74435bdf-f453-471f-aa85-ec5418d59cfd
Where=/datab
Type=xfs
Options=defaults,_netdev
 
[Install]
WantedBy=remote-fs.target

  • le fichier "datac.mount" dont voici le contenu:

[Unit]
Before=remote-fs.target
After=iscsid.service.
Requires=iscsid.service
 
[Mount]
What=/dev/disk/by-uuid/c45eb09d-3eae-4090-995f-3da5ab7d167c
Where=/datac
Type=xfs
Options=defaults,_netdev
 
[Install]
WantedBy=remote-fs.target

On y retrouve tous les paramètres entrés dans le fichier "/etc/fstab". On remarque l'ordre d'éxécution. Il se fait après le service "iscsid.service" qui effectue la liaison avec les serveurs "target" et le montage se fait lors de la phase "remote-fs.target".


On recharge les paramètres de Systemd que nous venons de modifier:

systemctl daemon-reload

et on active ces deux points de montage:

systemctl enable datab.mount
systemctl enable datac.mount

Deux liens sont ajouté dans le répertoire "/etc/systemd/system/remote-fs.target.wants".

On redémarre la machine "cl1.home.dom" ou on exécute les commandes:

systemctl start datab.mount
systemctl start datac.mount

pour monter ces deux disques.


RAID 1

Au lieu d'utiliser les deux disques séparément, comme ils sont de même taille, on peut les coupler pour faire un seul device de type RAID 1 software.




retour à la gestion des disques

retour au menu de la Haute disponibilité