Base de connaissances · Serveurs dédiés et VPS

Gestion du RAID logiciel sous Linux (partie II) : récupération après une panne de disque

Dernière mise à jour : 2019-02-03

Gestion du RAID logiciel sous Linux (partie II) : récupération après une panne de disque

Cet article vous explique comment récupérer un RAID logiciel Linux en cas de panne d'un seul disque. Pour les exemples suivants, nous partons des hypothèses ci-dessous :

  • Vous utilisez la version la plus récente de Linux (CentOS 5+).
  • Vous disposez de deux (2) disques durs (sda, sdb) connectés à un contrôleur SAS/SATA qui n'est pas un RAID matériel Linux.
  • Vous utilisez le RAID logiciel Linux (MD).
  • Vous avez deux (2) grappes RAID1, à savoir :
    • md0 (sda1+sdb1) : /boot
    • md1 (sda2+sdb2) : LVM
  • L'une de vos grappes est dégradée mais opérationnelle (panne d'un seul membre uniquement).
  • Vous disposez d'un accès root complet.


Vérification de l'état de santé


Vérifiez l’état de santé de vos disques. Vous devriez obtenir les résultats suivants, selon l’état de vos disques :

Grappe RAID en bon état

cat /proc/mdstat

Personalities : [raid1]

md0 : active raid1 sdb1[1] sda1[0]

      511988 blocks super 1.0 [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]

      976247676 blocks super 1.1 [2/2] [UU]

      bitmap: 1/8 pages [4KB], 65536KB chunk

unused devices: <none>

 

Notez que les deux grappes (md0, md1) sont :

    1. Actives
    2. Composées de deux membres : sdb1[1], sda1[0]
    3. Deux membres sur deux sont opérationnels : [2/2] [UU]

 

cat /proc/partitions

major    minor     #blocks  name

   8          0               976762584 sda

   8          1              512000 sda1

   8          2               976248832 sda2

   8         16             976762584 sdb

   8         17             512000 sdb1

   8         18            976248832 sdb2

   9          1              976247676 md1

 253        0              2097152 dm-0

 253        1              2097152 dm-1

   9          0               511988 md0

 

Notez que les conditions suivantes doivent être remplies :

    1. Les deux disques physiques sont présents : sda, sdb
    2. Les deux grappes RAID sont présentes : md0, md1
    3. Les deux disques ont la même taille : sda = sdb = 976762584
    4. Les deux disques sont partitionnés de la même manière :
    • sda1 = sdb1 = 512000
    • sda2 = sdb2 = 976248832

 

Grappe RAID dégradée


Défaillance d'une seule partition (sda1)

Personalities : [raid1]

md0 : active raid1 sdb1[1] sda1[0](F)

     511988 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1] sda2[0]

     976247676 blocks super 1.1 [2/2] [UU]

     bitmap: 0/8 pages [0KB], 65536KB chunk

unused devices: <none>

 

Remarque : une ou plusieurs grappes RAID afficheront des membres manquants : [2/1] [_U]


Défaillance d'un disque entier (sda)

Personalities : [raid1]

md0 : active raid1 sdb1[1] sda1[0](F)

      511988 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1] sda2[0](F)

      976247676 blocks super 1.1 [2/1] [_U]

      bitmap: 1/8 pages [4KB], 65536KB chunk

unused devices: <none>

En cas de défaillance grave, ou si un disque ne s'initialise pas au redémarrage du système, le disque lui-même peut disparaître, comme le montrent les exemples ci-dessous.


Disque manquant : 
/proc/mdstat

Personalities : [raid1]

md0 : active raid1 sdb1[1]

      511988 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1]

      976247676 blocks super 1.1 [2/1] [_U]

      bitmap: 1/8 pages [4KB], 65536KB chunk

unused devices: <none>

 

Disque manquant : /proc/partitions

major   minor    #blocks  name

   8        16             976762584 sdb

   8        17             512000 sdb1

   8        18             976248832 sdb2

   9          1             976247676 md1

 253        0              2097152 dm-0

 253        1             2097152 dm-1

   9         0              511988 md0

 

Retrait d'un disque défaillant

Manually marking devices as ‘failed’

