Tester – Remplacer un disque en panne dans un RAID

Constat d’une erreur sur l’écran du serveur ou via un mail du système :

Exemple de message d’erreur :
This is an automatically generated mail message from mdadm running on brawndo
A DegradedArray event had been detected on md device /dev/md1.
> /proc/mdstat file currently contains the following:

Personalities : [raid1]
md1 : active raid1 sdc2[1]
249869120 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sda1[2] sdc1[1]
498368 blocks super 1.2 [2/2] [UU]

Surveiller la fin de la réparation automatique (resync) dans le fichier /proc/mdstat

La réparation automatique peut prendre plusieurs minutes jusqu’à 1 heure…
Tant que la resync n’est pas à 100%  [UU] erreur résolue par le RAID ?  :     # more /proc/mdstat

NB : Voir aussi l’article du magazine Linux acheté à Bordeaux début décembre 2017 !!!

On peut archiver l’erreur de RAID miroring en exécutant la commande :

# cat /proc/mdstat > [date]-proc-mdstat.error

Si on a toujours : [ _U]  (erreur de RAID) …    ça devrait être [UU] si tout est “UP”…
>> Le md1 a perdu un disque : sda est plus ou moins HS.
Dans le doute, on peut remplacer le disque défectueux.

Vérifications supplémentaires :

# mdadm –detail /dev/md0
# mdadm –detail /dev/md1

Afficher un extrait de dmesg (display message) , commande très utile en cas de problème ou juste pour avoir des informations sur le matériel / drivers sur un système :

# dmesg | grep 'md'
[    1.651041] Refined TSC clocksource calibration: 3095.989 MHz.
[    1.651047] Switching to clocksource tsc
[    1.839664] md: md0 stopped.
[    1.840363] md: bind<sdc1>
[    1.840575] md: bind<sda1>
[    1.841346] md: raid1 personality registered for level 1
[    1.841452] bio: create slab <bio-1> at 1
[    1.841487] md/raid1:md0: active with 2 out of 2 mirrors
[    1.841502] md0: detected capacity change from 0 to 510328832
[    1.842657]  md0: unknown partition table
[    2.044854] md: md1 stopped.
[    2.045505] md: bind<sda2>
[    2.045674] md: bind<sdc2>
[    2.045686] md: kicking non-fresh sda2 from array!
[    2.045688] md: unbind<sda2>
[    2.066090] md: export_rdev(sda2)
[    2.067072] md/raid1:md1: active with 1 out of 2 mirrors
[    2.067084] md1: detected capacity change from 0 to 255865978880
[    2.088070]  md1: unknown partition table

Pour remplacer le disque défaillant, on doit connaître la taille minimum du nouveau disque :

# fdisk -l /dev/sda  (Si un disque est HS, executer fdisk sur l'autre)

Avant de sortir le disque défectueux /dev/sda du RAID, il faut :

2) le marquer “fault” dans md1 ET dans md0

# mdadm --manage /dev/md1 --fail /dev/sda2
# mdadm --manage /dev/md0 --fail /dev/sda1

Donc, voici maintenant l’état actuel du raid :

# cat /proc/mdstat
Personalities : [raid1] 
md1 : active raid1 sdc2[1]
      249869120 blocks super 1.2 [2/1] [_U]
      
md0 : active raid1 sda1[2](F) sdc1[1]
      498368 blocks super 1.2 [2/1] [_U]

2) Il faut maintenant “enlever” le device en fault du RAID (md0 ET md1):

# mdadm --manage /dev/md1 --remove /dev/sda2
mdadm: hot removed /dev/sda2 from /dev/md1
# mdadm --manage /dev/md0 --remove /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md0
root@brawndo:~# cat /proc/mdstat 

Personalities : [raid1] 
md1 : active raid1 sdc2[1]
      249869120 blocks super 1.2 [2/1] [_U]
md0 : active raid1 sdc1[1]
      498368 blocks super 1.2 [2/1] [_U]

Pour la suite, il faut installer un disque dur SATA neuf qui rentre dans la boîte (!).

Voici les caractéristiques de sdc pour refaire pareil sur un neuf :

# fdisk -l /dev/sdc

Disque /dev/sdc : 320.1 Go, 320072933376 octets
255 têtes, 63 secteurs/piste, 38913 cylindres, total 625142448 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x09feadbb
Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sdc1   *        2048      999423      498688   fd  RAID Linux autodétecté
/dev/sdc2          999424   501000191   250000384   fd  RAID Linux autodétecté

L’important est de refaire les même partitions avec les mêmes début/fin (au moins pour md0)

D’ailleurs si tu regardes le disque sda :

root@brawndo:~# fdisk -l /dev/sda

