Linux – Connecter un serveur à un SAN (iSCSI)


Dans cet article sont décrites les étapes nécessaires à la configuration d’un stockage SAN utilisant le protocole de communication iSCSI avec un serveur Linux.

Stockages

Il existe plusieurs types de stockages :

  1. Interne : le plus simple
  2. Externe :
    1. NAS (Network Appliance Server) : Serveur de données permettant de stocker en réseau et partager des données, délivrant toute une gamme de protocole pour les accéder (NFS, AFP, Network Drive Windows, …)
    2. SAN (Storage Area Network) : Serveur d’unités de stockage partagées, communément appelées LUN

 

Le NAS propose des volumes déjà formatés et accessible de façon partagée pour tout système connectant un lecteur réseau à l’aide d’un des protocoles délivrés par le NAS.

Le SAN quant à lui délivre des unités de stockage (LUNs : Logical UNit) brutes (raw device). Le système qui connecte une LUN en provenance d’un SAN voit l’unité de stockage comme si elle était locale au serveur.

Protocole iSCSI

Le protocole iSCSI (internet Small Computer System Interface) est un protocole réseau permettant l’accès à des serveurs SAN et à la connexion et la manipulation de LUNs partagées.

Paramétrage côté SAN

Cette partie étant spécifique à chaque stockage, je n’entrerai pas dans le détail.

Pour ma part, j’utilise un QNAP T-809 Pro avec 8 disques montés en RAID6 qui à la base est un NAS, mais propose d’émuler un SAN au travers du protocole iSCSI.

Pour les besoins que j’ai, j’ai défini une cible iSCSI nommée « cassandra », le but étant de monter une configuration cluster à 5 nœuds afin de réaliser des tests de scalabilité.

L’ensemble des exemples qui suivront seront fondés sur cette configuration et ce besoin.

Cible iSCSI

capture-decran-2016-10-23-a-12-33-19

LUNs de la cible iSCSI

Cible iSCSI

Configuration côté serveur Linux

Fichier /etc/iscsi/iscsid.conf

Ce fichier contient les éléments essentiels à la connexion au SAN.

Ci-dessous, les paramètres nécessaires à la découverte et à la connexion au SAN :

iscsid.startup = /bin/systemctl start iscsid.socket iscsiuio.socket
node.startup = automatic
node.session.auth.authmethod = CHAP
node.session.auth.username = cassandra
node.session.auth.password = xxxxxxxxx
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = cassandra
discovery.sendtargets.auth.password = xxxxxxxxx

Il existe bien d’autres paramètres permettant une configuration fine du protocole de communication côté client (le serveur Linux est client du SAN), non-nécessaires dans un premier temps.

Création d’une interface spécifique fonction du réseau choisi

Il faut commencer par noter l’adresse MAC de la carte réseau par laquelle on souhaite faire passer le trafic iSCSI :

[root@cassandra03 ~]# ifconfig

