En corto

1
2
3
4
5
6
7
8
mdadm --add /dev/md0 /dev/sdd
mdadm --grow /dev/md0 --raid-devices=4 --backup-file=/root/md0-grow.bak   # en OTRO disco, nunca en el array
cat /proc/mdstat                            # reshape = [====>....] 23.4% ... finish=310min

# cuando termine:
resize2fs /dev/md0                          # ext4, en caliente
xfs_growfs /mnt/vol1                        # xfs, montado
rm /root/md0-grow.bak

De 3 discos a 4 en un RAID 5: la capacidad útil pasa de 2 a 3 discos. El reshape reescribe todos los stripes y tarda horas o días según el tamaño; el array sigue en servicio mientras tanto.

Antes de tocar nada

  1. Backup. El reshape es la operación más delicada de md: reescribe todos los datos con el array en producción. Si algo se va a romper, es aquí.

  2. Array sano. mdadm --detail /dev/md0 debe decir State : clean sin degraded, recovering ni resyncing. Nunca hagas --grow sobre un array degradado.

  3. Discos sanos. smartctl -H /dev/sdX en todos los miembros. Un disco que muere a mitad del reshape de un RAID 5 es pérdida total.

  4. Disco nuevo del mismo tamaño o mayor. Si el array usa particiones en vez de discos completos, copia la tabla del disco existente al nuevo:

    1
    2
    
    sfdisk -d /dev/sda | sfdisk /dev/sdd            # MBR
    sgdisk -R /dev/sdd /dev/sda && sgdisk -G /dev/sdd   # GPT (-G regenera los GUID)
    

    y añade /dev/sdd1 en lugar de /dev/sdd.

Paso a paso

1. Añadir el disco. Entra como spare:

1
2
mdadm --add /dev/md0 /dev/sdd
mdadm --detail /dev/md0 | tail -6       # ... 3 8 48 - spare /dev/sdd

2. Crecer el array. Es lo que arranca el reshape:

1
mdadm --grow /dev/md0 --raid-devices=4 --backup-file=/root/md0-grow.bak

--backup-file guarda una copia de los stripes que están siendo reescritos en el tramo crítico del reshape. Tiene que estar en un disco que no forme parte del array y que no sea tmpfs. En arrays con metadata 1.2 y espacio libre antes del área de datos mdadm a veces avisa de que no lo necesita; darlo no hace daño.

3. Vigilar.

1
watch -n 30 cat /proc/mdstat

Por defecto md se autolimita para no matar el rendimiento (speed_limit_min = 1000 KB/s cuando hay carga). Si el array no está atendiendo a nadie, súbelo:

1
2
sysctl -w dev.raid.speed_limit_min=200000
sysctl -w dev.raid.speed_limit_max=500000

4. Crecer el sistema de archivos. Cuando /proc/mdstat ya no muestre reshape, mdadm --detail dará Raid Devices : 4 y un Array Size mayor. El sistema de archivos sigue ocupando el tamaño viejo:

1
2
resize2fs /dev/md0            # ext2/3/4, funciona montado
xfs_growfs /mnt/vol1          # xfs, se indica el punto de montaje, montado

5. Limpieza. Borra el backup-file. /etc/mdadm/mdadm.conf no cambia: la línea ARRAY identifica el array por UUID, no por número de discos. Si / vive en el array, regenera el initramfs por prudencia (update-initramfs -u en Debian/Ubuntu, dracut -f en RHEL/Fedora).

Trampas

  • No se puede deshacer. Una vez empieza el reshape solo termina hacia delante. Puedes reiniciar la máquina (continúa solo al ensamblar) pero no cancelarlo.
  • Corte de luz a mitad. Si al arrancar el array no se ensambla, mdadm --assemble /dev/md0 --backup-file=/root/md0-grow.bak /dev/sd[abcd]; ahí es donde el backup-file se gana el nombre.
  • Bitmap. Si mdadm se niega por el write-intent bitmap, quítalo antes y vuelve a ponerlo al terminar: mdadm --grow --bitmap=none /dev/md0 … mdadm --grow --bitmap=internal /dev/md0.
  • Cambiar el chunk (mdadm --grow --chunk=128 /dev/md0) también es un reshape completo, con las mismas reglas.
  • Discos grandes en RAID 5 son una apuesta: con 4 discos de 8 TB, la reconstrucción tras un fallo dura días sin redundancia. El mismo --grow permite pasar a RAID 6: mdadm --grow /dev/md0 --level=6 --raid-devices=5 --backup-file=….
  • Discos completos vs particiones. Mezclar /dev/sdd con /dev/sda1 funciona pero luego confunde; sigue el patrón que ya tenga el array.

Referencias: Growing en la Linux RAID Wiki y man 8 mdadm (sección GROW MODE).