Raid

De wiki jackbot
Aller à la navigation Aller à la recherche


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 :

le carnet du maker


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.