RAID Software

Rafa Morales 12 Septiembre 2013
17min
0
Linux

Linux es capaz de simular los diferentes tipos de RAID sin necesidad de utilizar una controladora de discos RAID. Utilizará los discos que el equipo tenga conectados directamente a los canales IDE o SATA. Podemos aprender más sobre la tecnología RAID en estos enlaces:

Un RAID realizado por software es más lento e inestable que un RAID manejado por una controladora RAID porque es el mismo sistema operativo el que tiene que encargarse de manejar la duplicidad de información entre los diferentes discos, lo que hará que le reste tiempo de ejecución a otras tareas del sistema. En el caso de una controladora RAID hardware el sistema operativo solo reconoce una partición en la que tiene que leer y escribir, pero se olvida del mantenimiento necesario de la duplicidad de datos en el sistema RAID.

A continuación vamos a realizar un RAID software con las herramientas que nos ofrece Linux. Vamos a utilizar en primer lugar este sistema como disco de datos solamente, y posteriormente vamos a clonar el sistema del disco normal al sistema RAID para que el kernel arranque directamente de éste último. Para ello mostraremos como ejemplo la realización de un RAID 1 (espejo o mirror).

 

Crear un RAID sin arranque de sistema

Suponemos que nuestro sistema se encuentra arrancado y montado en /dev/sda. Así que instalamos otros dos discos duros del mismo tamaño o superior, que al arrancar serán /dev/sdb y /dev/sdc.

Necesitaremos instalar los paquetes necesarios de soporte de RAID:

apt-get install mdadm

El primer paso será crear las particiones (/dev/sdb1 y /dev/sdc1) en estos dos disco nuevos. Para ello utilizaremos los siguientes comandos (leer más sobre cómo utilizar fdisk).

fdisk /dev/sdb
fdisk /dev/sdc

A continuación modificamos las particiones del disco del RAID sdb para que sus sistema de archivos sea “Linux raid autodetected” tanto en la partición sdb1 como en la partición sdc1. Para ello ejecutamos:

#fdisk /dev/sdb
Command (m for help): t
Selected partition: 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Command (m for help): w
The partition table has been altered!

 

No olvidar al final guardar la tabla de particiones pulsando la opción “w”.

Si no queremos repetir los pasos en el segundo disco (sdc), podemos utilizar el siguiente comando para clonar la tabla de particiones de un disco a otro.

sfdisk -d /dev/sdb | sfdisk /dev/sdc --force

 

Si anteriormente hemos utilizado estos discos en otro RAID debemos inicializarlos para que no nos de ningún error al crear el RAID:

mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc

Una vez preparadas las particiones estamos ya listos para crear el RAID, en nuestro caso será una RAID de nivel 1 con dos discos, pero indicando las particiones y NO los discos duros (NOTA: el carácter "\" indica que el comando continua en la siguiente línea, pero es el mismo comando):

mdadm --create /dev/md0 --verbose --metadata=0.90 \
  --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

Utilizaremos el metadata 0.90 si la partición RAID va a servir como arranque del sistema. Si no especificáramos esta opción, se crearía con un metadata 1.2 o posterior, el cual no puede ser arrancado desde GRUB.

 

Para comprobar que se ha creado correctamente leemos el contenido del archivo /etc/mdstat en el que se almacenará el estado actual de los RAIDs del sistema, y en el que al observaremos el proceso de inicializar el RAID o de restaurar sus discos:

# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid10]
md0 : active raid1 /dev/sdc1[1] /dev/sdb1[0]
1048192 blocks [2/2] [UU]
[====>......] resync=58.2% (619/1042) finish=0.0m speed=1018K/s
unused devices: <none>

Para no estar repetidamente ejecutando el comando anterior podemos utilizar la siguiente orden que hará que se ejecute automáticamente:

watch cat /proc/mdstat

 

A partir de este momento para cualquier manipulación que deseemos hacer del RAID debemos utilizar /dev/md0 y no /dev/sdb1 ni /dev/sdc1.

Le damos formato a la nueva partición:

mkfs.ext4 /dev/md0

Montamos el RAID manualmente para comprobar que todo ha funcionado correctamente y que podemos escribir en él:

mkdir /mnt/raid
mount /dev/md0 /mnt/raid

Una vez que hayamos comprobado que es escribible debemos realizar los siguientes pasos para el sistema sea capaz de montarlo de nuevo automáticamente al inicio del sistema.

Añadir el montaje en el fichero /etc/fstab:

/dev/md0 /mnt/raid ext4 defaults 0 0

O utilizando el UUID del disco del siguiente modo:

UUID=d29a94f1:eb6f59a1:e398475f2:bd4092fa /mnt/raid ext4 defaults 0 0

 

Y en el fichero /etc/mdadm/mdadm.conf incluimos también la información del RAID que hemos creado para que el sistema pueda localizarlo fácilmente. Para ello solo debemos redirigir al mismo la salida del siguiente comando, atención con no sobrescribir el fichero, por lo que podemos realizar una copia de seguridad:

cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.orig
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Editaremos el fichero para comprobar que la información referente al nuevo RAID se ha introducido correctamente y que no tenemos información errónea de otro RAID anterior. Además comprobaremos que la línea "DEVICES partitions" exista. Con esta línea se consigue que se lean automáticamente todas las particiones existentes en el sistema a partir del archivo "/proc/partitions". El resultado debe de ser parecido:

DEVICES partitions
...
ARRAY /dev/md0 metadata=0.90 UUID=d29a94f1:eb6f59a1:e398475f2:bd4092fa

Aunque en ocasiones deberemos incluir las particiones exactas que pertenecen a algún RAID, por tanto:

DEVICES /dev/sdb1 /dev/sdc1
...
ARRAY /dev/md0 metadata=0.90 UUID=d29a94f1:eb6f59a1:e398475f2:bd4092fa

Y en otras ocasiones deberemos meter la información del array directamente en la línea DEVICES del siguiente modo, eliminando la línea ARRAY:

DEVICES /dev/md0 metadata=0.90 UUID=d29a94f1:eb6f59a1:e398475f2:bd4092fa

 

Solamente nos quedaría actualizar la imagen RAM de inicio del sistema para que posea los cambios realizados en los sistemas de archivos:

update-initramfs -u -v

 

Ya podemos reiniciar nuestro sistema para comprobar que el RAID se monta automáticamente al arrancar.

 

Detalles, detener y arrancar un RAID

Para comprobar los datos de un RAID escribimos:

mdadm --detail /dev/md0

Para parar y arrancar de nuevo un RAID:

mdadm --stop /dev/md0
mdadm --run /dev/md0

 

Eliminar un RAID

Para eliminar un RAID lo único que debemos de hacer es pararlo y, posteriormente, inicializar de nuevo las particiones para eliminar la información referente al mismo.

mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc

Comprobaremos los ficheros /etc/fstab y /etc/mdadm/mdadm.conf para eliminar la información de arranque.

Solamente nos quedaría actualizar de nuevo la imagen RAM de inicio del sistema para que posea los cambios realizados en los sistemas de archivos:

update-initramfs -u -v

 

Activar un RAID

En ocasiones, un RAID puede estar marcado como inactivo, o incluso no aparecernos en el fichero /proc/mdstat, en ese caso deberemos primeramente detenerlo y luego ensamblarlo indicando las particiones que pertenecen al mismo.

mdadm --stop /dev/md0
mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1

Lo montaremos para comprobar que podemos acceder a los datos. Si lo tenemos añadido al fichero /etc/fstab podemos ejecutar el siguiente comando:

mount -a

Como puede que nos haya cambiado el UUID del RAID, debemos incluir la nueva información en el fichero /etc/mdadm/mdadm.conf, y borrar la antigua.

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

En caso de que nos haya cambiado el UUID del RAID, volveríamos a actualizar de nuevo la imagen RAM de inicio del sistema para que posea los cambios realizados en los sistemas de archivos:

update-initramfs -u -v

 

Cambiar un disco del RAID marcándolo como fallo

Si sabemos que uno de los discos del RAID está dando problemas o nos puede dar problemas en un futuro, lo mejor es cambiarlo. Para ello lo primero que debemos de hacer es indicarle al RAID que ese disco está fallando y queremos eliminarlo del RAID. Pero vemos cómo se indica la partición y no el disco duro.

mdadm --manage /dev/md0 --fail /dev/sdc1
mdadm --manage /dev/md0 --remove /dev/sdc1

A continuación apagamos el sistema, quitamos el disco marcado como fallo e instalamos un disco duro nuevo. Al arrancar debemos de tener claro cuál es el disco que hemos instalado nuevo, mediante un fdisk -l o sabiendo cuál es el disco que pertenece al RAID en /proc/mdstat. Una vez detectado le copiamos de nuevo la tabla de particiones del disco que hemos visto que está activo en el RAID al nuevo disco, por ejemplo, si hemos eliminado el disco /dev/sdc:

sfdisk -d /dev/sdb | sfdisk /dev/sdc --force

Y le indicamos al RAID que vamos a añadir una partición nueva, y justo a continuación comenzará a reconstruir el RAID:

mdadm --manage /dev/md0 --add /dev/sdc1

Comprobamos el estado de la reconstrucción:

watch cat /proc/mdstat

 

Cambiar un disco del RAID que ha desaparecido

En algunas ocasiones puede que no nos esperemos que un disco va a fallar, por lo que al arrancar el sistema el RAID está degradado al no encontrar uno de los discos que forman el RAID. En estos casos, y si el módulo mdadm no se encuentra cargado en el kernel, puede que el sistema no monte el RAID degradado automáticamente, esperando a que nosotros lo reparemos manualmente para evitar posibles errores.

Esto no ocurre cuando el disco es el disco de arranque del sistema como vamos a comprobar a continuación. En este caso el sistema pregunta en el arranque si deseamos arrancar con el RAID en modo degradado o no.

En el caso de que no se monte automáticamente, durante el arranque nos mostrará un error de que no puede montar /mnt/raid (en nuestro caso) y que si queremos omitirlo o repararlo manualmente. Lo omitiremos, y una vez arrancado nuestro sistema arrancarlo de la siguiente manera aunque sea en modo degradado.

 

Tanto si el RAID está activo como si no, el primer paso es detener el RAID y, a continuación, ensamblarlo sólo con la partición que funciona:

mdadm --stop /dev/md0
mdadm --assemble /dev/md0 /dev/sdb1 --run

Lo montaremos para comprobar que podemos acceder a los datos. Si lo tenemos añadido al fichero /etc/fstab podemos ejecutar el siguiente comando:

mount -a
Le copiamos de nuevo la tabla de particiones del disco que hemos visto que está activo en el RAID al nuevo disco, por ejemplo, si el nuevo disco es /dev/sdc:
sfdisk -d /dev/sdb | sfdisk /dev/sdc --force

Y le indicamos al RAID que vamos a añadir una partición nueva, y justo a continuación comenzará a reconstruir el RAID:

mdadm --manage /dev/md0 --add /dev/sdc1

Comprobamos el estado de la reconstrucción:

watch cat /proc/mdstat

 

Crear un RAID con el sistema de arranque

Anteriormente creamos un RAID para almacenar los datos del sistema pero dejando el sistema de arranque en el disco duro normal. Ahora vamos a clonar los datos de nuestro sistema al RAID y vamos a hacer las modificaciones necesarias para que ese RAID arranque el sistema directamente.

 

En este caso necesitaremos dos particiones en cada disco, la primera para los datos (/dev/sdb1) y la segunda para el SWAP (/dev/sdb2). Por lo que utilizamos el siguiente comando para crear las particiones en el primer disco:

fdisk /dev/sdb

A continuación modificamos las particiones del disco del RAID sdb para que sus sistema de archivos sea “Linux raid autodetected” tanto en la partición sdb1 como en la partición sdb2 que se utilizará como SWAP. Para ello ejecutamos:

#fdisk /dev/sdb

Command (m for help): t
Selected partition: 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Selected partition: 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 2080 1048288+ fd Linux raid autodetect
/dev/sdb2 2081 3080 1000 fd Linux raid autodetect

Command (m for help): w
The partition table has been altered!

 

No olvidar al final guardar la tabla de particiones pulsando la opción “w”.

Para evitar problemas con los tamaños de las particiones y no repetir los pasos en el segundo disco (sdc), utilizamos el siguiente comando para clonar la tabla de particiones de un disco a otro.

sfdisk -d /dev/sdb | sfdisk /dev/sdc --force

 

Proseguiremos creando un RAID 1 para los datos y otro para la SWAP. Para ello procedemos como anteriormente:

mdadm --create /dev/md0 --verbose --metadata=0.90 \
  --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm --create /dev/md1 --verbose --metadata=0.90 \
  --level=1 --raid-devices=2 /dev/sdb2 /dev/sdc2

 

Una vez creado el RAID comenzará a inicializarse en segundo plano. Lo comprobamos leyendo el contenido del archivo /etc/mdstat, como anteriormente:

watch cat /proc/mdstat

 

A continuación lo formateamos cada partición con su sistema de archivos adecuado.

mkfs.ext4 /dev/md0
mkswap /dev/md1 -f

 

Para que el sistema reconozca el nuevo RAID lo incluimos, al igual que antes, en el fichero /etc/mdadm/mdadm.conf. Pero a continuación debemos editarlo para no tener información de RAID duplicada y comprobar la línea DEVICES (leer más en el primer apartado de esta misma página).

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

 

Actualizamos nuevamente la imagen RAM de arranque del sistema para que conozca los nuevos cambios.

update-initramfs -u -v

 

A continuación creamos un fichero nuevo con la configuración de arranque del RAID. El fichero comenzará por 09 para que sea el primero en la orden de ejecución del GRUB, ya que por defecto el del sistema es el 10. Por eso creamos el fichero /etc/grub.d/09_raid copiándolo del fichero /etc/grub.d/40_custom para tener ya la plantilla.

En este fichero incluiremos las siguientes líneas, comprobamos el nombre de los ficheros vmlinuz y initrd.img que poseemos en el directorio /boot y escribimos su nombre completo. Se señala en negrita para saber que hay que modificarlo por el nuestro.

menuentry “Linux Raid” {
set root=’(md0)’
linux /boot/vmlinuz-2.6.38 root=/dev/md0 ro text
initrd /boot/initrd.img-2.6.38
}

Si al arrancar no montara el sistema de archivos utilizaríamos la siguiente configuración del parámetro root, utilizando uno de los dos discos del RAID para buscar el sistema de arranque:

menuentry “Linux Raid” {
set root=’(hd1,1)’
linux /boot/vmlinuz-2.6.38 root=/dev/md0 ro text
initrd /boot/initrd.img-2.6.38
}

A continuación le damos permisos de ejecución al fichero con la configuración de arranque, si no lo tiene. Y actualizamos al fichero de configuración de GRUB para que se apliquen los cambios. Si hemos copiado el archivo del 40_custom, los permisos ya los poseerá y no será necesario modificarlos.

chmod 755 /etc/grub.d/09_raid
update-grub

 

Ya tenemos nuestro arranque preparado para que inicie de los discos del RAID en lugar del disco sda. El siguiente paso es copiar todos los archivos del disco de arranque al disco del RAID. Utilizamos -a para ser recursivo y no seguir los enlaces simbólicos, y -x para que copie sólo el sistema de archivos actual. Por tanto:

mount /dev/md0 /mnt/raid
cp -axv / /mnt/raid

 

A continuación vamos a modificar el fichero /etc/fstab para que monte automáticamente al arranque el directorio / y la partición SWAP en los disco del RAID, pero ATENCIÓN, porque modificaremos el fichero fstab que ahora hay en el RAID y no en el sistema de arranque que tenemos actualmente:

nano /mnt/raid/etc/fstab

En el fichero los directorios de arranque y SWAP vendrán referencias por el UUID, lo modificaremos para que quede de la siguiente manera. Que NO se quede duplicada la entrada /dev/md0 que ya teníamos puesta en ese fichero.

/dev/md0    /      ext4  errors=remount-ro  0   1
/dev/md1    none   swap  sw                 0   0

 

Ya podemos reiniciar el sistema sin quitar aún ningún disco duro. Al arrancar ahora desde el disco sda, encontrará la primera entrada del GRUB en la que le indicamos que el sistema de arranque se encuentra en /dev/md0, por lo que no arrancará el sistema de sda.

reboot

Una vez arrancado, y si todo ha ido correctamente visualizaremos la unidades montadas en el sistema para comprobar que / está montado en /dev/md0. Si hubiera algún error solamente tenemos que arrancar con la segunda opción del GRUB en la que se encuentra el arranque por defecto en sda.

 

Si ya tenemos arrancado el sistema desde el RAID lo único que nos queda por hacer es instalar GRUB en sus discos, para que pueda arrancar sin necesitar de otro disco. Nos aseguramos que exista el fichero /etc/grub.d/09_raid que creamos en los pasos anteriores, en caso de que no existiera lo creamos y ejecutamos update-grub.

Si existe sólo nos quedaría instalar GRUB, para ello ejecutamos:

grub-install --recheck /dev/sdb
grub-install --recheck /dev/sdc

 

A continuación podemos para el sistema, quitar el disco sda, reconfigurar los puertos SATA de los discos anteriores y arrancar desde ellos. Si todo ha ido correctamente se mostará GRUB y arrancará el sistema desde /dev/md0.

Al igual que antes podremos quitar uno de los disco y reemplazarlo por otro nuevo ejecutando los comandos ya listados anteriormente. Sin olvidar que ahora tenemos otro RAID para la SWAP. Cada vez que introduzcamos un disco nuevo deberemos de reinstalar GRUB.