Disque /dev/sda : 500.1 Go, 500107862016 octets
255 têtes, 63 secteurs/piste, 60801 cylindres, total 976773168 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Identifiant de disque : 0xdc8415f9
Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *        2048      999423      498688   83  Linux
/dev/sda2          999424   501000191   250000384   fd  RAID Linux autodétecté

On voit encore les bonnes partitions, si ce n’est le type de la sda1.

Ensuite on peut faire # smartctl -a /dev/sda pour diagnostiquer le disque, voici un extrait :

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
 1 Raw_Read_Error_Rate     0x000f   104   099   006    Pre-fail  Always       -       7023648
 3 Spin_Up_Time            0x0003   100   100   000    Pre-fail  Always       -       0
 4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       32
 5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
 7 Seek_Error_Rate         0x000f   079   060   030    Pre-fail  Always       -       83887505
 9 Power_On_Hours          0x0032   051   051   000    Old_age   Always       -       43127
10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       31
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   066   047   045    Old_age   Always       -       34 (Min/Max 27/39)
194 Temperature_Celsius     0x0022   034   053   000    Old_age   Always       -       34 (0 16 0 0)
195 Hardware_ECC_Recovered  0x001a   017   017   000    Old_age   Always       -       7023648
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       43963285284982
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       1358926627
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       1235851680

En l’occurrence, il a 43127 heures de fonctionnement (power on), soit l’équivalent de 5 ans (diviser par 24h x 365j). C’est déjà pas mal !

On pourrait s’amuser à lancer un self-test pour voir mais je préfère ne pas trop jouer avec une machine qui tourne sur un seul disque ! Bref, entre les Pre-fail et les Old_age, il semble qu’on a bien à faire à un bon vieux disque dur…

D’ailleurs, c’est pareil pour l’autre, mais pas grave. On le remplacera quand il nous lâchera.

Prochaine étape, installer un beau disque tout neuf d’env. 500 Go à partitionner  avec fdisk ou mieux sfdisk, afin de faire la même table de partoches.

Rallumer le serveur avec le nouveau disque dur à la place de l’autre (non partitionné et non formatté : pas la peine) :

1) Lister les partitions pour ne pas se tromper de disque ! # fdisk -l

Disque /dev/sda : 55,9 GiB, 60022480896 octets, 117231408 secteurs
Identifiant de disque : 0x1231d40d

Disque /dev/sdb : 931,5 GiB, 1000204886016 octets, 1953525168 secteurs
Identifiant de disque : 0x4f61b4f9

Disque /dev/sdc : 465,8 GiB, 500107862016 octets, 976773168 secteurs
… Identifiant de disque : 0xdc8415f9

2) Cloner les (bonnes) partitions :

# sfdisk -d /dev/sdc | sfdisk /dev/sdb

3) Lister les partitions pour vérifier que le clônage est OK : $  fdisk -l

——— UUID ? : # blkid

Puis il faudra faire dessus (en admettant que c’est /dev/sdx) :

# mdadm --zero-superblock /dev/sdx  (pas fait KO mais ça passe qd meme)

Ensuite re-vérifie fdisk quand même… Tu dois avoir exactement :

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sdx1   *        2048      999423      498688   fd  RAID Linux autodétecté
/dev/sdx2          999424   501000191   250000384   fd  RAID Linux autodétecté

(sdx1 est bien bootable car elle sert de boot…)

Noter aussi son UUID et sa taille exacte pour être sûr de le trouver de façon fiable quand tu le mettras dans brawndo.

On peut aussi Agrandir le volume md1 du RAID : http://linux.1ere-page.fr/etendre-partition-lvm-a-taille-maximum-disque/

Ensuite, un jeu d’enfant, tu vas faire un truc du genre :

# mdadm --manage /dev/md0 --add /dev/sdx1

Tu attends la fin de la restauration des données sur le nouveau disque :

# watch cat /proc/mdstat

(CTR + C pour sortir) Ca doit aller vite sur celle-ci, c’est juste une petiote de boot. Puis tu fais pareil sur l’autre partoche :

# mdadm --manage /dev/md1 --add /dev/sdx2
# watch cat /proc/mdstat

C’est plus long, d’où l’intérêt du watch toutes les 2s.

C’est pas tout à fait fini, pour couronner le tout, on installe grub sur le nouveau disque, sinon ça sert à rien de se prendre la tête à faire du raid à part pour le boot :

# grub-install /dev/sdx

C’est tout… Merci les nouvelles versions de grub !

Pour vérifier ce tuto, regarde https://www.howtoforge.com/replacing_hard_disks_in_a_raid1_array

Et normalement, maintenant t’as un nouveau RAID mirroring fonctionnel et rien à faire sur l’OS, les données, les packets, les users,… C’est merveilleux non ?

Email reçu d’Anatole le 31/10/2017 : Merci à lui !!!