LVM RAID-1 con Linux

02 de julio de 2020

Ya he hablado sobre LVM en Linux. Hoy quiero darle un repaso a otras opciones del gestor de volúmenes lógicos. RAID-1 sobre LVM.

Aunque hace bastante que no escribo, (parece que tenía las ganas en confinamiento) este tema de los sistemas de ficheros me gusta bastante y no quiero desaprovechar la ocasión de aprender un poco más mientras lo comparto.

En esta ocasión cuento con tres discos virtuales. El disco donde tengo el sistema operativo, Debian 9, y dos discos de 4GB.

Y lo que pretendo conseguir hoy es:

  1. Crear un grupo volumen con dos volúmenes lógicos en RAID-1(espejo).
  2. Quitar uno de los discos e intentar recuperar el espejo en un nuevo disco vacío.
  3. Añadir un tercer disco e intentar extender el grupo volumen en los tres discos, incluido el RAID-1. (Aquí tengo la duda de cómo manejará lvm el RAID-1 con tres discos)

¡Vamos allá!

Instalando lvm2 en Debian 9

Empiezo recordando cómo instalar lvm en Debian GNU/Linux o familia.

sudo apt update
sudo apt dist-upgrade
sudo apt install lvm2Lenguaje del código: Bash (bash)

Preparar un grupo volumen

Instalado lvm2, vemos los discos con lsblk.

Ejecución de lsblk

Voy a usar dos discos, sdb y sdc, para hacer el grupo volumen. Empiezo creando los volúmenes físicos:

sudo pvcreate /dev/sd{b,c}
sudo pvscanLenguaje del código: Bash (bash)
pvcreate y pvscan

Ahora creo el grupo volumen y le asigno los volúmenes físicos que lo forman inicialmente.

vgcreate vg_raid-1_01 /dev/sdb /dev/sdc
vgscan
vgdisplayLenguaje del código: Bash (bash)
vgcreate

Definir un volumen lógico con espejo (RAID-1)

Tenemos el grupo volumen formado por dos volúmenes físicos. Pero para poder ser utilizable, recordemos que hay que definir al menos un volumen lógico. En este caso, para un RAID-1, necesito ejecutar:

lvcreate --mirrors 1 --size 3.8G vg_raid-1_01Lenguaje del código: Bash (bash)

Traduzco: crea un volumen lógico, con un espejo, de 3.8Gigabytes en el grupo volumen vg_raid-1_01.

Con lvdisplay, podemos ver que el volumen lógico /dev/vg_raid-1_01/lvol0 tiene dos volúmenes en espejo de 3.8GB cada uno.

Como con cualquier unidad, tenemos que darle formato. Voy a usar ext4 por ser, quizás, la más extendida.

mkfs.ext4 /dev/vg_raid-1_01/lvol0

Experimentos con lvm RAID-1

A continuación lo monto y escribo algún fichero para empezar a hacer pruebas.

mount -t ext4 /dev/vg_raid-1_01/lvol0 /mnt
cd /mnt
echo "Este es mi ficherito para hacer experimentos" > mi_ficherito_lere.txt
cd 
umount /mnt
shutdown -h nowLenguaje del código: Bash (bash)

Quitando un disco al lvm RAID

Con la máquina apagada, quito uno de los discos del grupo volumen y reinicio. A ver qué pasa:

Pues detecta que el volumen lógico está incompleto, y lo desactiva.

Como existe una copia completa en cada uno de los discos, en este caso puedo pedirle que active el volumen advirtiéndole que está degradado.

lvchange -ay --activationmode degraded /dev/vg_raid-1_01/lvol0
mount -t ext4 /dev/vg_raid-1_01/lvol0 /mnt
cd /mnt
lsLenguaje del código: Bash (bash)

He podido comprobar que está todo correcto. El fichero es accesible sin problema. Así que puedo desmontar y reiniciar.

cd
umount /mnt
shutdown -h nowLenguaje del código: Bash (bash)

Reparar el RAID añadiendo un nuevo disco

Ahora voy a intentar reparar el RAID-1. Para ello uso otro disco. Este disco va a ser de 8GB en lugar de los 4GB que tenía el anterior. Para LVM esto no debería ser un problema.

En primer lugar, compruebo que el disco está conectado con lsblk.

Ahí está, como sdc.

Lo defino como volumen físico:

pvcreate /dev/sdcLenguaje del código: Bash (bash)

