Tom Daluzeau
← Parcours Linux · ressources
Linux · ressources · leçon 5 / 6Ch. 3 · Stockage11 minTerminée

RAID logiciel avec mdadm

Tu sais choisir un niveau de RAID, créer une grappe avec mdadm, lire son état dans /proc/mdstat et remplacer un disque tombé en panne sans arrêter le serveur.

Mis à jour le

À recouper avec le cours. Cette leçon a été écrite à partir du plan du chapitre, avant relecture avec les supports. En cas de doute, le cours fait foi.

Pourquoi on voit ça

Un disque dur finit toujours par tomber en panne. Sur un serveur avec un seul disque, ce jour-là le service s’arrête et les données sont perdues.

Le RAID regroupe plusieurs disques en une grappe, vue par le système comme un seul disque. Selon le niveau choisi, la grappe continue de fonctionner quand un disque meurt : c’est de la haute disponibilité. Tu remplaces le disque, le serveur ne s’est jamais arrêté.

Sous Linux, le RAID logiciel est géré par le noyau et piloté avec la commande mdadm. « Un disque du RAID est tombé » est une panne classique : il faut savoir la lire et la réparer calmement.

Les niveaux de RAID

Trois techniques se combinent :

  • l’agrégation par bandes (striping) : les données sont découpées et réparties sur les disques. Rapide, mais aucune copie ;
  • le miroir : chaque donnée est écrite à l’identique sur plusieurs disques ;
  • la parité : une information calculée qui permet de recalculer le contenu d’un disque perdu, comme on retrouve le nombre manquant d’une addition quand on connaît le total.

Dans le tableau, n est le nombre de disques et T la taille d’un disque.

Niveau Principe Disques minimum Capacité utile Pannes tolérées
RAID 0 bandes 2 n × T aucune
RAID 1 miroir 2 T n − 1 (1 avec 2 disques)
RAID 5 bandes + parité 3 (n − 1) × T 1
RAID 6 bandes + double parité 4 (n − 2) × T 2
RAID 10 bandes sur des miroirs 4 (n ÷ 2) × T 1 par miroir

Quelques repères :

  • RAID 0 : toute la capacité, toute la vitesse, zéro sécurité. Un disque perdu, tout est perdu.
  • RAID 1 : simple et sûr, mais tu paies deux disques pour la capacité d’un seul.
  • RAID 5 : bon compromis. Avec 4 disques de 2 To : (4 − 1) × 2 = 6 To.
  • RAID 6 : comme le 5, avec une seconde parité. Avec 4 disques de 2 To : 4 To.
  • RAID 10 : des paires en miroir, mises bout à bout. Il supporte un disque perdu dans chaque paire. Si les deux disques d’une même paire tombent, tout est perdu : une seule panne est donc garantie.
RAID 0 · bandes A1 B1 C1 A2 B2 C2 utile : 2 × T tolère : aucune panne RAID 1 · miroir A B C A B C utile : T tolère : 1 disque RAID 5 · bandes + parité A1 B1 C1 A2 B2 Cp A3 Bp C2 Ap B3 C3 utile : (n − 1) × T, ici 3 × T tolère : 1 disque RAID 6 · double parité A1 B1 Cp A2 Bp Cq Ap Bq C1 Aq B2 C2 utile : (n − 2) × T, ici 2 × T tolère : 2 disques, n'importe lesquels RAID 10 · bandes sur miroirs A1 B1 C1 A1 B1 C1 A2 B2 C2 A2 B2 C2 miroir miroir utile : (n ÷ 2) × T, ici 2 × T tolère : 1 disque par miroir
Chaque colonne est un disque, T sa taille. En couleur, les blocs de parité : ils coûtent de la place mais permettent de recalculer un disque perdu.

Le RAID n’est pas une sauvegarde

Le RAID protège contre une seule chose : la panne matérielle d’un disque. Il ne protège pas contre :

  • un rm -rf au mauvais endroit (la suppression est recopiée aussitôt sur tous les disques) ;
  • un rançongiciel ou un fichier corrompu par une application ;
  • un incendie, un vol, une surtension qui grille tous les disques d’un coup.

Le RAID garde le service en marche. La sauvegarde, rangée ailleurs, permet de revenir en arrière. Il faut les deux.

Créer une grappe

Exemple : un miroir avec deux disques vides.

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
  • --create /dev/md0 : le nom du nouveau périphérique (md pour multiple devices) ;
  • --level=1 : le niveau de RAID ;
  • --raid-devices=2 : le nombre de disques actifs ;
  • à la fin, la liste des disques.

