Este procedimiento detalla los pasos necesarios para el cambio de un disco fallado, en un servidor linux, que tiene los discos configurados en RAID 1 por software.
Nota Preliminar
En este ejemplo cuento con dos discos duros, /dev/sda y /dev/sdb. Ambos tienen las mismas particiones, y están configuradas cada una de ellas con la homónima del otro disco, para formar un volumen md, ejemplo:
# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
Event: 16
md0 : active raid1 sdb1[1] sda1[0](F)
128384 blocks [2/1] [_U]
md1 : active raid1 sdb2[1] sda2[0](F)
2618496 blocks [2/1] [_U]
md2 : active raid1 sdb3[1] sda3[0](F)
2096384 blocks [2/1] [_U]
md3 : active raid1 sdb5[1] sda5[0](F)
2096384 blocks [2/1] [_U]
md4 : active raid1 sdb6[1] sda6[0](F)
1052160 blocks [2/1] [_U]
md7 : active raid1 sdb7[1] sda7[0](F)
9004288 blocks [2/1] [_U]
md5 : active raid1 sdb8[1] sda8[0](F)
24458816 blocks [2/1] [_U]
md6 : active raid1 sdb9[1] sda9[0]
36692352 blocks [2/1] [UU]
unused devices:
Como se puede ver, todas las particiones de /dev/sda excepto la sda9 están marcadas como falladas (F).
Procedimiento
Para quitar el disco malo
Marcamos las particiones que no estén en Failed como tales. Por cada partición no failed hacer:
# mdadm --manage /dev/md6 --fail /dev/sda9
Verificamos que ahora si, todas las particiones del disco malo aparecen en failed:
# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
Event: 16
md0 : active raid1 sdb1[1] sda1[0](F)
128384 blocks [2/1] [_U]
md1 : active raid1 sdb2[1] sda2[0](F)
2618496 blocks [2/1] [_U]
md2 : active raid1 sdb3[1] sda3[0](F)
2096384 blocks [2/1] [_U]
md3 : active raid1 sdb5[1] sda5[0](F)
2096384 blocks [2/1] [_U]
md4 : active raid1 sdb6[1] sda6[0](F)
1052160 blocks [2/1] [_U]
md7 : active raid1 sdb7[1] sda7[0](F)
9004288 blocks [2/1] [_U]
md5 : active raid1 sdb8[1] sda8[0](F)
24458816 blocks [2/1] [_U]
md6 : active raid1 sdb9[1] sda9[0](F)
36692352 blocks [2/1] [_U]
unused devices:
Ahora debemos quitar cada una de las particiones del disco fallado de su md correspondiente. Por lo que por cada partición se ejecuta el siguiente comando (cambiando md? y sd?? por lo que corresponda)
mdadm --manage /dev/md0 --remove /dev/sda1
Vemos que todas las particiones han desaparecido de su dispositivo correspondiente:
cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
Event: 24
md0 : active raid1 sdb1[1]
128384 blocks [2/1] [_U]
md1 : active raid1 sdb2[1]
2618496 blocks [2/1] [_U]
md2 : active raid1 sdb3[1]
2096384 blocks [2/1] [_U]
md3 : active raid1 sdb5[1]
2096384 blocks [2/1] [_U]
md4 : active raid1 sdb6[1]
1052160 blocks [2/1] [_U]
md7 : active raid1 sdb7[1]
9004288 blocks [2/1] [_U]
md5 : active raid1 sdb8[1]
24458816 blocks [2/1] [_U]
md6 : active raid1 sdb9[1]
36692352 blocks [2/1] [_U]
unused devices:
Ahora cambiamos físicamente el disco en caliente. Verificamos que el disco que ponemos sea exactamente igual que el que quitamos:
# fdisk -l
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sda doesn't contain a valid partition table
Disk /dev/sdb: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 16 128488+ fd Linux raid autodetect
/dev/sdb2 17 342 2618595 fd Linux raid autodetect
/dev/sdb3 343 603 2096482+ fd Linux raid autodetect
/dev/sdb4 604 9729 73304595 5 Extended
/dev/sdb5 604 864 2096451 fd Linux raid autodetect
/dev/sdb6 865 995 1052226 fd Linux raid autodetect
/dev/sdb7 996 2116 9004401 fd Linux raid autodetect
/dev/sdb8 2117 5161 24458931 fd Linux raid autodetect
/dev/sdb9 5162 9729 36692428+ fd Linux raid autodetect
....
Como se vé, la geometría de ambos discos coincide. Con lo que podemos copiar la tabla de particiones de un disco al otro:
# sfdisk -d /dev/sdb | sfdisk /dev/sda
Si los discos no fueran iguales, hay que particionar a mano con fdisk, procurando que el nuevo disco tenga igual o mayor cantidad de bloques en todas y cada una de las particiones.
Verificamos que las particiones coinciden:
# fdisk -l
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 16 128488+ fd Linux raid autodetect
/dev/sda2 17 342 2618595 fd Linux raid autodetect
/dev/sda3 343 603 2096482+ fd Linux raid autodetect
/dev/sda4 604 9729 73304595 5 Extended
/dev/sda5 604 864 2096451 fd Linux raid autodetect
/dev/sda6 865 995 1052226 fd Linux raid autodetect
/dev/sda7 996 2116 9004401 fd Linux raid autodetect
/dev/sda8 2117 5161 24458931 fd Linux raid autodetect
/dev/sda9 5162 9729 36692428+ fd Linux raid autodetect
Disk /dev/sdb: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 16 128488+ fd Linux raid autodetect
/dev/sdb2 17 342 2618595 fd Linux raid autodetect
/dev/sdb3 343 603 2096482+ fd Linux raid autodetect
/dev/sdb4 604 9729 73304595 5 Extended
/dev/sdb5 604 864 2096451 fd Linux raid autodetect
/dev/sdb6 865 995 1052226 fd Linux raid autodetect
/dev/sdb7 996 2116 9004401 fd Linux raid autodetect
/dev/sdb8 2117 5161 24458931 fd Linux raid autodetect
/dev/sdb9 5162 9729 36692428+ fd Linux raid autodetect
....
Ahora agregamos cada partición al dispositivo correspondiente. Ejecutamos el comando siguiente (cambiando md? y sd?? por lo que corresponda):
mdadm --manage /dev/md0 --add /dev/sda1
Mientras se está restaurando el mirror podemos ver el avance de la sincronización de la siguiente forma:
# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
Event: 35
md0 : active raid1 sda1[0] sdb1[1]
128384 blocks [2/2] [UU]
md1 : active raid1 sda2[2] sdb2[1]
2618496 blocks [2/1] [_U]
[==>..................] recovery = 11.7% (308352/2618496) finish=7.3min speed=5265K/sec
md2 : active raid1 sda3[2] sdb3[1]
2096384 blocks [2/1] [_U]
md3 : active raid1 sda5[2] sdb5[1]
2096384 blocks [2/1] [_U]
md4 : active raid1 sda6[2] sdb6[1]
1052160 blocks [2/1] [_U]
md7 : active raid1 sda7[2] sdb7[1]
9004288 blocks [2/1] [_U]
md5 : active raid1 sda8[2] sdb8[1]
24458816 blocks [2/1] [_U]
md6 : active raid1 sda9[2] sdb9[1]
36692352 blocks [2/1] [_U]
unused devices:
Como se vé se está recuperando el md1, y está al 11,7% de copia.
Una vez terminado el proceso de sincronización se ve que el estado de los dispositivos vuelve a la normalidad:
# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
Event: 43
md0 : active raid1 sda1[0] sdb1[1]
128384 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
2618496 blocks [2/2] [UU]
md2 : active raid1 sda3[0] sdb3[1]
2096384 blocks [2/2] [UU]
md3 : active raid1 sda5[0] sdb5[1]
2096384 blocks [2/2] [UU]
md4 : active raid1 sda6[0] sdb6[1]
1052160 blocks [2/2] [UU]
md7 : active raid1 sda7[2] sdb7[1]
9004288 blocks [2/2] [UU]
md5 : active raid1 sda8[2] sdb8[1]
24458816 blocks [2/2] [UU]
md6 : active raid1 sda9[2] sdb9[1]
36692352 blocks [2/2] [UU]
unused devices: