Cet article présente la manipulation permettant de remplacer un disque dur dans une grappe RAID1 avec mdadm pour le système de fichiers Linux racine utilisé pour booter. Si vous êtes dans cette configuration avec un serveur Kimsufi ou OVH et que vous ne souhaitez pas faire de fausse manipulation à distance, cet article est pour vous.
Tout d’abord, les disques durs sont généralement remplacés dans une grappe RAID lorsqu’il sont défectueux, ou encore mieux dès lors qu’ils montrent les premiers signes de fatigue selon leurs attributs SMART.
La difficulté de la manipulation qui suit est de conserver le caractère bootable du RAID qui contient la partition Linux racine dont le /boot. Et cela, dans le but de redonder les données de la racine / autant que /boot.
Retrait du disque souhaité
Le disque dur le plus mal en point pourra être marqué « défaillant » puis retiré de la grappe RAID comme ceci. L’option --set-faulty est équivalente à --fail ou -f .
1 2 |
# mdadm --manage /dev/md1 --set-faulty /dev/sda1 # mdadm --manage /dev/md1 --remove /dev/sda1 |
Éventuellement vous pouvez éteindre l’ordinateur, remplacer le disque dur et redémarrer. Avec un peu de chance, mdadm détectera le retrait du disque dur.
On peut ainsi voir l’état du RAID comme ceci avec le fameux [_U] qui signifie qu’un disque est défaillant.
1 2 3 4 5 |
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty] md1 : active raid1 sda1[2] sdb1[1] 974661568 blocks [2/1] [_U] [...] |
Préparation du disque dur de remplacement
Respect de la table des partitions
Selon les distributions Linux et les installations, on peut constituer le RAID à partir de disques durs entiers ou de partitions de disque dur au format fd « Linux raid autodetect ». L’utilisation de partitions confère un avantage : on peut affecter des portions de disques durs au RAID, comme par exemple une partition pour la racine / et une autre pour le SWAP. Si les disques durs sont de tailles différentes, on pourra utiliser une partition et limiter sa taille au plus petit des deux disques.
Les préconisations standard appellent à utiliser le type de partition fd (Linux raid autodetect) et à utiliser l’indicateur d’amorçage sur la partition (commande a sur fdisk, et astérisque dans la colonne Boot). A ce jour j’ignore si cela est vraiment nécessaire pour booter sur le RAID1 ou pas.
Le bon sens veut également que le disque dur de remplacement ait strictement la même table de partitions que le disque d’origine. A mon avis on pourrait utiliser des partitions plus grosses, mais c’est un cas que je n’ai pas testé.
Voici une commande permettant de copier la tables des partitions du disque sdb vers sda avec le respect de l’indicateur d’amorçage (adapter en fonction de votre cas de figure).
1 |
# sfdisk -d /dev/sdb | sfdisk /dev/sda |
Ajout de la partition à la grappe
La commande d’ajout de la partition à la grappe RAID1 est simple :
1 |
# mdadm --manage /dev/md1 --add /dev/sda1 |
On vérifie ensuite que le processus suit son cours.
1 2 3 4 5 6 |
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty] md1 : active raid1 sda1[2] sdb1[1] 974661568 blocks [2/1] [_U] [=========>...........] recovery = 45.6% (445062208/974661568) finish=89.9min speed=98168K/sec bitmap: 5/8 pages [20KB], 65536KB chunk |
Lorsque cela est terminé le fichier mdstat doit se trouver comme ceci (on remarque le [UU] qui indique que deux disques sont dans le RAID).
1 2 3 4 5 6 7 |
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty] md1 : active raid1 sda1[0] sdb1[1] 974661568 blocks [2/2] [UU] bitmap: 4/8 pages [16KB], 65536KB chunk unused devices: <none> |
Vérification du MBR et de la table des partitions
La commande mdadm --examine --verbose doit afficher un résultat différent selon si elle est lancée sur un disque ou une partition.
Sur un disque :
1 2 3 4 |
/dev/sda: MBR Magic : aa55 Partition[0] : 1949323264 sectors at 4096 (type fd) Partition[1] : 4192256 sectors at 1949327360 (type 82) |
Sur une partition :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# mdadm --examine --verbose /dev/sda1 /dev/sda1: Magic : a92b4efc Version : 0.90.00 UUID : d887ee84:78542344:a4d2adc2:26fd5302 Creation Time : Fri Nov 25 10:15:38 2016 Raid Level : raid1 Used Dev Size : 974661568 (929.51 GiB 998.05 GB) Array Size : 974661568 (929.51 GiB 998.05 GB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 1 Update Time : Wed Nov 21 14:24:43 2018 State : clean Internal Bitmap : present Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Checksum : b41fa1a6 - correct Events : 89201 Number Major Minor RaidDevice State this 0 8 1 0 active sync /dev/sda1 0 0 8 1 0 active sync /dev/sda1 1 1 8 17 1 active sync /dev/sdb1 |
Si vous ne constatez pas cette différence sur un des disques durs, vous avez probablement oublié de dupliquer la table des partitions avant d’ajouter le disque à l’array RAID. Le redémarrage du serveur échouera probablement sur le disque en question.
Installation du chargeur de démarrage GRUB
Le chargeur de démarrage GRUB doit se trouver sur tous les disques qui constituent le RAID1 logiciel. Le BIOS ne pouvant pas voir d’array RAID /dev/md1 il démarrera sur l’un des disques durs qui constituent le RAID. Pour cette raison, GRUB sait booter sur du RAID1 en n’utilisant qu’un des disques durs, mais il ne sait pas booter sur du RAID0 ou RAID5. Le cas du RAID matériel est différent puisqu’il trombe le BIOS en lui faisant croire que le RAID est un disque physique.
1 |
# dpkg-reconfigure grub-pc |
Alternativement on peut peut lancer grub-install /dev/sda et grub-install /dev/sdb .
Préalablement, il n’est pas idiot de regénérer l’image initrd avec update-initramfs -u et de recréer la configuration GRUB avec update-grub2 .
Si vous rencontrez un message du type Impossible de trouver le volume physique « (null) » ou Couldn’t find physical volume `(null)’, cela est du au cache sda1 et sdb1 qui n’est pas cohérent. Cela peut se résoudre avec la commande blockdev --flushbufs /dev/sda1 (source).