Saltar la navegación

Implementación de un RAID en Debian

Actualmente, la mayoría de las placas base ofrecen la posibilidad de agrupar los discos duros SATA en un sistema RAID, con una gestión por parte del sistema BIOS totalmente transparente al usuario. En esta práctica, aprenderemos a implementar los sistemas RAID por software, lo que nos permitirá un mayor control por nuestra parte, y evitará los problemas de incompatibilidad entre los distintos fabricantes de placas base; podría ocurrir que fallara nuestra placa y al no poderla sustituir por una igual nos quedáramos sin la información de los discos del RAID.

La implementación de un sistema RAID bajo GNU/Linux la vamos a hacer utilizando el software GPL mdadm (multiple devices administrator, paquete mdadm) escrito por Neil Brown, desarrollador del núcleo Linux.

Una condición previa para poder crear unidades RAID en GNU/Linux es que el kernel debe tener soporte MD RAID, lo cual ya tienen las versiones 4.x y también las últimas 3.x. Podemos comprobar que el kernel posee dicho soporte simplemente comprobando, después de la instalación del paquete mdadm, que existe el fichero /proc/mdstat.

# aptitude install mdadm
# ls -l /proc/mdstat
-r--r--r-- 1 root root 0 nov 15 22:38 /proc/mdstat

Durante la instalación se nos hacen dos preguntas:

  • En primer lugar se nos pregunta si queremos iniciar algún volumen RAID antes de la secuencia de arranque, lo cual es necesario cuando tenemos el sistema de ficheros raíz en un RAID. Por defecto, asume la respuesta all, que consiste en iniciar todos los volúmenes RAID disponibles antes del arranque. Para nuestro caso, los volúmenes RAID los vamos a utilizar para guardar datos, por lo tanto, la respuesta a esta pregunta será none.

Primera pregunta de la instalación de mdadm

  • La segunda pregunta nos cuestiona sobre si queremos que los volúmenes RAID se inicialicen de forma automática al arrancar el sistema, o si preferimos hacerlo nosotros manualmente. Contestaremos "Sí". Esta pregunta, en las últimas versiones de mdadm ha desaparecido, asumiéndose el "" como respuesta.

Segunda pregunta de la instalación de mdadm

Las respuestas a estas dos preguntas son guardadas en el fichero de configuración /etc/default/mdadm, desde donde podremos cambiarlas cuando queramos.

Tras la instalación podemos comprobar que se ha creado el directorio /dev/md donde se guardarán los enlaces simbólicos de los volúmenes RAID que se creen:

# ls -ld /dev/md
drwxr-xr-x 2 root root 40 nov 24 17:51 /dev/md

Cuando se creen las unidades RAID, podremos también comprobar los módulos RAID que tiene el kernel cargados y en uso, para lo cual ejecutaremos:

# lsmod | grep raid

El software mdadm permite implementar dispositivos virtuales RAID de varios niveles: lineal, 0, 1, 4, 5, 6 y 10 (también otros muy específicos, man mdadm). Estos niveles pueden hacerse usando tanto discos completos como particiones, y la elección no influye en el rendimiento. Si se eligen particiones MBR, estas deben ser creadas preferiblemente de tipo non fs data (0xDA), otros tipos como RAID auto-detect (0xFD) o GNU/Linux partition (0x83), según el manual del sistema, pueden dar problemas al recuperar un RAID desde un Live-CD. Si las particiones son GPT entonces el tipo debe ser 0xFD00. En realidad lo único que se necesita para construir un volumen RAID son dispositivos de bloque, y las particiones (/dev/sda1, /dev/sdb2, etc.) lo son, al igual que los discos completos (/dev/sda, /dev/sdb, etc.), e incluso los propios dispositivos RAID (/dev/md0), por eso puede hacerse un RAID sobre un RAID. La ventaja de usar particiones en vez de discos completos está en que si un disco se estropea, puede que no podamos encontrar uno de igual tamaño, pero si trabajamos con particiones, podemos comprar un disco de mayor capacidad, y luego crear la partición del tamaño necesario, pudiendo utilizar el resto del disco para otra cosa.

Creación de un dispositivo virtual RAID 0

Vamos a crear, en primer lugar, un sistema RAID 0 con dos discos duros SATA de igual tamaño. Podemos comprobar que los discos son reconocidos por el kernel usando el comando ls y así comprobamos también sus nombres:

# ls -1 /dev/sd*
/dev/sda
/dev/sda1
/dev/sda2
/dev/sdb
/dev/sdc

O también, de un forma más verbosa, con el comando fdisk:

# fdisk -l

Los dos discos que vamos a utilizar son /dev/sdb y /dev/sdc, en /dev/sda tenemos el SO y no vamos a usar el RAID para almacenarlo.

La sintaxis de mdadm que vamos a usar es la siguiente:

mdadm -C /dev/md/nombre-amigable -l raidX -n N /dev/sdb /dev/sdc ... /dev/sdN

El significado de las opciones es el siguiente:

-C /dev/md/nombre-amigable (--create) mdadm creará en /dev un fichero especial del estilo /dev/mdX que utilizará para manejar el volumen RAID. Estos ficheros pueden ser renombrados por mdadm en determinadas situaciones, por lo que es mejor tener, además, otro nombre para el volumen a través de un enlace simbólico dentro del directorio /dev/md. Con esta opción creamos el enlace simbólico.
-l raidX (--level=) Indica el nivel RAID: 0 ó raid0, 1 o raid1, etc. Consultar el manual del sistema (man mdadm).
-n N (--raid-devices=) Número de discos o particiones que constituirán el volumen RAID.
/dev/sdb /dev/sdc ... /dev/sdN Lista de discos (/dev/sdb) o particiones (/dev/sdb1) que constituirán el sistema RAID. Si el número de dispositivos de esta lista supera el número indicado con --raid-devices, entonces los restantes dispositivos funcionarán como dispositivos de repuesto (spare devices) para cuando se produzca un fallo en el RAID.

Para nuestro caso de un RAID 0:

# mdadm -C /dev/md/raid0 -l 0 -n 2 /dev/sdb /dev/sdc
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/raid0 started.

Podemos comprobar los ficheros que se han creado:

# ls -ld /dev/md*
drwxr-xr-x 2 root root     60 nov 24 18:46 /dev/md
brw-rw---T 1 root disk 9, 127 nov 24 18:46 /dev/md127
# ls -l /dev/md
total 0
lrwxrwxrwx 1 root root 8 nov 24 18:46 raid0 -> ../md127

Y solicitar información del volumen creado con la opción -D (--detail):

# mdadm -D /dev/md/raid0 
/dev/md/raid0:
        Version : 1.2
  Creation Time : Mon Nov 24 18:46:42 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 : Mon Nov 24 18:46:42 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 : 85856b60:1c640b0b:166b4b9a:aaaf9e88
         Events : 0

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

También se puede consultar el fichero /proc/mdstat:

# cat /proc/mdstat
Personalities : [raid0]
md127 : active raid0 sdc[1] sdb[0]
      16776192 blocks super 1.2 512k chunks
      
unused devices: <none>

El siguiente paso a llevar a cabo será formatear el volumen RAID creado, independientemente de cómo estuviesen previamente los discos o particiones que lo componen. En este caso vamos a usar el sistema de ficheros ext4:

# mkfs -t ext4 /dev/md/raid0
mke2fs 1.42.5 (29-Jul-2012)
Etiqueta del sistema de ficheros=
OS type: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=128 blocks, Stripe width=256 blocks
1048576 inodes, 4194048 blocks
209702 blocks (5.00%) reserved for the super user
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=4294967296
128 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000

Allocating group tables: hecho                           
Escribiendo las tablas de nodos-i: hecho                           
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho

Es conveniente (nos permitirá trabajar con la opción --assemble) guardar en el fichero /etc/mdadm/mdadm.conf la configuración del volumen RAID que acabamos de crear; la información a guardar es la generada por el siguiente comando:

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

y podría hacerse de la siguiente manera:

# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Por último, nos queda conseguir que el volumen RAID se monte automáticamente en el directorio que nos interese, para lo que tendremos que configurar /etc/fstab. Vamos a suponer que queremos utilizar el sistema RAID creado para usarlo como almacenamiento de las páginas web servidas por nuestro servidor web Apache; por lo tanto, donde queremos montar el RAID es en /var/www. La línea que insertaremos en /etc/fstab será la siguiente:

/dev/md/raid0    /var/www    ext4    defaults    0    2

Podemos comprobar con el comando df y/o lsblk que se ha montado todo correctamente:

# lsblk -fm
NAME    FSTYPE            LABEL        MOUNTPOINT NAME      SIZE OWNER GROUP MODE
sda                                               sda        10G root  disk  brw-rw---T
├─sda1  ext4                           /          ├─sda1    9,3G root  disk  brw-rw---T
└─sda2  swap                           [SWAP]     └─sda2    702M root  disk  brw-rw---T
sdb     linux_raid_member debian:raid0            sdb         8G root  disk  brw-rw---T
└─md127 ext4                           /var/www   └─md127    16G root  disk  brw-rw---T
sdc     linux_raid_member debian:raid0            sdc         8G root  disk  brw-rw---T
└─md127 ext4                           /var/www   └─md127    16G root  disk  brw-rw---T
sr0                                               sr0      1024M root  cdrom brw-rw---T
# df -h
S.ficheros                                             Tamaño Usados  Disp Uso% Montado en
rootfs                                                   9,2G   4,3G  4,5G  49% /
udev                                                      10M      0   10M   0% /dev
tmpfs                                                     50M   652K   50M   2% /run
/dev/disk/by-uuid/d2e6427a-9ee5-433a-970d-4ab354655b74   9,2G   4,3G  4,5G  49% /
tmpfs                                                    5,0M      0  5,0M   0% /run/lock
tmpfs                                                    240M   224K  240M   1% /run/shm
/dev/md127                                                16G   172M   15G   2% /var/www

Creación de un dispositivo virtual RAID 1

Vamos ahora a implementar un RAID 1 con dos discos activos y un tercero como libre o de repuesto.

Los discos libres (de reserva o spare) son los que no forman parte en un conjunto RAID hasta que falla uno de los discos activos. Cuando se detecta un fallo de dispositivo, el disco erróneo se marca como tal y es apartado de modo que no se vuelva a utilizar, a continuación el proceso de reconstrucción comienza con el primer disco libre disponible. De esta forma, los discos libres aportan una seguridad extra ante los errores de disco, permitiendo que el sistema siga funcionando, pero aún así, no es descartable que el sistema se bloquee cuando un disco falle debido a la incapacidad de los drivers de disco de manejar errores físicos.

El momento de reconstrucción de un disco para incorporarlo al RAID, es un momento delicado, pues requerirá mucha lectura sobre el resto de los discos y esto podría provocar otro fallo, que podría ser fatal si el RAID sólo acepta un fallo físico de disco (RAID 5 por ejemplo).

La evolución en porcentaje del proceso de reconstrucción de un disco se puede ver visualizando el fichero /proc/mdstat.

Como se ha dicho anteriormente, cuando la capa RAID gestiona correctamente los fallos de dispositivos, los discos fallidos son etiquetados como tales y la reconstrucción empieza inmediatamente con el primer disco libre que se exista. Los discos erróneos constan (si no son manualmente retirados del array) como miembros del conjunto RAID. La capa RAID se limita a tratar a los dispositivos marcados como erróneos como parte inactiva del array.

La siguiente instrucción crea el RAID que pretendemos en este momento:

# mdadm -C /dev/md/raid1 -l 1 -n 2 /dev/sdb /dev/sdc -x 1 /dev/sdd
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/raid1 started.

Durante el proceso de creación del RAID1 se nos hace una advertencia de los problemas que se pueden presentar si el directorio /boot se incluye dentro del volumen RAID, nosotros contestaremos 'yes' para continuar con la instalación, pues nuestros RAID sólo se utilizarán para almacenar datos y no el sistema operativo.

Otro aspecto nuevo es la opción -x (--spare-devices=) que se utiliza para indicar el número de discos reserva que tendrá el sistema RAID y, a continuación, debemos poner la lista de estos dispositivos.

Tras crear el RAID, comprobamos su estado:

# cat /proc/mdstat 
Personalities : [raid1]
md127 : active (auto-read-only) raid1 sdd[2](S) sdc[1] sdb[0]
      8384448 blocks super 1.2 [2/2] [UU]
          resync=PENDING
      
unused devices: <none>

Se puede observar en la información anterior que el dispositivo /dev/sdd (2) es el disco reserva (Spare) y que el array tiene pendiente la reconstrucción (resync=PENDING), la cual se llevará a cabo tras el formateo. Por otro lado, los dispositivos activos de los que consta el array son dos de dos (2/2) /dev/sdb (0) y /dev/sdc (1) y están funcionando correctamente ([UU]).

