Yo expandí un RAID de discos online, sin desmontar, y viví para contarlo.

Otro título sugerido: cómo redimensionar para agrandar un raid de cualquier nivel, raid 1, raid 0, raid 5, raid 10, etc etc, en Linux, sin desmontar el sistema de archivos y sin reiniciar el servidor o computadora, desde la CLI (consola de comandos) en modo interactivo, sin entorno gráfico.

Otro más: como coquetear con la muerte, mirarla fijo a los ojos y decirle: yo leí un post en internet, es imposible que nada salga mal, mientras cambiás el tamaño de tu raid de discos y le sacás brillo a tus dos bolas de titanio.

El que sigue es otro de mi [HowTo] pero en este caso en particular, uno delicado. Uno donde si la cagás perdés toda la información. Se rompe todo y difícilmente puedas recuperar algo sano. Así que lo voy a dejar bien en claro: hacé backup. Si no tenés backup, no hagas nada. Hacé FSCK, sin un sistema de archivos consistente, no hagas nada.

Se trata de manipular particiones, sistemas de archivos y raid de discos con una de las herramientas mas peligrosas que tiene linux, mdadm, por lo que insisto:

Backup, mucho backup.

Habiendo dejado lo anterior en claro, vamos a los bifes. Te cuento, te explico y te muestro como redimensionar un RAID de discos en cualquiera de sus variantes para expandirlo desde el tamaño actual al que quieras que tenga, aumentando su capacidad de almacenamiento. Todo esto sin reiniciar y sin desmontar, cosa especialmente útil para servidores en producción y especialmente contraindicada para personas susceptibles a cometer errores bajo presión o propensas a ataques de pánico.

Voy a omitir toda la parte en donde explicaría qué, cómo y para qué. Voy a presuponer que estás familiarizado con el concepto de RAIDs de discos en sus diferentes versiones y pasar derecho a poner dedos a la obra.

Para el ejemplo, supongamos dos discos, cada uno de 2TB de capacidad, dentro del cual tenés a su vez dos particiones de tipo FD (Linux Raid autodetect) de 1TB de capacidad y querés extender el RAID (que llamaré md0, compuesto por sda1 y sdb1) para que utilice el 100% de la capacidad de los discos.

A grosso modo el procedimiento implica estos 14 sencillos pasos:

  1. Quitar el disco 1 del RAID.
  2. Eliminar la partición de 1TB.
  3. Crear una nueva partición de tipo RAID de 2TB.
  4. Agregar la nueva partición de 2TB al RAID md0.
  5. Esperar a que el RAID sincronice.
  6. Quitar el disco 2 del RAID.
  7. Eliminar la partición de 1TB.
  8. Crear una nueva partición de tipo RAID de 2TB.
  9. Agregar la nueva partición de 2TB a md0
  10. Esperar a que el raid sincronice.
  11. Redimensionar el RAID
  12. Esperar a que el raid sincronice.
  13. Redimensionar el sistema de archivos.
  14. Esperar a que la redimensión se complete.

En definitiva: muchas horas culo, mucho cortar clavos, mucho café, mucho cruzar los dedos y mucha paciencia. Cada una de las 14 etapas que impliquen esperar y dependiendo de la carga podría insumir hasta varias horas en completarse.

Ahora que sabés a que atenerte:

1 – Quitar el disco 1 del RAID:

# Marcar como fallada la partición sda1:

mdadm -f /dev/md0 /dev/sda1

Hecho esto, en tu dmesg deberías ver algo parecido a esto:

[97717.025096] md/raid1:md1: Disk failure on sd11, disabling device.                                           
[97717.025099] md/raid1:md3: Operation continuing on 1 devices.  

Es MUY recomendable que vayas tirando de dmesg después de cada comando para constatar que todo va bien.

# Retirar la partición sda1 del RAID md0:

mdadm -r /dev/md0 /dev/sda1

2/3 – Eliminar la partición sda1 del disco y generar una nueva.

Si estás familiarizado con fdisk:

fdisk /dev/sda

d

n

p

1

[enter]

[enter] (o definí el tamaño máximo en GB, bloques o porcentaje)

t

fd

w

Si sos de los que prefieren parted, deberías optar por parted /dev/sda resizepart 1 (y acá el tamaño) pero como ya sabrás en tal caso, a parted no le podés decir «usá todo el disco de punta a punta«, caso en el cual deberías optar o bien por utilizar un script como este, o bien por borrar y regenerar así:

parted -a optimal /dev/sda

rm

1 

mklabel msdos

mkpart

primary

[enter]

2048s

-1

set raid 1 on

align-check

w

4 – Agregar la partición sda1 recientemente expandida desde 1 TB a 2 al raid en /dev/md0:

mdadm --add /dev/md0 /dev/sda1

5 – Esperar a que el raid sincronice.

Llegado a este punto solamente resta esperar un rato. Pueden ser desde varios minutos hasta varias horas dependiendo de la carga de la computadora o servidor. Tirando de dmesg podrás hacerte una idea aproximada del mínimo de velocidad al que se copiará el terabyte de datos desde el disco 2 al disco 1, que al terminar te lo indicará con un alegre «resync done»:

[138674.979928] md: resync of RAID array md0
[138674.979931] md: minimum guaranteed speed: 1000 KB/sec/disk.
[138674.979933] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync.
[138674.979937] md: using 128k window, over a total of 1953382488k.
[138674.979939] md: resuming resync of md3 from checkpoint.
[157017.958610] md: md0: resync done.

Mientras todo eso pasa, podés ir mirando el estado de la carga del disco, de todo el sistema o de la sincronización del los raids ejecutando respectivamente:

# Para el estado de la sincronización:

cat /proc/mdstat 


# Para la carga de sobre los discos:

iotop

nmon (con la opción d)


# Para la carga sobre todo el sistema:

top

o con colores:

htop


etc, etc.

6 al 10 – Repetir todos los pasos anteriores, pero reemplazando el disco 1 por el disco 2. Para el caso del ejemplo: reemplazando sda por sdb.

11 – Redimensionar el raid al 100% de su capacidad:

mdadm --grow /dev/md0 -z max

12 – Esperar a que el raid termine de sincronizar. Ver el punto 5.

13 – Redimensionar el sistema de archivos:

resize2fs /dev/md0

14 – Esperar a que la redimensión concluya:

Redimensionar el sistema de archivos es otro punto clave que puede insumir desde varios minutos a varias horas. Cuando lo hacés offline (con la partición desmontada), podés usar resize2fs -p /dev/md0 para tener una idea aproximada de cuánto falta para que el proceso termine por que te lo representa mediante una barra de progreso.
Como en el caso que nos ocupa estamos trabajando siempre online, el único método que conozco para entender que tan bien va funcionando todo es monitorear la carga sobre los discos (ver el punto 5) o ejecutar mediante watch o manualmente cada tanto:

df /dev/md0

# Para human readable:

df -h /dev/md0

# Para actualización automática cada 5 segundos:

df -h -n 5 /dev/md0

15 – Profit.

Si llegaste hasta acá sano y salvo, te felicito. Considerate el elegido. Tu raid se extendió, tu ninjitsu ahora es más letal y certero y tu tranquilidad mental estará a buen recaudo hasta nuevo aviso.

Si te sirvió, avisame en los comentarios. Si la cagaste y ahora estás viviendo en la calle y desocupado por seguir un tutorial de internet, avisame en los comentarios. Si usás Brave Browser para navegar por internet, dejame unos BAT de propina y te prometo que me la gastaré en café.

¿Te sirvió? De nada.

1 comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *