Aller au contenu
Sylvain Joffraud l4w
Retour

Réparer un RAID1 mdadm sur n’importe quel PC Linux

L’alimentation de mon NAS lâche en pleine opération sur son RAID1. Le réflexe serait d’attendre une nouvelle alim pour reprendre. Erreur : le NAS est mort, mais ses disques et ses données ne le sont pas, et le RAID n’a rien qui le lie à cette machine. Je sors les deux disques, je les branche sur mon PC de bureau via des adaptateurs USB-SATA, et je continue tout le travail de stockage depuis là.

L’identité d’un array est sur les disques, pas sur la machine

C’est le principe qui rend tout ça possible. Avec les métadonnées md 1.2, chaque partition membre porte un superbloc qui contient l’UUID de l’array, le nom, le rôle du membre, la taille, le layout — tout. N’importe quel Linux relit ces superblocs et reconstitue l’array par UUID. Rien n’est stocké dans la machine d’origine.

Concrètement, il suffit de brancher les disques : udev déclenche l’auto-assemblage.

$ cat /proc/mdstat
md125 : active raid1 sda2[3]
      8379392 blocks super 1.2 [2/1] [_U]
md126 : active (auto-read-only) raid1 sda3[2]
      ...

Les numéros md12x ne sont pas ceux du NAS — normal, ils sont attribués dynamiquement. On repère les arrays par leur rôle/UUID, pas par leur numéro :

lsblk -o NAME,SIZE,FSTYPE,LABEL   # les LABEL portent hostname:root / :swap / :data
sudo mdadm --detail /dev/md125 | grep -E "UUID|Name|State"

Ce qu’on peut faire, disques posés sur le bureau

Une fois l’array assemblé, on a accès à toute la boîte à outils md/ext4, exactement comme sur la machine d’origine :

Réparer un filesystem malmené par des arrêts brutaux :

sudo fsck.ext4 -n -f /dev/md125   # d'abord en lecture seule pour voir
sudo fsck.ext4 -y -f /dev/md125   # puis réparation

Remplacer un membre défaillant et resynchroniser :

sudo mdadm --add /dev/md125 /dev/sdb2
sudo mdadm --readwrite /dev/md125   # démarre la recovery si l'array est auto-read-only

Agrandir l’array vers des disques plus gros, puis le filesystem :

sudo mdadm --grow /dev/md125 --size=max
sudo resize2fs /dev/md125

Extraire des données sans rien modifier, en montant en lecture seule :

sudo mdadm --assemble --readonly /dev/md0 /dev/sdX2
sudo mount -o ro /dev/md0 /mnt/rescue

Quand tout est fait, on arrête proprement les arrays avant de débrancher (flush + marquage clean), puis on remet les disques dans la machine réparée — où ils se réassemblent par UUID, sans aucune reconfiguration :

sudo mdadm --stop /dev/md125 /dev/md126 /dev/md127
sync

Deux ou trois pièges

Lessons learned

Questions fréquentes

Peut-on assembler un RAID mdadm sur une autre machine que celle d’origine ?
Oui, sans reconfiguration. Les métadonnées md 1.2 (UUID de l’array, rôle de chaque membre, taille, layout) vivent dans un superbloc écrit sur chaque partition. N’importe quel Linux avec mdadm les relit et assemble l’array par UUID — mdadm --assemble --scan ou l’auto-assemblage udev suffisent. Le contrôleur, la baie ou la machine d’origine n’ont aucune importance.
Mon NAS ou serveur est en panne matérielle, comment récupérer les données d’un RAID1 ?
Sortez les disques et branchez-les sur un PC Linux via des adaptateurs USB-SATA. L’array s’assemble par UUID (vérifiez cat /proc/mdstat). Pour extraire sans rien risquer, montez en lecture seule : mdadm --assemble --readonly puis mount -o ro /dev/mdX /mnt. Un seul disque d’un miroir RAID1 suffit à tout lire.
Pourquoi mon array RAID apparaît « inactive » quand je ne branche qu’un seul disque du miroir ?
Avec un seul membre présent, mdadm assemble l’array mais ne le démarre pas automatiquement (il le voit comme incomplet, le membre est marqué (S) spare). Activez-le en dégradé avec sudo mdadm --run /dev/mdX. Il passera en active … [U_] et sera lisible et réparable.
Les numéros md (md125, md126, md127) changent d’une machine à l’autre, est-ce un problème ?
Non, c’est purement cosmétique. Le noyau attribue ces numéros dynamiquement à l’assemblage. L’identité réelle d’un array est son UUID et son nom (champ name du superbloc, ex. hostname:data). Repérez toujours vos arrays par rôle/UUID via mdadm --detail ou lsblk, jamais par le numéro md.

Partager cet article :

Article précédent
Serveur qui boote mais injoignable : le `fsck` de boot
Article suivant
SATA `PHYRdyChg` + 0 CRC : c’est l’alim, pas le disque