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 logiquesdb6
- 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
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>
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.