Base de conocimientos · Servidores dedicados y VPS

Administración de RAID por software en Linux (Parte II): recuperación tras el fallo de un disco

Última actualización: 2019-02-03

Administración de RAID por software en Linux (Parte II): recuperación tras el fallo de un disco

Este artículo le muestra cómo recuperar un RAID por software de Linux en caso de fallo de un solo disco. En los ejemplos siguientes partiremos de los siguientes supuestos:

  • Utiliza la versión más reciente de Linux (CentOS 5+).
  • Dispone de dos (2) discos duros (sda, sdb) conectados a un controlador SAS/SATA que no es un RAID por hardware de Linux.
  • Dispone de RAID por software de Linux (MD).
  • Dispone de dos (2) matrices RAID1, a saber:
    • md0 (sda1+sdb1): /boot
    • md1 (sda2+sdb2): LVM
  • Una de sus matrices está degradada pero operativa (solo con el fallo de un miembro).
  • Dispone de acceso root completo.


Realización de una comprobación de estado


Compruebe el estado de salud de sus discos. Debería ver los siguientes resultados, según el estado de sus discos:

Matriz en buen estado

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>

 

Tenga en cuenta que ambas matrices (md0, md1) están:

    1. Activas
    2. Contienen dos miembros: sdb1[1], sda1[0]
    3. Dos de dos miembros están operativos: [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

 

Tenga en cuenta que deben cumplirse los siguientes puntos:

    1. Ambos discos físicos están presentes: sda, sdb
    2. Ambos arreglos están presentes: md0, md1
    3. Ambos discos tienen el mismo tamaño: sda = sdb = 976762584
    4. Ambos discos están particionados de la misma manera:
    • sda1 = sdb1 = 512000
    • sda2 = sdb2 = 976248832

 

Arreglo degradado


Fallo de una sola partición (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>

 

Nota: uno o más arreglos RAID mostrarán miembros ausentes: [2/1] [_U]


Fallo de un disco completo (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 caso de un fallo grave, o si un disco no se inicializa al reiniciar el sistema, el propio disco puede desaparecer, como se muestra en los ejemplos siguientes.


Disco ausente: 
/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>

 

Disco ausente: /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

 

Cómo eliminar un disco con fallo

Cómo marcar manualmente los dispositivos como ‘con fallo’

Solo debe marcar manualmente un dispositivo como defectuoso si uno de sus arreglos se encuentra en estado degradado debido a un tiempo de espera agotado o a un error de lectura en una de las particiones. El disco físico en sí debería seguir funcionando correctamente.

    • Revise /proc/mdstat y asegúrese de que todas las particiones del disco con fallo estén marcadas como ‘defectuosas’.

PRECAUCIÓN: asegúrese de marcar como fallidas únicamente las particiones que pertenecen al disco con fallo correspondiente (es decir, sda1/sda2 para sda y sdb1/sdb2 para sdb).

Establezca sda1 y sda1 como 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

 

    • Confirme que ambas particiones del mismo disco aparezcan marcadas como fallidas.

En 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>

 

Cómo eliminar dispositivos con fallo del arreglo

Antes de poder reemplazar un disco, los miembros que han fallado deben eliminarse de sus arrays correspondientes:

    • Elimine los miembros que han fallado:

[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>

 

    • Asegúrese de borrar los superbloques RAID si planea volver a añadir las mismas particiones al array o si desea reutilizarlas para otro fin:

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

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

 

    • También puede optar por borrar toda la información del disco antes de desecharlo, siempre que el disco físico siga funcionando:

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

PRECAUCIÓN: Este proceso borra todos los datos del dispositivo indicado en el argumento "of=" (/dev/sda en el ejemplo anterior).

Nota: Este proceso puede tardar algún tiempo en completarse.

 

Cómo añadir un disco de reemplazo

El disco de reemplazo debe tener exactamente el mismo tamaño que el disco averiado o uno mayor. Una vez insertado el disco de reemplazo en el sistema, el kernel registrará algo similar a lo siguiente:

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


Confirme si el sistema detecta la nueva unidad (sdc en este caso):

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

Compruebe el estado SMART del nuevo disco:

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

 

Particionado

Para comenzar con el particionado, confirme primero que el nuevo disco no se haya montado automáticamente:

  mount | grep sdc

No debería mostrarse ninguna salida. Si aparece algún resultado, las particiones correspondientes deben desmontarse manualmente ejecutando:

umount <partition>

Dado que el sistema inicial utilizaba dos discos en espejo del mismo tamaño exacto, podemos usar la unidad operativa como plantilla para el particionado:

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

Situación anterior:

Unidades = sectores de 512 bytes, contando desde 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

Nueva situación:

Unidades = sectores de 512 bytes, contando desde 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

Advertencia: la partición 1 no termina en un límite de cilindro

Advertencia: la partición 2 no comienza en un límite de cilindro

Advertencia: la partición 2 no termina en un límite de cilindro

La nueva tabla de particiones se escribió correctamente

 

Releyendo la tabla de particiones ...

 

Si ha creado o modificado una partición DOS, por ejemplo /dev/foo7, utilice dd(1)

para poner a cero los primeros 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1

(Consulte fdisk(8).)

 

Después de esto, debería poder ver su disco recién particionado:

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

 

Adición de nuevos dispositivos al arreglo

 [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>

Nota: Ambos arreglos tienen dos miembros activos y md1 se está reconstruyendo activamente.

 

Reinstalación del cargador de arranque

Una vez sustituida la unidad averiada, reinstale GRUB en el MBR del nuevo disco para asegurarse de que pueda arrancar desde él:

grub-install /dev/sdc

Installation finished. No error reported.

Este es el contenido del mapa de dispositivos /boot/grub/device.map.

Compruebe si es correcto o no. Si alguna de las líneas es incorrecta,

corríjala y vuelva a ejecutar el script `grub-install'.

 

# this device map was generated by anaconda

(hd0)     /dev/sdc

(hd1)     /dev/sdb

 

← Todos los artículos de base de conocimientos

Tell us what you need

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