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
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.
Enlaces transversales de Book para RAID Software
RAID Software escrito por Rafa Morales está protegido por una licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional