mdadm es la herramienta estándar para crear y administrar RAID por software en Linux. Combina varios discos en un único dispositivo (/dev/md0) que el kernel gestiona sin necesidad de una controladora RAID dedicada. En este tutorial crearás un RAID 1 (espejo) con dos discos en Ubuntu 24.04, lo montarás de forma persistente, configurarás las alertas y practicarás la sustitución de un disco averiado. Al final verás cómo crear otros niveles, como RAID 5 o RAID 10.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS con al menos dos discos adicionales vacíos del mismo tamaño, por ejemplo un servidor dedicado de CubePath. En los ejemplos son /dev/sdb y /dev/sdc.
  • Un usuario no root con privilegios sudo.

Los comandos de mdadm son iguales en Debian 12. En Rocky Linux 9 el archivo de configuración es /etc/mdadm.conf y el initramfs se regenera con sudo dracut -f.

Elegir el nivel de RAID

NivelDiscos mínimosCapacidad útilDiscos que pueden fallarUso típico
RAID 02100 %NingunoDatos temporales donde solo importa la velocidad
RAID 1250 %Todos menos unoDisco del sistema, bases de datos pequeñas
RAID 53(N-1) discos1Almacenamiento con más lecturas que escrituras
RAID 64(N-2) discos2Arrays grandes con discos de mucha capacidad
RAID 10450 %1 por pareja espejoBases de datos y cargas con muchas escrituras

RAID 1 es el punto de partida más sencillo y el que se usa en esta guía. Con discos grandes, la reconstrucción de un RAID 5 tarda horas y durante ese tiempo otro fallo supone perder el array, por lo que en esos casos RAID 6 o RAID 10 son preferibles.

Paso 1: Instalar mdadm e identificar los discos

Instala mdadm (en muchas instalaciones de Ubuntu Server ya viene):

sudo apt update
sudo apt install mdadm

Si apt propone instalar y configurar un servidor de correo como Postfix, puedes elegir "Sin configuración" por ahora y configurarlo después si quieres recibir alertas por email.

Identifica los discos vacíos:

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
NAME   SIZE TYPE FSTYPE MOUNTPOINTS
sda    100G disk
├─sda1   1M part
└─sda2 100G part ext4   /
sdb    500G disk
sdc    500G disk

Comprueba que no tienen restos de un RAID o sistema de archivos anterior:

sudo mdadm --examine /dev/sdb /dev/sdc
sudo wipefs /dev/sdb /dev/sdc

Si mdadm --examine responde No md superblock detected y wipefs no imprime nada, los discos están limpios. Si encuentras firmas antiguas que puedes borrar, elimínalas con sudo wipefs -a /dev/sdb /dev/sdc.

Paso 2: Crear el array RAID 1

Crea el array /dev/md0 con los dos discos:

sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

mdadm avisa de que los metadatos están al principio del disco y pide confirmación. Responde y:

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? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

El aviso solo importa si pretendes arrancar desde este array; para un disco de datos no afecta.

Paso 3: Seguir la sincronización inicial

Al crearse, el array copia el contenido de un disco al otro. Consulta el progreso en /proc/mdstat:

cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc[1] sdb[0]
      524155904 blocks super 1.2 [2/2] [UU]
      [==>..................]  resync = 12.6% (66191360/524155904) finish=38.2min speed=199580K/sec
      bitmap: 4/4 pages [16KB], 65536KB chunk

unused devices: <none>

[2/2] [UU] indica que los dos discos están activos y sanos. Un guion bajo ([U_]) indicaría un disco que falta o ha fallado. Para seguir el progreso en directo, usa watch cat /proc/mdstat y sal con Ctrl+C.

No hace falta esperar a que termine: puedes crear el sistema de archivos y usar el array mientras se sincroniza, aunque irá algo más lento hasta entonces.

Paso 4: Crear el sistema de archivos y montarlo

Crea un sistema de archivos ext4 sobre el array:

sudo mkfs.ext4 -L raid1 /dev/md0

Crea el punto de montaje y monta el array:

sudo mkdir -p /mnt/raid1
sudo mount /dev/md0 /mnt/raid1
df -h /mnt/raid1
Filesystem      Size  Used Avail Use% Mounted on
/dev/md0        492G   28K  467G   1% /mnt/raid1

Paso 5: Hacer la configuración persistente

Si no se registra en la configuración, el array puede aparecer como /dev/md127 tras reiniciar o no montarse al arrancar. Añade la definición del array a /etc/mdadm/mdadm.conf:

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 UUID=8f2a1c3b:4d5e6f70:81920a1b:2c3d4e5f

Actualiza el initramfs para que el array se ensamble al principio del arranque:

sudo update-initramfs -u

Obtén el UUID del sistema de archivos (distinto del UUID del array que acabas de ver):

sudo blkid /dev/md0
/dev/md0: LABEL="raid1" UUID="b7d4e2a9-1c3f-4a6b-8e5d-0f9c2a7b3e61" BLOCK_SIZE="4096" TYPE="ext4"

Abre /etc/fstab:

sudo nano /etc/fstab

Añade esta línea al final con tu UUID:

UUID=b7d4e2a9-1c3f-4a6b-8e5d-0f9c2a7b3e61  /mnt/raid1  ext4  defaults,nofail  0  2

nofail permite que el servidor arranque aunque el array no se ensamble. Comprueba la entrada antes de reiniciar:

sudo umount /mnt/raid1
sudo systemctl daemon-reload
sudo mount -a
findmnt /mnt/raid1

Reinicia y confirma que /dev/md0 sigue existiendo y está montado:

sudo reboot
cat /proc/mdstat
findmnt /mnt/raid1

Paso 6: Configurar las alertas

mdadm incluye un servicio de monitorización que avisa cuando un disco falla o el array se degrada. Comprueba que está activo:

systemctl status mdmonitor

El destinatario de las alertas se define con MAILADDR en /etc/mdadm/mdadm.conf:

sudo nano /etc/mdadm/mdadm.conf

Sustituye el valor por tu dirección:

Para que el correo salga, el servidor necesita un agente de correo configurado (Postfix como relay, por ejemplo). Reinicia el servicio y envía una alerta de prueba:

sudo systemctl restart mdmonitor
sudo mdadm --monitor --scan --test --oneshot

Deberías recibir un correo cuyo asunto empieza por TestMessage event on /dev/md0. Si no llega, revisa el registro del agente de correo con sudo journalctl -u postfix.

Consulta también el estado detallado del array cuando quieras:

sudo mdadm --detail /dev/md0

La línea State : clean y los dos discos como active sync indican que todo está bien.

Paso 7: Sustituir un disco averiado

Practicar la sustitución antes de necesitarla es la mejor forma de no cometer errores con un disco real fallando. Marca /dev/sdc como averiado:

sudo mdadm /dev/md0 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0

El array sigue funcionando con un solo disco, en estado degradado:

cat /proc/mdstat
md0 : active raid1 sdc[1](F) sdb[0]
      524155904 blocks super 1.2 [2/1] [U_]

Retira el disco del array:

sudo mdadm /dev/md0 --remove /dev/sdc

Con un disco realmente averiado, este es el momento de sustituirlo físicamente. Antes, anota su número de serie para cambiar el disco correcto: lsblk -o NAME,SERIAL o ls -l /dev/disk/by-id/. Si el disco nuevo no está vacío, límpialo con wipefs -a.

Añade el disco nuevo (en esta práctica, el mismo /dev/sdc) al array:

sudo mdadm /dev/md0 --add /dev/sdc

La reconstrucción empieza automáticamente:

cat /proc/mdstat
md0 : active raid1 sdc[2] sdb[0]
      524155904 blocks super 1.2 [2/1] [U_]
      [>....................]  recovery =  3.1% (16384000/524155904) finish=41.3min speed=204800K/sec

Cuando termine, el estado vuelve a [2/2] [UU]. No es necesario tocar mdadm.conf ni /etc/fstab, porque el array se identifica por su UUID.

Otros niveles de RAID

La creación solo cambia en --level y el número de discos. El resto de pasos (sistema de archivos, mdadm.conf, update-initramfs, /etc/fstab) son idénticos.

RAID 5 con tres discos:

sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdd /dev/sde /dev/sdf

RAID 10 con cuatro discos:

sudo mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sdd /dev/sde /dev/sdf /dev/sdg

Para añadir un disco de repuesto que entre automáticamente cuando otro falle, usa --add sobre un array que ya está completo: el disco queda marcado como spare.

sudo mdadm /dev/md0 --add /dev/sdd

Eliminar un array

Si necesitas deshacer el array para reutilizar los discos, desmóntalo, elimina su línea de /etc/fstab y de /etc/mdadm/mdadm.conf, detenlo y borra los metadatos de cada disco:

sudo umount /mnt/raid1
sudo mdadm --stop /dev/md0
sudo mdadm --zero-superblock /dev/sdb /dev/sdc
sudo update-initramfs -u

Solución de problemas

El array aparece como /dev/md127 tras reiniciar. Falta la línea ARRAY en /etc/mdadm/mdadm.conf o no se regeneró el initramfs. Añádela con mdadm --detail --scan, elimina duplicados si los hay y ejecuta sudo update-initramfs -u. Montar por UUID en /etc/fstab evita que el cambio de nombre afecte al montaje.

El array está inactive en /proc/mdstat. Deténlo y vuelve a ensamblarlo a partir de los metadatos de los discos:

sudo mdadm --stop /dev/md0
sudo mdadm --assemble --scan

La reconstrucción va muy lenta. El kernel limita la velocidad para no afectar al resto de la E/S. Consulta los límites con sysctl dev.raid.speed_limit_min dev.raid.speed_limit_max y sube temporalmente el mínimo, por ejemplo sudo sysctl -w dev.raid.speed_limit_min=100000 (en KB/s).

Un disco se marca como averiado repetidamente. Revisa su estado SMART con sudo smartctl -a /dev/sdc (paquete smartmontools). Errores de sectores reasignados o pendientes en aumento indican que hay que sustituirlo.

Conclusión

Has creado un RAID 1 con mdadm, lo has montado de forma persistente por UUID, has configurado las alertas y has practicado la sustitución de un disco sin perder datos. Como siguientes pasos, puedes crear un grupo de volúmenes LVM sobre /dev/md0 para repartir y ampliar el espacio con flexibilidad, vigilar la salud de los discos con smartmontools y programar copias de seguridad externas, que RAID no sustituye.