También la información anterior la podemos ver reflejada con la opción -D (--detail) de mdadm:

# mdadm -D /dev/md/raid1 
/dev/md/raid1:
        Version : 1.2
  Creation Time : Tue Dec  2 11:11:11 2014
     Raid Level : raid1
     Array Size : 8384448 (8.00 GiB 8.59 GB)
  Used Dev Size : 8384448 (8.00 GiB 8.59 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Tue Dec  2 11:11:11 2014
          State : clean, resyncing (PENDING)
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

           Name : debian:raid1  (local to host debian)
           UUID : 33946c52:28031f0b:9d406d00:58f44291
         Events : 0

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

       2       8       48        -      spare   /dev/sdd

Realizamos el formateo del volumen RAID asignando el sistema de ficheros ext4:

# mkfs.ext4 /dev/md/raid1 
mke2fs 1.42.5 (29-Jul-2012)
Etiqueta del sistema de ficheros=
OS type: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2096112 blocks
104805 blocks (5.00%) reserved for the super user
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=2147483648
64 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: hecho                           
Escribiendo las tablas de nodos-i: hecho                           
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho

Comprobamos el estado del RAID a continuación:

# mdadm -D /dev/md/raid1 
/dev/md/raid1:
        Version : 1.2
  Creation Time : Tue Dec  2 11:11:11 2014
     Raid Level : raid1
     Array Size : 8384448 (8.00 GiB 8.59 GB)
  Used Dev Size : 8384448 (8.00 GiB 8.59 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Tue Dec  2 12:00:08 2014
          State : active, resyncing
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

  Resync Status : 18% complete

           Name : debian:raid1  (local to host debian)
           UUID : 33946c52:28031f0b:9d406d00:58f44291
         Events : 3

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

       2       8       48        -      spare   /dev/sdd

y observamos que el RAID se está recontruyendo (resyncing), lo que no impide que se pueda montar y utilizar, pues también se encuentra activo (active). Se nos muestra también el porcentaje de reconstrucción que se ha alcanzado hasta el momento. Podemos ejecutar sucesivamente la orden anterior con el comando watch y ver como avanza el porcentaje de reconstrucción.

# watch 'mdadm -D /dev/md/raid1'

Tras un tiempo, que dependerá del tamaño de los discos que constituyen el RAID, obtenemos que el volumen ya está construido:

# mdadm -D /dev/md/raid1 
/dev/md/raid1:
        Version : 1.2
  Creation Time : Tue Dec  2 11:11:11 2014
     Raid Level : raid1
     Array Size : 8384448 (8.00 GiB 8.59 GB)
  Used Dev Size : 8384448 (8.00 GiB 8.59 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Tue Dec  2 12:00:44 2014
          State : active
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

           Name : debian:raid1  (local to host debian)
           UUID : 33946c52:28031f0b:9d406d00:58f44291
         Events : 18

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

       2       8       48        -      spare   /dev/sdd

En este punto es cuando deberíamos guardar la configuración del RAID creado en el fichero mdadm.conf:

# mdadm -Ds
ARRAY /dev/md/raid1 metadata=1.2 spares=1 name=debian:raid1 UUID=32e3d002:c744eea4:62144130:074707c7
# mdadm -Ds >> /etc/mdadm/mdadm.conf

A continuación montamos manualmente el volumen RAID en el directorio donde residen las páginas web de nuestro servidor web Apache:

# mount /dev/md/raid1 /var/www

Y a partir de este momento el volumen RAID puede usarse:

# df -k
S.ficheros                                             1K-bloques  Usados Disponibles Uso% Montado en
rootfs                                                    9611492 4425880     4697372  49% /
udev                                                        10240       0       10240   0% /dev
tmpfs                                                       50892     656       50236   2% /run
/dev/disk/by-uuid/d2e6427a-9ee5-433a-970d-4ab354655b74    9611492 4425880     4697372  49% /
tmpfs                                                        5120       0        5120   0% /run/lock
tmpfs                                                      245540     372      245168   1% /run/shm
/dev/md127                                                8252792  149520     7684052   2% /var/www

Para hacer permanente el punto de montaje anterior, como vimos en el ejemplo del RAID 0, tendremos que modificar el fichero /etc/fstab.