Y lo añado al grupo volumen con vgextend.

vgextend vg_raid-1_01 /dev/sdcLenguaje del código: Bash (bash)

Con lvscan, vemos que el volumen lógico vuelve a estar inactivo. Parece que es necesario que esté activo para poder actuar sobre él y repararlo. Repito el comando para activarlo degradado.

lvchange -ay --activationmode degraded /dev/vg_raid-1_01/lvol0Lenguaje del código: Bash (bash)

Pese a los errores y advertencias, el volumen está ahora activo.

Puedo pasar a reparar el RAID usando el nuevo volumen físico, /dev/sdc.

lvconvert --repair /dev/vg_raid-1_01/lvol0 /dev/sdc/Lenguaje del código: Bash (bash)

Al hacer vgscan, vamos a ver que todavía se detecta la falta del disco duro anterior en el grupo volumen. Esto no queda bien. Voy a evitar que salga este error quitando los volúmenes físicos que no estén disponibles del grupo volumen.

vgreduce --removemissing vg_raid-1_01Lenguaje del código: Bash (bash)

Leo por ahí que es conveniente forzar una resincronización de los discos. Para conocer el estado de sincronización, uso el comando lvs, o lvs -a. Si el parámetro Cpy%Sync está al 100,00%, está todo correcto, si no, será recomendable forzar la sincronización con:

lvchange --syncaction repair /dev/vg_raid-1_01/lvol0Lenguaje del código: Bash (bash)

LVM RAID-1 con tres discos

Aquí se dan varias posibilidades. Las enumero:

Tres discos iguales y tres copias en espejo: Una copia en cada disco.

| mirror 0 | mirror 1 | mirror 2 |
|              lv01              |
|               vg               |
|   pv-1   |   pv-2   |   pv-3   |
| /dev/sdb | /dev/sdc | /dev/sdd |

Tres discos distintos y tres copias en espejo. Cada copia no puede ser más grande que el disco más pequeño.

| mirror 0 | mirror 1 |000000| mirror 2 |00000000000|
|======= lv01 ========|000000|== lv01 ==|00000000000|
|======================= vg ========================|
|   pv-1   |       pv-2      |         pv-3         |
| /dev/sdb |    /dev/sdc     |       /dev/sdd       |

Tres discos iguales y dos copias. Se hacen espejos pero ningún disco tiene una copia completa de toda la información… Esto, para mí, es raro.

|    mirror 0    |   mirror 1    |
|              lv01              |
|               vg               |
|   pv-1   |   pv-2   |   pv-3   |
| /dev/sdb | /dev/sdc | /dev/sdd |

En este caso, en el disco físico sdc contendría parte del espejo, pero un fallo en este disco, daría al traste con la seguridad que aporta RAID-1.

Pero, ¿por qué andarse con suposiciones? Vamos a ver qué hace realmente lvm si intento crear este esquema

Añado dos nuevos discos de 4GB. Ahora la máquina tiene cinco discos, tres de 4GB, uno de 8GB y el que tiene instalado el sistema operativo.

Deshago la configuración LVM anterior:

lvremove /dev/vg_raid-1_01/lvol0
vgremove vg_raid-1_01
pvremove /dev/sd{b,c,d,e}Lenguaje del código: Bash (bash)

Y vuelta a empezar:

pvcreate /dev/sd{b,c,d,e}
vgcreate vg_3D_RAID /dev/sd{b,d,e}
vgdisplayLenguaje del código: Bash (bash)

Ya tengo un nuevo grupo volumen formado por tres volúmenes físicos. A ver qué pasa al intentar hacer un mirror.

Pues, como parecía lógico, al intentar crear un RAID-1, la unidad o volumen más grande que se puede construir está limitado por el tamaño del disco físico más pequeño.

Añadir un segundo espejo

Aquí, tengo un disco de 4GB que me sobra. ¿Y si añado un nuevo espejo al RAID? Pues tengo que convertir el volumen lógico a un volumen con dos espejos.

lvconvert -m2 /dev/vg_3D_RAID/lvol0
lvdisplay Lenguaje del código: Bash (bash)

Y hasta aquí la función de hoy. En otra ocasión, intentaré otras configuraciones, como RAID-5, 10… Y, ¿Podré trasladar los discos a otra máquina y volver a montar el tenderete?

¡A pasarlo bien!

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.