Sustitución de HD en un RAID por software mdRAID

En esta ocasión vamos a ver como regenerar un RAID por software en Linux.

Se ha detectado un error de tipo SMART mediante:

Diagnostico smarctl:

Source   
[root@simba ~]# smartctl -H /dev/sda
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-2.6.32-279.el6.x86_64] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: FAILED!
Drive failure expected in less than 24 hours. SAVE ALL DATA.
Failed Attributes:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate     0x002f   001   001   051    Pre-fail  Always   FAILING_NOW 330223

Tenemos el HD sda en pre-fail y con un mensaje bastante alarmante, tenemos que eliminarlo del Raid para sustituirlo.

Podemos ver el estado del RAID:

Source   
root@simba ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
511988 blocks super 1.0 [2/2] [UU]
md3 : active raid1 sdb5[1] sda5[0]
1924327292 blocks super 1.1 [2/2] [UU]
bitmap: 1/15 pages [4KB], 65536KB chunk
md2 : active raid1 sdb3[1] sda3[0]
8190968 blocks super 1.1 [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
20478908 blocks super 1.1 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
unused devices: <none>

Todo está bien si aparece UU, si solo vemos una es que hay algún fallo o está degradado. En este caso el RAID todavía está bien, pero el HD está en pre-fail, no es incompatible.

Antes de continuar vamos a verificar que grub está instalado en los 2 HD:

Source   
grub
grub> find /grub/stage1
(hd0,0)
(hd1,0)

Está en sda y sdb. Ok podemos continuar porque uno de los pasos es reiniciar el equipo y si no tuviésemos instalado grub en los 2 HDs, podría ser que nos encontrasemos con que la máquina no arranca (que siempre es una sorpresa desagradable).

El disco se está usando por md0, md1, md2 y md3. Marcamos como fallo para que el rendimiento no se degrade:

Source   
mdadm --manage /dev/md0 --fail /dev/sda1
mdadm --manage /dev/md1 --fail /dev/sda2
mdadm --manage /dev/md2 --fail /dev/sda3
mdadm --manage /dev/md3 --fail /dev/sda5

Ahora tenemos los discos marcados como fallo:

Source   
[root@simba ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0](F)
511988 blocks super 1.0 [2/1] [_U]
md3 : active raid1 sdb5[1] sda5[0](F)
1924327292 blocks super 1.1 [2/1] [_U]
bitmap: 1/15 pages [4KB], 65536KB chunk
md2 : active raid1 sdb3[1] sda3[0](F)
8190968 blocks super 1.1 [2/1] [_U]
md1 : active raid1 sdb2[1] sda2[0](F)
20478908 blocks super 1.1 [2/1] [_U]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>

Eliminamos el HD del RAID de forma definitiva:

Source   
mdadm --manage /dev/md0 --remove /dev/sda1
mdadm --manage /dev/md1 --remove /dev/sda2
mdadm --manage /dev/md2 --remove /dev/sda3
mdadm --manage /dev/md3 --remove /dev/sda5

Ahora ya hemos excluido sda de los RAIDs:

Source   
[root@simba ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1]
511988 blocks super 1.0 [2/1] [_U]
md3 : active raid1 sdb5[1]
1924327292 blocks super 1.1 [2/1] [_U]
bitmap: 4/15 pages [16KB], 65536KB chunk
md2 : active raid1 sdb3[1]
8190968 blocks super 1.1 [2/1] [_U]
md1 : active raid1 sdb2[1]
20478908 blocks super 1.1 [2/1] [_U]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>

Paramos la máquina, sustituimos el disco sda y arrancamos.

Ahora tenemos sdb con datos y sda totalmente vacío, copiamos la tabla de particiones de sdb a sda (mucho cuidado con no equivocarse) con:

Source   
[root@simba ~]# sfdisk -d /dev/sdb | sfdisk -f /dev/sda
Comprobando que nadie esté utilizando este disco en este momento...
Atención: la partición extendida no empieza en un límite de cilindro.
DOS y Linux interpretarán el contenido de forma diferente.
Correcto
Disco /dev/sda: 243201 cilindros, 255 cabezas, 63 sectores/pista
/dev/sda: tipo de tabla de particiones no reconocido
Situación anterior:
No se ha encontrado ninguna partición
Situación nueva:
Unidades = sectores de 512 bytes, contando desde 0
Disp.  Inicio  Principio   Fin   Nº sect.  Id  Sistema
/dev/sda1   *      2048   1026047    1024000  fd  Linux raid autodetect
/dev/sda2       1026048  41986047   40960000  fd  Linux raid autodetect
/dev/sda3      41986048  58370047   16384000  fd  Linux raid autodetect
/dev/sda4      58370048 3907029167 3848659120   5  Extendida
/dev/sda5      58372096 3907028991 3848656896  fd  Linux raid autodetect
Atención: la partición 1 no termina en un límite de cilindro
La nueva tabla de particiones se ha escrito correctamente
Volviendo a leer la tabla de particiones...
Si ha creado o modificado una partición DOS, como /dev/foo7, utilice dd(1)
para poner a cero los 512 primeros bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(Véase fdisk(8).)

Añadimos los volúmenes:

Source   
mdadm --manage /dev/md0 --add /dev/sda1
mdadm --manage /dev/md1 --add /dev/sda2
mdadm --manage /dev/md2 --add /dev/sda3
mdadm --manage /dev/md3 --add /dev/sda5

Ahora se podría ver el estado de la reconstrucción:

Source   
[root@simba ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[2] sdb1[1]
511988 blocks super 1.0 [2/2] [UU]
md3 : active raid1 sda5[2] sdb5[1]
1924327292 blocks super 1.1 [2/1] [_U]
resync=DELAYED
bitmap: 7/15 pages [28KB], 65536KB chunk
md2 : active raid1 sda3[2] sdb3[1]
8190968 blocks super 1.1 [2/1] [_U]
resync=DELAYED
md1 : active raid1 sda2[2] sdb2[1]
20478908 blocks super 1.1 [2/1] [_U]
[=>...................]  recovery =  5.8% (1198848/20478908) finish=4.0min speed=79923K/sec
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>

Una vez hayan terminado las réplicas podemos verificar que grub está instalado en los 2 HDs de nuevo.

Source   
grub
grub> find /grub/stage1
(hd0,0)
(hd1,0)

En este caso ya estaba replicado pero se puede volver a configurar si es necesario, por si las moscas (en (hd0,0) sda1):

Source   
[root@simba ~]# grub
Probing devices to guess BIOS drives. This may take a long time.
GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported.  For the first word, TAB
lists possible command completions.  Anywhere else TAB lists the possible
completions of a device/filename.]
grub> find /grub/stage1
find /grub/stage1
(hd0,0)
(hd1,0)
grub> device (hd0) /dev/sda
device (hd0) /dev/sda
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit

Y listos, espero os sirva de ayuda.

Deja un comentario