Mdadm

De Wiki doc


Mdadm est un outil intégré au noyau Linux permettant de faire du RAID logiciel. Il est utilisé par l'installeur Debian pour configurer un RAID d’amorçage.

Avant propos

Sur mon serveur, un disque dur de la grappe RAID 1 est tombé en panne. Aucune perte de données n'est à déploré du fait de la réplication des deux disques mais il a bien fallut le remplacer. C'est ce que je vais expliquer dans ce document en utilisant une machine virtuelle comportant 2 disques dur en RAID 1, chiffrés avec Cryptsetup et comportant des partions LVM.

ASTUCE

Afin de simuler la perte d'un disque dur, il est possible d'utiliser la commande suivante: mdadm --manage /dev/md0 --fail /dev/sdb1.

Remise en œuvre d'une grappe RAID 1

Configuration matérielle

  • On a une machine virtuelle Debian installée avec deux grappes RAID 1 mdadm (md0 pour le /boot et md1 pour le /) exploitant les deux disques sda et sdb.
  • Le disque sda tombe en panne
  • La grappe RAID passe en état inactif

Conduite à tenir

  • À ce stade, la machine ne voudra plus démarrer correctement. Il faut restaurer l'état du RAID
  • On éteint la machine et on débranche le disque défaillant (du coup sdb devient le nouveau sda au prochain démarrage)
  • La grappe RAID étant en état inactif, l'initramfs ne démarre plus (on est dans ash, le shell du ram disque de démarrage). Il faut repasser les grappes en état actif:
mdadm --manage /dev/md0 --run
mdadm --manage /dev/md1 --run

INFORMATION

l'état des grappe RAID est visualisable dans le fichier spécial dédié avec ceci: cat /proc/mdstat.

Une fois ceci fait, nous pouvons sortir de l'initramfs pour continuer le démarrage.

exit

Cryptsetup nous invite à taper le mot de passe. Le système démarre (et ce sera toujours le cas vu que les grappes sont passées en état actif) et LVM se démerde tout seul.

Changement d'un disque dur défaillant

Une fois dans le système il est possible de voir le détail des grappes avec:

mdadm --detail /dev/md0
mdadm --detail /dev/md1

On remarque alors qu'un des disque est en état removed (il s'agit de l'ancien disque dur que l'on a débranché). Suivez les étapes suivantes:

  • Éteindre le serveur (je conseil de ne pas faire le branchement du nouveau disque à chaud afin que Linux remette les mêmes noms de périphérique /dev (sda et sdb)
  • Installer le nouveau disque dur et démarrer

Il va falloir copier le schéma de partition sur le nouveau disque.

Pour un MBR

sfdisk -d /dev/sdb | sfdisk /dev/sda

Pour un GPT (paquet "gdisk")

sgdisk /dev/sdb -R /dev/sda
sgdisk -G /dev/sda

le -R copie la table GPT du disque sdb vers sda tandis que le -G génère un nouveau GUID aléatoirement.

Vérifier le résultat

lsblk

ou

fdisk -l

Ajouter le nouveau disque aux grappes

mdadm --manage /dev/md0 --add /dev/sda1
mdadm --manage /dev/md1 --add /dev/sda2

De là, la réplication commence automatiquement en arrière plan (vous pouvez entendre vos disques dur gratter à mort).

ATTENTION

Laisser la synchronisation se faire et contrôler régulièrement l'avancée avant de faire une opération à la con du style redémarrer la machine et enlever un disque pour voir si ça fonctionne... il convient de faire régulièrement un cat /proc/mdstat pour afficher l'état de la reconstruction.


Je conseil également de ne pas utiliser la machine pendant ce temps afin de ne pas se retrouver avec le deuxième disque dur en panne car là c'est tout perdu...

À l'issue, installer Grub sur le nouveau disque pour que ça démarrer lors de la prochaine panne (oui oui ça vous arriveras, ne faites pas les malins).

grub-install /dev/sda

Vérifier l'intégrité de la réplication

En production, il peut être intelligent de vérifier de temps à autre la bonne intégrité de la synchronisation des deux disques. Cette étape se nomme "scrub" et s'effectue en arrière plan après initialisation.

Lancer un scrub

echo check > /sys/block/mdX/md/sync_action

Vérifier l'avancée

cat /proc/mdstat

Les données erronées seront automatiquement corrigés.

L'interrompre

echo idle > /sys/block/mdX/md/sync_action

Sur un RAID 5 ou 6 on utilisera plutôt cette façon de faire:

echo repair > /sys/block/mdX/md/sync_action

Source de la section

Sources