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.
- 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 "Sí" como respuesta.
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.
Obra publicada con Licencia Creative Commons Reconocimiento 4.0