Deshaciendo Raid Con Mdadm Sin Reinstalar Sistema Operativo

domingo, 8 de mayo de 2022
Tiempo de lectura 7 minutos

En la actualidad, dispongo de un servidor dedicado en Hetzner en el que he estado alojando algunas cosas de carácter personal. Hace un par de días, me vi en la necesidad de sacar uno de los dos discos duros que lleva el servidor del Software raid que va configurado por defecto en todas las imágenes de hetzner, al menos de los sistemas Linux basados en Debian que se pueden instalar mediante Hetzner robot.

Normalmente, la configuración en Raid que incluyen los servidores es buena (teniendo en cuenta que Raid no ofrece backups, sino redundancia), pero necesitaba ese segundo disco para otra cosa, así que me vi forzado a modificar el raid para dejar de incluir el segundo disco del servidor. Lo interesante de todo esto es que a diferencia de lo que sugieren en su guía oficial, en este caso he tenido qué modificar el raid, en lugar de destruirlo, para evitar entrar en el modo rescue de hetzner y así mismo evitar probar suerte con tener qué instalar el sistema desde cero si me cargaba todo el Raid por software.

Esta publicación es simplemente un escrito sobre cómo he conseguido esto, por si es útil en un futuro.

Nota: si lees esto y quieres probar, es importante saber que una mala configuración o ejecución de los comandos pueden terminar con un software raid que no funciona como debe, especialmente si se comete un error al quitar particiones de un disco diferente al que se trabaja siempre. Los daños de hardware no son esperables en este tipo de casos, pero sí se puede arruinar todo el Raid, haciendo difícil rescatar el sistema operativo.

revisando el Raid por software en el sistema

Antes de comenzar a tocar nada, es importante averiguar dónde estamos, en términos de la configuración Raid. Con el siguiente comando podemos obtener algo de información sobre nuestra situación:

root@Debian-1100-bullseye-amd64-base ~ # lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop1     7:1    0 110.6M  1 loop  /snap/core/12834
loop2     7:2    0 111.6M  1 loop  /snap/core/12941
loop3     7:3    0  43.9M  1 loop  /snap/certbot/2035
loop4     7:4    0  43.9M  1 loop  /snap/certbot/1952
loop5     7:5    0  61.9M  1 loop  /snap/core20/1405
loop6     7:6    0  61.9M  1 loop  /snap/core20/1434
sda       8:0    0   3.6T  0 disk
├─sda1    8:1    0    16G  0 part
│ └─md0   9:0    0    16G  0 raid1 [SWAP]
├─sda2    8:2    0   512M  0 part
│ └─md1   9:1    0   511M  0 raid1 /boot
├─sda3    8:3    0     2T  0 part
│ └─md2   9:2    0     2T  0 raid1 /
├─sda4    8:4    0   1.7T  0 part
│ └─md3   9:3    0   1.7T  0 raid1 /home
└─sda5    8:5    0     1M  0 part
sdb       8:16   0   3.6T  0 disk
├─sdb1    8:17   0    16G  0 part
│ └─md0   9:0    0    16G  0 raid1 [SWAP]
├─sdb2    8:18   0   512M  0 part
│ └─md1   9:1    0   511M  0 raid1 /boot
├─sdb3    8:19   0     2T  0 part
│ └─md2   9:2    0     2T  0 raid1 /
├─sdb4    8:20   0   1.7T  0 part
│ └─md3   9:3    0   1.7T  0 raid1 /home
└─sdb5    8:21   0     1M  0 part

De esto podemos extraer la siguiente información:

  • Tenemos dos discos (sda y sdb), que tienen el mismo número de particiones.
  • en nuestro software raid, hay 4 particiones: md0 (espacio Swap), md1 (partición boot), md2 (partición del sistema, montado en /) y md3 (partición para el directorio de usuarios, montado en /home).
  • Las particiones que hemos mencionado en el punto anterior están configuradas en raid 1. Esto significa que en los dos discos, SDA y SDB, se sincronizan los mismos datos cada vez que hay algún cambio, para tener, prácticamente, un disco siendo el espejo del otro.

Estrategia a seguir

