Raid
Pas besoin d'écrire tout un article là dessus, d'autres personnes font ça mieux que moi. Il ne s'agit ici que d'un pense bete :
Test de création d'un raid 1 (miroir)
Le but de ce chapitre est de tester la création d'un raid 1 histoire de se faire la main sans pour autant modifier la configuration des disques durs physiques.
Création des fichiers
Pour ce test on va avoir besoin de plusieurs fichiers qui feront office de disques durs virtuels. On va en créer 3 en utilisant la commande :
# dd if=/dev/zero of=Vdisque1 bs=1M count=1024 status=progress
Le paramètre "of=" spécifie l'emplacement du fichier de sortie, on réitère donc avec Vdisque2 et Vdisque3, le paramètre "status=progress" quant à lui permet de voir la progression.
# ls -lh total 3,1G -rw-r--r-- 1 root root 1,0G 24 févr. 11:08 Vdisque1 -rw-r--r-- 1 root root 1,0G 24 févr. 11:08 Vdisque2 -rw-r--r-- 1 root root 1,0G 24 févr. 11:08 Vdisque3
Faire passer ces fichier pour des disques physiques
Avoir les fichiers c'est bien, mais encore faut-il qu'ils soient reconnus par le système comme étant des disques durs. Pour cela on utilise la commande :
# losetup -f Vdisque1
L'option "-f" va cherche le premier périphérique inutilisé. En itérant ça pour le second fichier on obtient :
# fdisk -l Disque /dev/loop0 : 1 GiB, 1073741824 octets, 2097152 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/loop1 : 1 GiB, 1073741824 octets, 2097152 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
Nos deux fichiers sont maintenant reconnus comme des disques dur et se situe en /dev/loopX
Création du raid avec mdadm
Pour créer le raid à proprement parler il faut maintenant utiliser mdadm.
# mdadm --create /dev/md/raid_test --level=1 --raid-devices=2 /dev/loop0 /dev/loop1 mdadm: partition table exists on /dev/loop0 mdadm: partition table exists on /dev/loop0 but will be lost or meaningless after creating array mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: partition table exists on /dev/loop1 mdadm: partition table exists on /dev/loop1 but will be lost or meaningless after creating array Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md/raid_test started.
Comme on peut le constater s'il existe une table de partition, celle ci sera détruite lors de la création du raid. En vérifiant avec fdisk on peut voir ceci :
# fdisk -l ... Disque /dev/md127 : 1022 MiB, 1071644672 octets, 2093056 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
On peut également vérifier l'état du raid avec :
# cat /proc/mdstat Personalities : [raid1] md127 : active raid1 loop1[1] loop0[0] 1046528 blocks super 1.2 [2/2] [UU] unused devices: <none>
Création d'un système de fichier avec LVM
Création du volume physique
Dans cet exemple le volume physique ne sera pas les disques /dev/loopX, mais le raid que l'on vient de créer avec mdadm.
# pvcreate /dev/md127 Physical volume "/dev/md127" successfully created.
On peut vérifier l'état du volume physique avec cette commande :
# pvdisplay "/dev/md127" is a new physical volume of "1022,00 MiB" --- NEW Physical volume --- PV Name /dev/md127 VG Name PV Size 1022,00 MiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID NEulEb-iRqr-y0vW-1Hza-uU8D-eR16-gvskzj
Création du groupe de volumes
Ici il est question d'agréger différents volumes physique en un seul groupe. On ne va pas creuser bien loin car dans cet exemple nous n'avons qu'un seul volume physique.
# vgcreate VG_raid_test /dev/md127 Volume group "VG_raid_test" successfully created
L'argument "VG_raid_test" est simplement le nom que portera ce groupe de volumes
# vgdisplay --- Volume group --- VG Name VG_raid_test System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 1020,00 MiB PE Size 4,00 MiB Total PE 255 Alloc PE / Size 0 / 0 Free PE / Size 255 / 1020,00 MiB VG UUID 7c0uVR-eLkB-hcRo-MRzL-KMmi-G0Sz-H4rNuy
Création des volumes logiques
La création touche bientôt à sa fin, il ne nous reste plus qu'à créer des volumes logiques. Dans ce test on en créera qu'un seul
# lvcreate -L 500M VG_raid_test -n test Logical volume "test" created.
Comme pour les deux autres commandes, si on veut voir l'état on utilise "machindisplay"
# lvdisplay --- Logical volume --- LV Path /dev/VG_raid_test/test LV Name test VG Name VG_raid_test LV UUID AKQNwX-9S5G-sEqg-ufxQ-PLf2-LZiW-2Tl6SM LV Write Access read/write LV Creation host, time serveur, 2020-02-24 11:47:36 +0100 LV Status available # open 0 LV Size 500,00 MiB Current LE 125 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
Formatage, montage et vérification
On formate le volume logique
# mkfs.ext4 /dev/VG_raid_test/test mke2fs 1.45.5 (07-Jan-2020) Rejet des blocs de périphérique : complété En train de créer un système de fichiers avec 512000 1k blocs et 128016 i-noeuds. UUID de système de fichiers=1019217b-de10-4048-b2cf-a54a804fa045 Superblocs de secours stockés sur les blocs : 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409 Allocation des tables de groupe : complété Écriture des tables d'i-noeuds : complété Création du journal (8192 blocs) : complété Écriture des superblocs et de l'information de comptabilité du système de fichiers : complété
On le monte
# mount /dev/VG_raid_test/test montage/
Et on peut vérifier avec :
# df -h Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur ... /dev/mapper/VG_raid_test-test 477M 2,3M 445M 1% /root/tests/montage
On a donc effectivement notre raid monté et opérationnel.
Modification d'un raid 1 en raid 5
Le but de ce wiki n'était pas de noter la façon de créer un raid (même si cela va me servir de pense bête), mais plutôt de tester comment transformer un raid 1 en raid 5.
Pour rappel le raid 1 (miroir), va simplement utiliser deux disque (minimum) et copier exactement la même chose sur l'un et sur l'autre. L'avantage est que l'on augmente la fiabilité face au panne, car si un des disque dur est défaillant, il restera toujours l'autre.
Le raid 5 quant à lui utilise trois disque dur minimum (A, B et C), grossièrement pour chaque donnée inscrite sur ce raid, la moitié sera écrite sur A, l'autre moitié sur B et C stockera une somme de contrôle.
Dans mon cas je vais passer de 2x2To en raid 1 (donc seulement 2To accessible mais capable de supporter 1 disque défaillant sur 2) à 3x2To en raid 5 (donc 4to disponible, mais capable de ne supporter 1 disque défaillant sur 3). Il est cependant possible de laisser à disposition du raid 5 un 4ème disque dur qui remplacera automatiquement un disque dur défaillant. En passant sur un raid 5 on perd donc un peu en sécurité mais on gagne en espace de stockage, à vous de choisir si cette solution est adapté pour vous.
On va commencer par créer un fichier dans notre raid 1, le transformer en raid 5 et vérifier que le fichier est toujours là afin de pouvoir vérifier que la méthode de transformation n'occasionne pas de perte de données.
Changement de level
En regardant l'état du raid avec la commande :
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md127 : active raid1 loop1[1] loop0[0] 1046528 blocks super 1.2 [2/2] [UU]
On constate qu'il est actif et utilise deux disques dur en raid1.
Après avoir tapé cette commande :
# mdadm /dev/md127 --grow --level=5
On pourra constater les changements :
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md127 : active raid5 loop1[1] loop0[0] 1046528 blocks super 1.2 level 5, 64k chunk, algorithm 2 [2/2] [UU]
Toujours actif, utilisant toujours deux disques, mais on peut voir apparaître raid5, level5 ainsi qu'un paramètre "algorithm 2". Maintenant pour que le raid 5 soit pleinement opérationnel il faut lui fournir un disque dur en plus.
Ajouter un disque dur à un raid
Pour ajouter un périphérique à un raid on utilise la commande :
# mdadm /dev/md127 --add /dev/loop2 mdadm: added /dev/loop2 # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md127 : active raid5 loop2[2](S) loop1[1] loop0[0] 1046528 blocks super 1.2 level 5, 64k chunk, algorithm 2 [2/2] [UU] unused devices: <none>
On voit effectivement apparaître notre périphérique loop2, cependant le (S) juste à coté signifie que ce disque est en mode spare. En d'autres termes, il est là pour prendre la relève lorsqu'un disque dur sera défaillant. Pour l'activer et qu'il participe au raid5 il faut modifier le nombre de périphériques utilisé par le raid
Modification du nombre de périphériques actifs
Pour définir le nombre de disques dur que doit utiliser le raid on fait appel à la commande :
# mdadm /dev/md127 --grow --raid-devices=3 # cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md127 : active raid5 loop2[2] loop1[1] loop0[0] 1046528 blocks super 1.2 level 5, 64k chunk, algorithm 2 [3/3] [UUU] [===>.................] reshape = 16.3% (171176/1046528) finish=0.2min speed=57058K/sec unused devices: <none>
On constate que le (S) à disparu, qu'on est passé de [UU] à [UUU] et que mdadm est en train de reconstruire le raid proprement
Quelques tests supplémentaires
Tout s'est correctement déroulé, on a transformé le raid 1 en raid 5 sans perte de données. Mais on va quand même vérifier ce qu'il se passe quand on fournit au raid un disque supplémentaire en spare et qu'on dégage un disque dur. Tout ça pour répondre à la question : est-ce que la relève se fait automatiquement.
Ajout d'un quatrième disque au raid
Je ne vais pas tout re-détailler ici, mais on créer un fichier supplémentaire avec dd, on le fait passer pour un périphérique avec losetup, on l'ajoute au raid et voilà ce qu'on obtient
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md127 : active raid5 loop3[3](S) loop2[2] loop1[1] loop0[0] 2093056 blocks super 1.2 level 5, 64k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
Simulation d'une panne
Pour simuler une panne on utilise la commande :
mdadm /dev/md127 --fail /dev/loop0 mdadm: set /dev/loop0 faulty in /dev/md127
On peut alors constater l'exclusion du disque en question et son remplacement par le disque spare :
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md127 : active raid5 loop3[3][3] loop2[2] loop1[1] loop0(F) 2093056 blocks super 1.2 level 5, 64k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
On constate qu'un (F) est apparu à coté du périphérique déclaré comme défectueux, mais que le (S) à coté de /dev/loop3 à disparut, il est donc maintenant utilisé dans le raid.