Changement de disque en RAID1 soft

Sur un serveur installé en Debian Lenny, quand un disque est cassé et qu'on a du RAID1, on peut le remplacer tandis que la machine continue de travailler. Mais voilà, il faut lui dire qu'on change le disque et quand on a du SCSI, tout peut se faire à chaud.

Voici la situation des disques et du RAID soft sur le serveur au moment du crash:

  • Un disque SCSI de 36Go nommé /dev/sda, il est en panne et va être remplacé
  • Un disque SCSI de 73Go nommé /dev/sdb
  • 4 miroirs (RAID1) en md utilisant des partitions de tailles identiques sur chaque disque

L'article sur le NAS maison montre comment configurer du RAID soft, on ne parlera donc pas de la configuration initiale du RAID. D'ailleurs, la configuration RAID de la machine prise en exemple a été faite lors de l'installation de Debian Lenny.

Les tables de partitions :

# fdisk -l
Disk /dev/sdb: 73.4 GB, 73407865856 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000bd94b
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         608     4883728+  fd  Linux raid autodetect
/dev/sdb2             609         851     1951897+  fd  Linux raid autodetect
/dev/sdb3             852        1094     1951897+  fd  Linux raid autodetect
/dev/sdb4            1095        8924    62894475    5  Extended
/dev/sdb5            1095        4425    26756226   fd  Linux raid autodetect
/dev/sdb6            4426        8924    36138186   83  Linux
Disk /dev/md0: 5000 MB, 5000855552 bytes
2 heads, 4 sectors/track, 1220912 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md0 doesn't contain a valid partition table
Disk /dev/md1: 1998 MB, 1998651392 bytes
2 heads, 4 sectors/track, 487952 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md2: 1998 MB, 1998651392 bytes
2 heads, 4 sectors/track, 487952 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md2 doesn't contain a valid partition table
Disk /dev/md3: 27.3 GB, 27398307840 bytes
2 heads, 4 sectors/track, 6689040 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md3 doesn't contain a valid partition table

On remarque :

  • On ne voit plus /dev/sda
  • Comme sdb fait 73Go, l'excédant est utilisé pour une partition logique sdb6
  • Le type de partition est “Linux raid autodetect” pour pouvoir les mettre dans des raid soft.

Voici le status du RAID soft:

# cat /proc/mdstat 
Personalities : [raid1] 
md3 : active raid1 sda4[2](F) sdb5[1]
      26756160 blocks [2/1] [_U]
md2 : active raid1 sda3[2](F) sdb3[1]
      1951808 blocks [2/1] [_U]
md1 : active raid1 sda2[2](F) sdb2[1]
      1951808 blocks [2/1] [_U]
md0 : active raid1 sda1[2](F) sdb1[1]
      4883648 blocks [2/1] [_U]
unused devices: <none>

Remplacement et détection du nouveau disque

Le fait d'arracher l'ancien disque et mettre le nouveau à la place ne fait rien. Il faut dire au noyau de rescanner le bus SCSI. Des outils sympathiques pour faire ça sont fournis dans le paquet scsitools :

# aptitude install scsitools

On utilise le script rescan-scsi-bus.sh fraichement installé pour rescanner le bus SCSI, en lui demandant de supprimer ce qui a disparu, ce qui donne quelque chose proche de :

# rescan-scsi-bus.sh -r
Host adapter 0 (aic79xx) found.
Host adapter 1 (aic79xx) found.
Scanning SCSI subsystem for new devices
 and remove devices that have disappeared
Scanning host 0 channels 0 for  SCSI target IDs  0 1 2 3 4 5 6 7, all LUNs
Scanning host 1 channels 0 for  SCSI target IDs  0 1 2 3 4 5 6 7, all LUNs
Scanning for device 1 0 0 0 ...
OLD: Host: scsi1 Channel: 00 Id: 00 Lun: 00
      Vendor: SEAGATE  Model: ST336607LSUN36G  Rev: 0307
      Type:   Direct-Access                    ANSI  SCSI revision: 03
NEW: Host: scsi1 Channel: 00 Id: 00 Lun: 00
      Vendor: SEAGATE  Model: ST336607LSUN36G  Rev: 0707
      Type:   Direct-Access                    ANSI SCSI revision: 03
Scanning for device 1 0 1 0 ...
OLD: Host: scsi1 Channel: 00 Id: 01 Lun: 00
      Vendor: SEAGATE  Model: ST373307LSUN72G  Rev: 0707
      Type:   Direct-Access                    ANSI SCSI revision: 03
Scanning for device 1 0 6 0 ...
OLD: Host: scsi1 Channel: 00 Id: 06 Lun: 00
      Vendor: ESG-SHV  Model: SCA HSBP M18     Rev: 0.07
      Type:   Processor                        ANSI SCSI revision: 02
Report Luns command not supported (support mandatory in SPC-3)
Scanning for device 1 0 6 0 ...
OLD: Host: scsi1 Channel: 00 Id: 06 Lun: 00
      Vendor: ESG-SHV  Model: SCA HSBP M18     Rev: 0.07
      Type:   Processor                        ANSI SCSI revision: 02
1 new device(s) found.               
1 device(s) removed.

On valide qu'un nouveau disque est disponible:

# scsiinfo -l
/dev/sdb /dev/sdc