Ensuite /dev/md0 s’utilise comme n’importe quel disque : tu peux y poser un système de fichiers (mkfs.ext4 /dev/md0) ou en faire un PV pour LVM.

Contexte, pas à apprendre. Sur Debian, pour que la grappe garde son nom au redémarrage, on l’enregistre avec mdadm --detail --scan >> /etc/mdadm/mdadm.conf, puis on régénère l’initramfs avec update-initramfs -u.

Surveiller la grappe

/proc/mdstat, le coup d’œil

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdc[1] sdb[0]
      20954112 blocks super 1.2 [2/2] [UU]

Les deux choses à lire sont à la fin de la deuxième ligne :

  • [2/2] : 2 disques attendus, 2 disques actifs ;
  • [UU] : une lettre par disque. U comme up : le disque est en service.

Quand un disque tombe :

md0 : active raid1 sdc[1](F) sdb[0]
      20954112 blocks super 1.2 [2/1] [U_]
  • [2/1] : il n’en reste qu’un sur deux ;
  • [U_] : le tiret bas marque le disque manquant ;
  • (F) comme faulty : c’est sdc qui est en panne.

La grappe est dite dégradée : elle fonctionne encore, mais elle n’a plus de filet. Une panne de plus et les données sont perdues.

la grappe état et niveau disque n° 1 : en panne disque n° 0 md0 active raid1 sdc[1](F) sdb[0] [2/1] 2 attendus, 1 actif U _ case 0 case 1 les cases suivent les numéros entre crochets, pas l'ordre de la ligne
sdc est écrit en premier mais porte le numéro 1 : c'est la case 1, le tiret bas, qui le concerne.

mdadm --detail, le rapport complet

mdadm --detail /dev/md0
        Raid Level : raid1
             State : clean, degraded
    Active Devices : 1
    Failed Devices : 1

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       -       0        0        1      removed

       1       8       32        -      faulty   /dev/sdc

Tu y lis l’état global (State) et, en bas, l’état de chaque disque : active sync pour un disque sain, faulty pour un disque en panne.

Remplacer un disque en panne

Trois actions, toujours dans cet ordre, puis on attend.

mdadm /dev/md0 --fail /dev/sdc
mdadm /dev/md0 --remove /dev/sdc
  1. --fail déclare le disque défaillant. Si le noyau l’a déjà marqué (F), cette étape est déjà faite. Elle sert quand le disque donne des signes de faiblesse mais tourne encore.
  2. --remove sort le disque de la grappe. mdadm refuse de retirer un disque encore actif : d’où le --fail d’abord.

Tu remplaces alors le disque physique. Le nouveau s’appelle ici /dev/sdd.

mdadm /dev/md0 --add /dev/sdd
  1. --add fait entrer le nouveau disque. La reconstruction démarre toute seule : mdadm recopie les données sur le disque neuf.

Tu suis l’avancement dans /proc/mdstat :

$ cat /proc/mdstat
md0 : active raid1 sdd[2] sdb[0]
      20954112 blocks super 1.2 [2/1] [U_]
      [===>.................]  recovery = 17.3% (3630208/20954112) finish=1.4min

Pendant la reconstruction, la grappe reste utilisable, mais elle est toujours dégradée. Quand c’est fini, la ligne recovery disparaît et l’état revient à [2/2] [UU].

1. Sain sdb sdc [2/2] [UU] tout va bien 2. Panne sdb sdc [2/1] [U_] sdc marqué (F) 3. Retrait sdb --fail --remove sdc sorti 4. Ajout sdb sdd --add /dev/sdd recovery 17 % 5. Réparé sdb sdd [2/2] [UU] de nouveau protégé la grappe reste en service pendant toutes les étapes, mais sans filet de 2 à 4
Le tiret bas apparaît à la panne et ne disparaît qu'à la fin de la reconstruction, pas au moment du --add.

À retenir

  • Le RAID garde le service en marche quand un disque tombe. Ce n’est pas une sauvegarde.
  • RAID 0 : aucune panne tolérée. RAID 1 : miroir. RAID 5 : une panne, 3 disques minimum. RAID 6 : deux pannes, 4 disques minimum. RAID 10 : miroirs agrégés, 4 disques minimum.
  • Créer : mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc.
  • Surveiller : cat /proc/mdstat. [UU] = tout va bien, [U_] = un disque manque, (F) = disque en panne. Détail : mdadm --detail /dev/md0.
  • Remplacer : --fail, --remove, changement du disque, --add, puis on laisse la reconstruction finir.

Entraînement

12 questions, dont 3 à compléter. Tu réponds, on passe à la suivante. La note arrive à la fin.

Cartes · 8

Réviser les cartes ici

Espace : retourner