Vous ne devez marquer manuellement un périphérique comme défaillant que si l'une de ses grappes RAID est dans un état dégradé à la suite d'un délai d'attente dépassé ou d'une erreur de lecture sur l'une des partitions. Le disque physique lui-même doit toujours fonctionner correctement.

    • Consultez /proc/mdstat and make sure that all of the partitions on the failed disk is set as ‘faulty.’

ATTENTION : veillez à ne déclarer défaillantes que les partitions appartenant au disque défaillant concerné (c'est-à-dire sda1/sda2 pour sda et sdb1/sdb2 pour sdb).

Définissez sda1 et sda1 comme faulty

[root@freshinstall ~]# mdadm --manage /dev/md0 --fail /dev/sda1

mdadm: set /dev/sda1 faulty in /dev/md0

 

[root@freshinstall ~]# mdadm --manage /dev/md1 --fail /dev/sda2

mdadm: set /dev/sda2 faulty in /dev/md1

 

    • Vérifiez que les deux partitions du même disque sont bien marquées comme défaillantes.

Dans cat /proc/mdstat

Personalities : [raid1]

md0 : active raid1 sdb1[1] sda1[0](F)

      511988 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1] sda2[0](F)

      976247676 blocks super 1.1 [2/1] [_U]

      bitmap: 1/8 pages [4KB], 65536KB chunk

unused devices: <none>

 

Retrait des périphériques défaillants de la grappe

Avant de remplacer un disque, les membres défaillants doivent être retirés des grappes RAID correspondantes :

    • Retirer les membres défaillants :

[root@freshinstall ~]# mdadm --manage /dev/md0 --remove /dev/sda1

mdadm: hot removed /dev/sda1 from /dev/md0

 

[root@freshinstall ~]# mdadm --manage /dev/md1 --remove /dev/sda2

mdadm: hot removed /dev/sda2 from /dev/md1

 

[root@freshinstall ~]# cat /proc/mdstat

Personalities : [raid1]

md0 : active raid1 sdb1[1]

      511988 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1]

      976247676 blocks super 1.1 [2/1] [_U]

      bitmap: 1/8 pages [4KB], 65536KB chunk

unused devices: <none>

 

    • Veillez à effacer les superblocs RAID si vous prévoyez de rajouter les mêmes partitions à la grappe ou de les réutiliser à d'autres fins :

 [root@freshinstall ~]# mdadm --misc --zero-superblock /dev/sda1

[root@freshinstall ~]# mdadm --misc --zero-superblock /dev/sda2

 

    • Vous pouvez également choisir d'effacer toutes les données du disque avant de le mettre au rebut, à condition que le disque physique fonctionne encore :

dd if=/dev/zero of=/dev/sda bs=1M

ATTENTION : cette opération efface toutes les données du périphérique indiqué par l'argument « of= » (/dev/sda dans l'exemple ci-dessus).

Remarque : cette opération peut prendre un certain temps.

 

Ajout d'un disque de remplacement

Le disque de remplacement doit avoir exactement la même taille que le disque défaillant, ou une taille supérieure. Une fois le disque de remplacement inséré dans le système, le noyau consignera un message similaire à celui-ci :

dmesg | tail

sd 0:0:0:0: [sdc] 1953525168 512-byte logical blocks: (1.00 TB/931 GiB)

sd 0:0:0:0: [sdc] 4096-byte physical blocks

sd 0:0:0:0: [sdc] Write Protect is off

sd 0:0:0:0: [sdc] Mode Sense: 00 3a 00 00

sd 0:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA


Vérifiez que le système détecte le nouveau disque (sdc dans ce cas) :

cat /proc/partitions

major   minor    #blocks  name

 

   8        16             976762584 sdb

   8        17               512000 sdb1

   8        18             976248832 sdb2

   9         1               976247676 md1

 253        0               2097152 dm-0

 253        1              2097152 dm-1

   9         0                511988 md0

   8         0                976762584 sdc

Vérifiez l'état SMART du nouveau disque :

smartctl -H /dev/sdc

smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)

Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

 

=== START OF READ SMART DATA SECTION ===

SMART overall-health self-assessment test result: PASSED

 

Partitionnement

Pour commencer le partitionnement, vérifiez d'abord que le nouveau disque n'a pas été monté automatiquement :

  mount | grep sdc