On voit que ce n'est pas sda qui est revenu mais sdc qui vient d'arriver, c'est la conséquence des liens persistant fait par udev.

Maintenant, on partitionne /dev/sdc avec fdisk pour avoir les partitions qui vont bien :

# fdisk -l /dev/sdc
Disk /dev/sdc: 36.4 GB, 36420075008 bytes
255 heads, 63 sectors/track, 4427 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x6e1b40c8
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         608     4883728+  fd  Linux raid autodetect
/dev/sdc2             609         851     1951897+  fd  Linux raid autodetect
/dev/sdc3             852        1094     1951897+  fd  Linux raid autodetect
/dev/sdc4            1095        4427    26772322+   5  Extended
/dev/sdc5            1095        4425    26756226   fd  Linux raid autodetect

Reconstruction du RAID soft

Prenons l'exemple de md1. Voici l'état du RAID avant maintenance :

# mdadm --detail /dev/md1
/dev/md1:
        Version : 00.90
  Creation Time : Mon Feb 23 19:28:00 2009
     Raid Level : raid1
     Array Size : 1951808 (1906.38 MiB 1998.65 MB)
  Used Dev Size : 1951808 (1906.38 MiB 1998.65 MB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 1
    Persistence : Superblock is persistent
    Update Time : Sun May  2 01:13:00 2010
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 1
  Spare Devices : 0
           UUID : e80a638f:b07bd9f4:feef8c2a:28641c05
         Events : 0.62
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       18        1      active sync   /dev/sdb2
       2       8        2        -      faulty spare
# cat /proc/mdstat 
Personalities : [raid1] 
...
md1 : active raid1 sda2[2](F) sdb2[1]
      1951808 blocks [2/1] [_U]
...

On va retirer le vieux sda2 et mettre sdc2 à la place :

# mdadm /dev/md1 -r failed -a /dev/sdc2
mdadm: hot removed 8:2
mdadm: added /dev/sdc2

L'important ici est d'utiliser le mot-clé “failed” pour retirer sda2. Si on spécifie directement la partition du disque cassé, mdadm refuse car /dev/sda n'existe plus (on n'a retiré le disque).

Si on regarde l'état du RAID soft tout de suite après avoir lancé la commande, on doit voir la progression de reconstruction du RAID1:

# cat /proc/mdstat 
Personalities : [raid1] 
...
md1 : active raid1 sdc2[2] sdb2[1]
      1951808 blocks [2/1] [_U]
      [==>..................]  recovery = 13.6% (267968/1951808) finish=0.4min speed=66992K/sec
...

Et à la fin, on retrouve la situation normale:

# cat /proc/mdstat 
Personalities : [raid1] 
...
md1 : active raid1 sdc2[0] sdb2[1]
      1951808 blocks [2/2] [UU]
...

Il reste donc à effectuer la même opération pour les autres RAID soft. On remarque, que la reconstruction se fait un RAID après l'autre:

# cat /proc/mdstat 
Personalities : [raid1] 
md3 : active raid1 sdc5[2] sdb5[1]
      26756160 blocks [2/1] [_U]
        resync=DELAYED
md2 : active raid1 sdc3[2] sdb3[1]
      1951808 blocks [2/1] [_U]
      [============>........]  recovery = 60.1% (1175232/1951808) finish=0.2min speed=61854K/sec
...
# cat /proc/mdstat 
Personalities : [raid1] 
md3 : active raid1 sdc5[2] sdb5[1]
      26756160 blocks [2/1] [_U]
      [=>...................]  recovery =  8.4% (2247936/26756160) finish=19.4min speed=20992K/sec
md2 : active raid1 sdc3[0] sdb3[1]
      1951808 blocks [2/2] [UU]
...

Réinstallation de GRUB

Comme on a changé le premier disque, le MBR ne contient plus l'install de GRUB. Il faut donc reinstaller GRUB dans le MBR :

# /usr/sbin/grub-install /dev/sdb
# /usr/sbin/grub-install /dev/sdc

Cette étape est indispensable pour le prochain reboot de la machine

Conclusion

Tout peut se faire sans rebooter, ce qui est l'un des buts du RAID1 moyennant d'utiliser des disques branchables-à-chaud. Le seul truc gênant reste le changement de nommage des disques, désormais le premier disque est sdc et le second sdb: que va-t-il se passer au prochain reboot ? Vous verrez bien…

Plus sérieusement, après un reboot, tout revient bien comme il faut : sdc redevient sda et le RAID1 suit :

# cat /proc/mdstat 
Personalities : [raid1] 
md3 : active raid1 sda5[0] sdb5[1]
      26756160 blocks [2/2] [UU]
md2 : active raid1 sda3[0] sdb3[1]
      1951808 blocks [2/2] [UU]
md1 : active (auto-read-only) raid1 sda2[0] sdb2[1]
      1951808 blocks [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
      4883648 blocks [2/2] [UU]
unused devices: <none>

On remarque que md1 est en “auto-read-only”. Ce n'est pas un problème, dès que le système voudra écrire dedans il passera en lecture/écriture.

Et voilà, le RAID1 a bien fait son travail et le changement de disqu s'est passé sans encombres.

 
logiciels/systeme/changement-de-disque-en-raid1-soft.txt · Dernière modification: 24/05/2010 12:57 par orgrim