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 :
- Interne : le plus simple
- Externe :
- 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, …)
- 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
LUNs de la 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
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