En este caso, lo que vamos a hacer, es retirar el segundo disco del raid (SDB). Para hacerlo, tenemos qué marcar el disco como defectuoso y removerlo del raid, después redimensionar el raid para que se configure para usar un solo disco en lugar de los dos esperados, y finalmente, eso se deberá repetir en las 4 particiones (md0, md1, md2 y md3). Al término de estos pasos, se podrá reiniciar el servidor y disponer del segundo disco, que no estará vinculado al raid de ninguna forma, aunque se deberá particionar y formatear antes de poder usarse.

Paso 1. Revisando la partición en el raid

Estos pasos se deberán repetir para cada partición existente en el raid. En este ejemplo se muestra el procedimiento para la partición md0, pero se debe efectuar lo mismo en las otras 3. Presta atención a las particiones del raid (mdx) contra las particiones del disco físico (sdbx). Normalmente, la partición md0 está asignada a la primer partición del disco (sdb1), la partición md1 está asignada a sdb2, y así sucesivamente.

Lo primero que hay qué hacer, es revisar el estado de la partición sobre la que actuaremos en el raid con el siguiente comando:

root@Debian-1100-bullseye-amd64-base ~ # mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Nov 26 21:01:16 2021
        Raid Level : raid1
        Array Size : 16759808 (15.98 GiB 17.16 GB)
     Used Dev Size : 16759808 (15.98 GiB 17.16 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun May  8 09:32:50 2022
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : rescue:0
              UUID : 252735b5:26dfa166:e5010586:ff4ac61e
            Events : 66

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

Aquí la información más importante se encuentra en las dos últimas líneas de la respuesta de este comando, ya que nos muestra las particiones de ambos discos donde md0 vive. Como vamos a separar el disco SDB del raid, nos interesa saber que la partición a sacar del raid será sdb1.

Paso 2. Marcando la partición como defectuosa

Si el raid funciona bien (sin haberse detectado errores smart), Mdadm, que es el programa que nos crea el software raid, no permite desacoplar una partición sin más. Si queremos remover una partición física de un sistema en raid hecho con mdadm, primero tenemos qué marcar la partición como fallida. Esto nos permitirá luego removerla del raid y desacoplarla. El juego terminará cuando logremos desacoplar todas las particiones asociadas al raid. En ese momento, el disco estará libre.

Para marcar una partición como fallida, hemos de utilizar el siguiente comando, reemplazando la partición del raid (en este caso md0) y la partición del disco que queremos desacoplar (en este caso sdb1):

root@Debian-1100-bullseye-amd64-base ~ # mdadm /dev/md0 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0

Paso 3. Remover partición fallida del raid

Una vez que hemos indicado a mdadm que la partición sdb1 es fallida, podemos proceder a sacarla del raid, lo que preparará todo para desacoplarla definitivamente luego. Para removerla, utilizaremos este comando:

root@Debian-1100-bullseye-amd64-base ~ # mdadm /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0

Paso 4. Configurar el raid para usar solo un disco

El paso final para esta partición es redimensionar el raid para indicarle que solo deberá utilizar un dispositivo, así no marcará ningún estado degradado. En términos de mdadm, lo que haremos será “agrandar” el raid, para que tenga en cuenta que solo usará un dispositivo. A primera vista se ve raro, pero vamos con el comando:

root@Debian-1100-bullseye-amd64-base ~ # mdadm --grow /dev/md0 --raid-devices=1 --force
raid_disks for /dev/md0 set to 1

Conclusión

Una vez realizados estos pasos en cada partición del raid, es seguro reiniciar el equipo. Ahora tenemos un raid de un solo dispositivo que aunque parece raro, al menos ha hecho que no tengamos qué reinstalar el sistema operativo. Para comprobar el estado del nuevo raid, podemos utilizar bien el comando mdadm -D /dev/md0 (cambiando el número de partición para verlas todas), o el comando lsblk, para mostrar todos los dispositivos de almacenamiento en el sistema. En ambos casos deberíamos notar que el disco sdb ya no está asociado al raid, lo que significa que ya se le puede dar formato y usar a libre elección.

Fuente (en inglés)

Administración Linux Tutoriales

mdadm Raid Debian