Saltar la navegación

mdadm

El comando mdadm incluye múltiples opciones para gestionar y monitorizar nuestros dispositivos virtuales RAID. Posee siete modos principales de funcionamiento: create, assemble, monitor, build, grow, manage y misc. Su sintaxis genérica es la siguiente:

mdadm [modo] nombre-dispositivo-raid [opciones] lista-dispositivos-de-disco-o-particiones

sdfasdfasd

-D, --detail:

Esta opción la hemos visto anteriormente y nos da información sobre el volumen RAID especificado.

# mdadm --detail /dev/md/raid0 
/dev/md/raid0:
        Version : 1.2
  Creation Time : Tue Nov 25 11:52:13 2014
     Raid Level : raid0
     Array Size : 16776192 (16.00 GiB 17.18 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Tue Nov 25 11:52:13 2014
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 512K

           Name : debian:raid0  (local to host debian)
           UUID : 81b238cb:ad54e3a1:69904eee:5a561cc5
         Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

-s, --scan:

Esta opción acompaña siempre a otra y hace que mdadm busque la información que le falta en /proc/mdstat o en /etc/mdadm/mdadm.conf. Acompañando a la opción anterior, mdadm nos muestra información de todos los sistemas RAID implementados y en el orden en el que se crearon. El formato de la salida es el de las líneas ARRAY del fichero mdadm.conf, las cuales definen los volúmenes RAID.

# mdadm --detail --scan
ARRAY /dev/md/raid0 metadata=1.2 name=debian:raid0 UUID=81b238cb:ad54e3a1:69904eee:5a561cc5

La anterior instrucción puede ejecutarse con --verbose (-v):

# mdadm -Dsv
ARRAY /dev/md/raid0 level=raid0 num-devices=2 metadata=1.2 name=debian:raid0 UUID=81b238cb:ad54e3a1:69904eee:5a561cc5
   devices=/dev/sdb,/dev/sdc

-E, --examine:

Con esta opción obtenemos información de los discos o particiones que constituyen el volumen RAID.

# mdadm -E /dev/sdb
/dev/sdb:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 81b238cb:ad54e3a1:69904eee:5a561cc5
           Name : debian:raid0  (local to host debian)
  Creation Time : Tue Nov 25 11:52:13 2014
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 16777200 (8.00 GiB 8.59 GB)
    Data Offset : 16 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : c290b106:328774c0:e9f91625:8fae4341

    Update Time : Tue Nov 25 11:52:13 2014
       Checksum : ad1dfdca - correct
         Events : 0

     Chunk Size : 512K

   Device Role : Active device 0
   Array State : AA ('A' == active, '.' == missing)

-Q, --query:

Esta opción puede usarse junto con un dispositivo para ver si este es un volumen RAID o pertenece a un RAID.

En el siguiente ejemplo se cuestiona sobre un volumen RAID, un dispositivo que pertenece a un RAID y otro que no pertenece.

# mdadm --query /dev/md/raid0 
/dev/md/raid0: 15.100GiB raid0 2 devices, 0 spares. Use mdadm --detail for more detail.
# mdadm --query /dev/sdb
/dev/sdb: is not an md array
/dev/sdb: device 0 in 2 device unknown raid0 array.  Use mdadm --examine for more detail.
# mdadm --query /dev/sda
/dev/sda: is not an md array
/dev/sda: device 0 in 0 device unknown raid0 array.  Use mdadm --examine for more detail.

-S, --stop:

Con esta opción se desactiva el volumen RAID especificado y se liberan los recursos del sistema que estuviera ocupando. Es fundamental, desmontar previamente el RAID para no perder información.

# umount /dev/md/raid0
# mdadm --stop /dev/md/raid0
mdadm: stopped /dev/md/raid0

Con --scan (-s) detendría todos los RAID que estuvieran funcionando.

# mdadm -Ss
mdadm: stopped /dev/md127

--zero-superblock:

Con esta opción se sobreescribe con ceros el superbloque del dispositivo del RAID especificado. El superbloque, de un disco o partición que pertenece a un RAID, almacena información útil para manipularlo. Al dejarlo inutilizado, el sistema RAID ya no puede reconocerlo, como sucedería con un disco al que se le destruye su MBR.

Para eliminar un RAID completamente y liberar los discos para que puedan ser utilizados para otros fines, los pasos a seguir son los siguientes:

  1. Desmontar el RAID.
  2. Detener el RAID.
  3. Machacar el superbloque de los dispositivos que constituyen el RAID.

La eliminación del RAID1 que anteriormente se creó como ejemplo, se realizaría de la siguiente manera:

# umount /var/www
# mdadm --stop /dev/md/raid1
mdadm: stopped /dev/md/raid1
# mdadm --zero-superblock /dev/sdb /dev/sdc /dev/sdd

-A, --assemble:

Esta opción se utiliza para arrancar de forma manual un RAID ya creado que se encuentra detenido (--stop, -S). Hay varias formas de usarla, una de ellas es acompañándola de --scan (-s) para que mdadm busque todos los RAID creados y los arranque:

# mdadm --assemble --scan
mdadm: /dev/md/raid0 has been started with 2 drives.
# mount /dev/md/raid0

Después de arrancar el RAID, no debemos olvidar montarlo para que pueda ser utilizado. En el ejemplo anterior, se supone que existe una línea de montaje de /dev/md/raid0 en /etc/fstab y, por eso podemos utilizar la orden mount de forma abreviada, pues el resto de parámetros que faltan los lee de dicha línea.

También podemos especificar el fichero /dev/mdX y los discos o particiones que lo componen:

# mdadm -A /dev/md127 /dev/sdb /dev/sdc
mdadm: /dev/md127 has been started with 2 drives.

Esta forma tiene el inconveniente de que no crea el enlace simbólico con un nombre más amigable, que en nuestros ejemplos está siendo /dev/md/raid0; en este caso sólo podremos manejar el volumen RAID con /dev/md127, y es probable que en /etc/fstab no lo hayamos utilizado.

Por último, podemos hacer uso del nombre amigable que utilizamos en la creación del volumen RAID, pero para ello, en el fichero mdadm.conf debe estar el RAID definido a través de una línea ARRAY:

# mdadm -A /dev/md/raid0
mdadm: /dev/md/raid0 has been started with 2 drives.

Esto último es gracias a la siguiente línea de mdadm.conf :

ARRAY /dev/md/raid0 metadata=1.2 name=debian:raid0 UUID=81b238cb:ad54e3a1:69904eee:5a561cc5

línea generada con:

# mdadm -Ds
ARRAY /dev/md/raid0 metadata=1.2 name=debian:raid0 UUID=81b238cb:ad54e3a1:69904eee:5a561cc5

Por otro lado, son muy importantes también las opciones que nos permiten modificar el sistema RAID, por ejemplo, para cambiar el número de discos que lo forman, para marcar un disco como fallido, etc. Veámoslas a continuación:

-f, --fail:

Con esta opción marcaremos un dispositivo que haya fallado, lo cual se debe hacer previamente a su eliminación. También puede usarse para simular el fallo de un dispositivo.

Vamos a simular que el dispositivo /dev/sdb del RAID1 de nuestro ejemplo ha fallado:

En primer lugar marcamos como fallido el dispositivo.

# mdadm /dev/md/raid1 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md/raid1

Comprobamos el estado del RAID:

# cat /proc/mdstat 
Personalities : [raid1]
md127 : active raid1 sdd[2] sdc[1] sdb[0](F)
      8384448 blocks super 1.2 [2/1] [_U]
      [====>................]  recovery = 21.1% (1777216/8384448) finish=0.6min speed=177721K/sec
      
unused devices: <none>

Y observamos que /dev/sdd ha dejado de ser un disco reserva y ha pasado a estar activo, que /dev/sdb está marcado como fallido (F), que hay un solo disco funcionando de los dos que componen el RAID (2/1) (_U), y que el disco reserva se está construyendo. Pasado un tiempo volvemos a comprobar el estado:

# cat /proc/mdstat 
Personalities : [raid1]
md127 : active raid1 sdd[2] sdc[1] sdb[0](F)
      8384448 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

y el RAID está reconstruido, esta vez con /dev/sdd y /dev/sdc.

-r, --remove:

Con esta opción sacamos del sistema RAID un dispositivo marcado previamente como fallido. Para el caso anterior:

# mdadm /dev/md/raid1 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md/raid1
# mdadm /dev/md/raid1 -r /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md/raid1
# mdadm --zero-superblock /dev/sdb

Se ha eliminado el superbloque porque queríamos utilizar el disco para otra cosa, ya que el disco no ha fallado realmente, sino que simplemente lo queríamos sacar del RAID.

A los discos reserva no es necesario marcarlos con fail para eliminarlos del RAID.

-a, --add:

Con esta opción se puede añadir un nuevo disco al sistema RAID como reserva (spare), por ejemplo, para añadir el disco que eliminamos anteriormente (/dev/sdb) al RAID1 de nuestro ejemplo, ejecutamos lo siguiente:

# mdadm /dev/md/raid1 --add /dev/sdb
mdadm: added /dev/sdb

y comprobamos el estado para ver que está como reserva:

# cat /proc/mdstat 
Personalities : [raid1]
md127 : active raid1 sdb[3](S) sdd[2] sdc[1]
      8384448 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

-G, --grow:

Este modo de funcionamiento permite añadir nuevos discos a los RAID Lineal, 0, 1, 4, 5 y 6, y así aumentar su tamaño. Para que un disco reserva se convierta en un disco activo, lo que debemos hacer es actualizar el número de dispositivos del RAID. En el caso del RAID 1 de nuestro ejemplo, ejecutaríamos:

mdadm --grow /dev/md/raid1 --raid-devices=3

Tras esto, el RAID se reconstruirá.

En el caso de que el RAID sea Lineal o de nivel 0, los cuales no pueden utilizar discos reserva, para añadir un nuevo disco se debe usar la opción --add (-a) junto con --grow:

mdadm --grow /dev/md/raid0 --raid-devices=3 --add /dev/sdd

En el caso de que los discos se vayan sustituyendo paulatinamente por otros más grandes en los RAID 1, 4, 5 y 6, nos encontraremos con una situación final en la que todos los discos activos actuales serán más grandes que los originales, y el espacio extra no se estará utilizando. Tendremos por tanto que aumentar el tamaño del RAID para que se utilice. Para ello usamos --grow con la opción -s (--size=), y esta última con el valor max para que utilice todos los discos con el mayor tamaño posible, quedando todos iguales.

# mdadm --grow /dev/md/raid1 --size=max
mdadm: component size of /dev/md/raid1 has been set to 12578816K