Aller au contenu

Remplacer un disque dur dans un RAID avec mdadm

Ce guide montre comment retirer un disque failed d’un RAID1 Linux et le remplacer par un nouveau disque à chaud.

Mon disque /dev/sdb est défaillant (SMART remonte de nombreuses erreurs, état « Disk Failing »). Je choisis de le changer par prévention.

Les disques /dev/sda et /dev/sdb forment 2 RAID1, /dev/md0 et /dev/md1 :

/dev/sda2 + /dev/sdb2 = /dev/md0
/dev/sda3 + /dev/sdb3 = /dev/md1

Voici l’arborescence avec lsblk :

lsblk
sda 8:0 0 223.6G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part
│ └─md0 9:0 0 1022M 0 raid1
│ └─md0p1 259:5 0 1020M 0 part /boot
└─sda3 8:3 0 220G 0 part
└─md1 9:1 0 219.9G 0 raid1
└─md1p1 259:6 0 219.9G 0 part /
sdb 8:16 0 232.9G 0 disk
├─sdb1 8:17 0 1M 0 part
├─sdb2 8:18 0 1G 0 part
│ └─md0 9:0 0 1022M 0 raid1
│ └─md0p1 259:5 0 1020M 0 part /boot
└─sdb3 8:19 0 220G 0 part
└─md1 9:1 0 219.9G 0 raid1
└─md1p1 259:6 0 219.9G 0 part /

On marque d’abord le disque comme failed, dans les deux RAID :

Fenêtre de terminal
mdadm --manage /dev/md0 --fail /dev/sdb2
mdadm --manage /dev/md1 --fail /dev/sdb3

On vérifie que le disque est bien marqué comme failed :

cat /proc/mdstat
md1 : active raid1 sda3[1] sdb3[2](F)
230554624 blocks super 1.2 [2/1] [U_]
md0 : active raid1 sda2[2] sdb2[3](F)
1046528 blocks super 1.2 [2/1] [U_]

Dans les deux RAID, un seul disque est actif (U_) et (F) signale le disque défaillant. Avec les deux disques présents et fonctionnels, on verrait UU.

On peut maintenant retirer le disque du RAID :

Fenêtre de terminal
mdadm --manage /dev/md0 --remove /dev/sdb2
mdadm --manage /dev/md1 --remove /dev/sdb3

Il a bien disparu des deux RAID :

cat /proc/mdstat
md1 : active raid1 sda3[1]
230554624 blocks super 1.2 [2/1] [U_]
md0 : active raid1 sda2[2]
1046528 blocks super 1.2 [2/1] [U_]

Si la machine le supporte, on remplace le disque à chaud. Le nouveau disque apparaît sans partitions : il faut les recréer avant de reconstruire le RAID.

lsblk
sda 8:0 0 223.6G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part
│ └─md0 9:0 0 1022M 0 raid1
│ └─md0p1 259:5 0 1020M 0 part /boot
└─sda3 8:3 0 220G 0 part
└─md1 9:1 0 219.9G 0 raid1
└─md1p1 259:6 0 219.9G 0 part /
sdb 8:16 0 232.9G 0 disk

On a besoin de gdisk, si ce n’est pas déjà fait :

Fenêtre de terminal
apt install gdisk

On sauvegarde la table des partitions. Ce n’est pas obligatoire mais très fortement recommandé :

Fenêtre de terminal
sgdisk --backup=/root/sda.partitiontable /dev/sda
sgdisk --backup=/root/sdb.partitiontable /dev/sdb

En cas de problème, on peut restaurer le schéma avec l’option --load-backup.

On copie ensuite le schéma de partitions de sda vers sdb :

Fenêtre de terminal
sgdisk -R /dev/sdb /dev/sda

On randomise le GUID du nouveau disque, qui a été copié de sda avec le schéma :

Fenêtre de terminal
sgdisk -G /dev/sdb

On vérifie que les partitions ont bien été copiées :

lsblk
sdb 8:16 0 232.9G 0 disk
├─sdb1 8:17 0 1M 0 part
├─sdb2 8:18 0 1G 0 part
└─sdb3 8:19 0 220G 0 part

Les partitions sont créées, on reconstruit le RAID :

Fenêtre de terminal
mdadm --manage /dev/md0 --add /dev/sdb2
mdadm --manage /dev/md1 --add /dev/sdb3

La synchronisation démarre ; on suit son avancement avec :

Fenêtre de terminal
cat /proc/mdstat

Synchronisation du RAID dans /proc/mdstat

Bien joué, le disque est remplacé !