[...]
enp0s10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 ether 08:00:27:58:a3:7b txqueuelen 1000 (Ethernet)
 RX packets 24 bytes 2226 (2.1 KiB)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 49 bytes 8310 (8.1 KiB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
 inet 127.0.0.1 netmask 255.0.0.0
 inet6 ::1 prefixlen 128 scopeid 0x10<host>
 loop txqueuelen 0 (Boucle locale)
 RX packets 4 bytes 340 (340.0 B)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 4 bytes 340 (340.0 B)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[...]

Il faut créer un fichier nommé /var/lib/iscsi/ifaces/iface1

Ce fichier contiendra par exemple les données de la carte réseau enp0s10 :

# BEGIN RECORD 6.2.0.873-33.2
iface.iscsi_ifacename = iface1
iface.hwaddress = 08:00:27:58:a3:7b
iface.transport_name = tcp
iface.vlan_id = 0
iface.vlan_priority = 0
iface.iface_num = 0
iface.mtu = 0
iface.port = 0
iface.tos = 0
iface.ttl = 0
iface.tcp_wsf = 0
iface.tcp_timer_scale = 0
iface.def_task_mgmt_timeout = 0
iface.erl = 0
iface.max_receive_data_len = 0
iface.first_burst_len = 0
iface.max_outstanding_r2t = 0
iface.max_burst_len = 0
# END RECORD

Préparation au démarrage automatique des services iSCSI

[root@cassandra02 ~]# systemctl enable iscsi
Created symlink from /etc/systemd/system/sysinit.target.wants/iscsi.service
to /usr/lib/systemd/system/iscsi.service.
[root@cassandra02 ~]# systemctl enable iscsiuio
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsiuio.service
to /usr/lib/systemd/system/iscsiuio.service.

Démarrage des services iSCSI

[root@cassandra02 ~]# systemctl start iscsi
Created symlink from /etc/systemd/system/sysinit.target.wants/iscsi.service
to /usr/lib/systemd/system/iscsi.service.
[root@cassandra02 ~]# systemctl start iscsiuio
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsiuio.service
to /usr/lib/systemd/system/iscsiuio.service.

Découverte de cible iSCSI

L’utilitaire iscsiadm pourvoit à l’ensemble des opérations possibles avec les cibles ISCSI.

La découvert de cible se fait de la manière suivante :

[root@cassandra02 ~]# iscsiadm -m discovery -t sendtargets \
-p 10.0.0.10:3260 -I iface1
10.0.0.10:3260,1 iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3
192.168.1.99:3260,1 iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3
10.8.0.1:3260,1 iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3

L’interface qui m’intéresse est celle d’adresse IP 10.0.0.10

Enregistrement de la cible iSCSI

[root@cassandra02 ~]# iscsiadm -m node -p 10.0.0.10 --targetname \
iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3 -I iface1 -o new

Connexion de la cible iSCSI

[root@cassandra02 ~]# iscsiadm -m node -p 10.0.0.10 --targetname \
iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3 --login -I iface1
 Logging in to [iface: default,
target: iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3,
   portal: 10.0.0.10,3260] (multiple)
 Login to [iface: default,
target: iqn.2004-04.com.qnap:ts-809:iscsi.cassandra.c0a6c3,
   portal: 10.0.0.10,3260] successful.

Vérification des connexions serveur à la cible iSCSI

EtatCible

Vérification des LUNs présentées

Cette vérification peut être faite au travers de la commande fdisk :

[root@cassandra02 ~]# fdisk -l

Disque /dev/sda : 32.2 Go, 32212254720 octets, 62914560 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x0009902d

Périphérique Amorçage Début Fin Blocs Id. Système
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 62914559 30944256 8e Linux LVM

Disque /dev/mapper/centos-swap : 3221 Mo, 3221225472 octets, 6291456 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets


Disque /dev/mapper/centos-root : 28.5 Go, 28462546944 octets, 55590912 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets


Disque /dev/sdb : 21.5 Go, 21474836480 octets, 41943040 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 1048576 octets / 1048576 octets


Disque /dev/sdc : 21.5 Go, 21474836480 octets, 41943040 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 1048576 octets / 1048576 octets


Disque /dev/sdd : 21.5 Go, 21474836480 octets, 41943040 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 1048576 octets / 1048576 octets


Disque /dev/sdf : 21.5 Go, 21474836480 octets, 41943040 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 1048576 octets / 1048576 octets


Disque /dev/sde : 21.5 Go, 21474836480 octets, 41943040 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 1048576 octets / 1048576 octets

Préparation d’un point de montage

Création d’une partition

[root@cassandra02 ~]# fdisk /dev/sdc
Bienvenue dans fdisk (util-linux 2.23.2).

Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.


Commande (m pour l'aide) : n
Type de partition :
 p primaire (0 primaire(s), 0 étendue(s), 4 libre(s))
 e étendue
Sélection (p par défaut) : p
Numéro de partition (1-4, 1 par défaut) : 1
Premier secteur (2048-41943039, 2048 par défaut) : 
Utilisation de la valeur 2048 par défaut
Dernier secteur, +secteur ou +taille{K,M,G} (2048-41943039, 41943039 par défaut) : 
Utilisation de la valeur 41943039 par défaut
La partition 1 de type Linux et de taille 20 GiB est configurée

Commande (m pour l'aide) : w
La table de partitions a été altérée.

Appel d'ioctl() pour relire la table de partitions.
Synchronisation des disques.

Formatage de la partition pour en faire un filesystem

[root@cassandra02 ~]# mkfs -t ext4 /dev/sdc1
mke2fs 1.42.9 (28-Dec-2013)
Rejet des blocs de périphérique : complété 
Étiquette de système de fichiers=
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
« Stride » = 256 blocs, « Stripe width » = 256 blocs
1310720 i-noeuds, 5242624 blocs
262131 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=0
Nombre maximum de blocs du système de fichiers=2153775104
160 groupes de blocs
32768 blocs par groupe, 32768 fragments par groupe
8192 i-noeuds par groupe
Superblocs de secours stockés sur les blocs : 
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
 4096000

Allocation des tables de groupe : complété 
Écriture des tables d'i-noeuds : complété 
Création du journal (32768 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Création du point de montage

[root@cassandra02 ~]# mkdir /data

Préparation du fichier /etc/fstab

Editer le fichier /etc/fstab et y insérer :

/dev/sdc1       /data                           ext4    _netdev 0 0

Le paramètre « _netdev » est très important. Il permet l’attente de la disponibilité du service réseau iSCSI avant de monter le filesystem

Montage du nouveau filesystem

[root@cassandra02 ~]# mount /data
[root@cassandra02 ~]# df -h /data
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/sdc1 20G 45M 19G 1% /data

Changement du propriétaire du filesystem

[root@cassandra02 ~]# chown cassandra:cassandra /data
[root@cassandra02 ~]# ls -ld /data
drwxr-xr-x. 3 cassandra cassandra 4096 23 oct. 15:39 /data

 

Il ne reste plus qu’à utiliser ces nouvelles unités comme tout autre unité de stockage locale