Aucune sortie ne devrait s'afficher. Si quelque chose apparaît, les partitions correspondantes doivent être démontées manuellement en exécutant la commande suivante :

umount <partition>

Le système initial utilisant deux disques en miroir de taille strictement identique, nous pouvons utiliser le disque opérationnel comme modèle pour le partitionnement :

sfdisk -d -uS /dev/sdb | sfdisk -L -uS /dev/sdc

Checking that no-one is using this disk right now ...

OK

 

Disk /dev/sdc: 121601 cylinders, 255 heads, 63 sectors/track

Old situation:

Unités = secteurs de 512 octets, à partir de 0

 

Device Boot    Start       End   #sectors  Id  System

/dev/sdc1   *      2048   1026047    1024000  fd  Linux raid autodetect

/dev/sdc2       1026048 1953523711 1952497664  fd  Linux raid autodetect

/dev/sdc3             0         -          0   0  Empty

/dev/sdc4             0         -          0   0  Empty

Nouvelle situation :

Unités = secteurs de 512 octets, à partir de 0

 

Device Boot    Start       End   #sectors  Id  System

/dev/sdc1   *      2048   1026047    1024000  fd  Linux raid autodetect

/dev/sdc2       1026048 1953523711 1952497664  fd  Linux raid autodetect

/dev/sdc3             0         -          0   0  Empty

/dev/sdc4             0         -          0   0  Empty

Avertissement : la partition 1 ne se termine pas à une limite de cylindre

Avertissement : la partition 2 ne commence pas à une limite de cylindre

Avertissement : la partition 2 ne se termine pas à une limite de cylindre

La nouvelle table de partitions a été écrite avec succès

 

Relecture de la table de partitions en cours ...

 

Si vous avez créé ou modifié une partition DOS, par exemple /dev/foo7, utilisez dd(1)

pour mettre à zéro les 512 premiers octets :  dd if=/dev/zero of=/dev/foo7 bs=512 count=1

(Voir fdisk(8).)

 

Ensuite, vous devriez pouvoir voir votre disque nouvellement partitionné :

cat /proc/partitions

major   minor   #blocks  name

 

   8       16               976762584 sdb

   8       17                 512000 sdb1

   8       18              976248832 sdb2

   9        1                976247676 md1

 253        0              2097152 dm-0

 253        1                2097152 dm-1

   9        0                  511988 md0

   8        0                976762584 sdc

   8        1                   512000 sdc1

   8        2                 976248832 sdc2

 

Ajout de nouveaux périphériques à la grappe RAID

 [root@freshinstall ~]# mdadm --manage /dev/md0 --add /dev/sdc1

mdadm: added /dev/sdc1

 

[root@freshinstall ~]# mdadm --manage /dev/md1 --add /dev/sdc2

mdadm: added /dev/sdc2

 

[root@freshinstall ~]# cat /proc/mdstat

Personalities : [raid1]

md0 : active raid1 sdc1[2] sdb1[1]

      511988 blocks super 1.0 [2/2] [UU]

md1 : active raid1 sdc2[2] sdb2[1]

      976247676 blocks super 1.1 [2/1] [_U]

      [>....................]  recovery =  0.1% (1618176/976247676) finish=160.6min speed=101136K/sec

      bitmap: 1/8 pages [4KB], 65536KB chunk

unused devices: <none>

Remarque : les deux grappes comptent chacune deux membres actifs et md1 est en cours de reconstruction.

 

Réinstallation du chargeur d'amorçage

Une fois le disque défaillant remplacé, réinstallez GRUB dans le MBR du nouveau disque afin de vous assurer que vous pouvez démarrer à partir de celui-ci :

grub-install /dev/sdc

Installation terminée. Aucune erreur signalée.

Voici le contenu de la table de correspondance des périphériques /boot/grub/device.map.

Vérifiez si elle est correcte. Si l'une des lignes est incorrecte,

corrigez-la et relancez le script `grub-install'.

 

# this device map was generated by anaconda

(hd0)     /dev/sdc

(hd1)     /dev/sdb

 

← Tous les articles de la base de connaissances

Tell us what you need

Compare available plans or describe your workload so we can discuss a suitable starting point.