La ruta del SysAdmin - LVM

La ruta del SysAdmin 16 de jul. de 2024

¿Qué es LVM?

LVM son las siglas de Logical Volume Manager, el gestor de volúmenes lógicos.

LVM es otra forma de abstraer de forma lógica el soporte físico en los discos, la ventaja de LVM es la transparencia y flexibilidad que tiene a la hora de poder aumentar la capacidad de un volumen de datos.

Con LVM se puede añadir un nuevo disco y ampliar el tamaño de un punto de montaje sin tener que migrar datos, eliminar discos antiguos y sin necesidad de desmontar el volumen. Además se puede realizar "en caliente".

Conceptos de LVM

  • PV: Volúmen Físico o Physical Volume
  • VG: Grupo de Volúmenes o Volume Group
  • LV: Volumen Lógico o Logical Volume

El PV sería lo más cercano al hardware, puede sen un disco, una partición, un dispositvo de bloque o incluso un Array completo.
Se deben configurar y gestionar unicamente mediante los comandos de lvm

El VG lo podemos considerar como un disco virtual que es extensible.
Son abstractos en el sistema y no aparecen en /dev

Los LV forman parte de los VG y para entenderlo serían como particiones de un Volume Group.
Los LV aparecen como dispositivos de bloques en /dev para poderlos usar del mismo modo que se usa cualquier otra partición física.

Esquema LVM

Cómo utilizar LVM

Vamos a utilizar el gráfico anterior para explicar como funciona y como se usa LVM.

En un equipo vamos a necesitar 4 particiones (y sus puntos de montaje respectivos) en las que posiblemente haya que aumentar el tamaño de estas particiones pues se prevee un crecimiento de los datos en el futuro:

  • /opt/app_data
  • /var/lib/mysql
  • /var/log
  • /var/repo

Disponemos de almacenamiento hardware que puede asignarse a nuestro Linux y en caso necesario se pueden agregar más dispositivos al equipo.

Creación de los PV
Seleccionaremos cada uno de los dispositivos hardware que queramos usar en LVM y con ellos crearemos un PV physical volume para poder usarlo mediante los comandos de LVM.
Para crear un PV utilizaremos el comando pvcreate
Para visualizar los PV usaremos el comando pvdisplay

Ejemplo:

# Creamos con bucle un PV para los 4 primeros discos y 2 particiones
for PV in sda sdb sdc sdd sde1 sde2; do pvcreate /dev/$PV; done

# Visualizamos los PV creados
pvdisplay -C
PV        VG Fmt  Attr PSize PFree
/dev/sda     lvm2 a--   640g  640.0g
/dev/sdb     lvm2 a--  2000g 2000.0g
/dev/sdc     lvm2 a--   820g  820.0g
/dev/sdd     lvm2 a--   640g  640.0g
/dev/sde1    lvm2 a--   524g  524.0g
/dev/sde2    lvm2 a--   524g  524.0g

Creación de los VG
Ahora podemos agrupar si lo deseamos varios PV en un VG Volume Group
Para crear un VG usaremos el comando vgcreate
Para visualizar los VG usaremos vgdisplay

Ejemplo:

# Creamos VG y asignamos nombres
vgcreate vg_aplicaciones /dev/sda
vgcreate vg_mysql        /dev/sdb
vgcreate vg_grupo1       /dev/sdc /dev/sde1 
vgcreate vg_grupo2       /dev/sdd /dev/sde2

Podemos agrupar los discos en grupos de volúmenes como queramos, lo ideal sería agrupar discos dependiendo de las velocidades de escritura.

Creación de los LV
Ahora tan solo nos faltaría crear los volúmenes lógicos o LV Logical Volume que serán los que vamos a usar para realizar el montaje.
Para crear un volumen lógico usaremos el comando: lvcreate
Para ver los LV disponibles el comando a usar es: lvdisplay

Ejemplo:

# Creamos LV y asignamos la capacidad de disco deseada
# LV para mysql asignamos solo la mitad disponible
lvcreate -n lv_mysql -L 1000G vg_mysql

# Visualizamos el/los LV disponibles
lvdisplay
--- Logical volume ---
LV Path         /dev/vg_mysql/lv_mysql
LV Name         lv_mysql
VG Name         vg_mysql 
LV UUID         3349a0-CB9o-YkeD-f451-05vn-cWTp99
LV Write Access read/write
LV Status       available
LV Size         1000.0 GiB
....

En cuanto se crean los LV estos aparecen como dispositivos de bloques en:
/dev/mapper/

ls -l /dev/mapper
...
lrwxrwxrwx 1 root root   16 jul 19:03 vg_mysql-lv_mysql -> ../dm-0

ls -l /dev/dm-0
...
brw-rw---- 1 root root   16 jul 19:03 /dev/dm-0

Todo preparado para usar los LV

Con todo el proceso realizado de PV => VG => LV podemos usar los LV como si fuesen particiones estándar del sistema.

  • Formatear un LV: mkfs.ext4 /dev/vg_mysql/lv_mysql
  • Montar un LV: mount /dev/vg_mysql/lv_mysql /var/lib/mysql
  • Revisar el LV: df -h /var/lib/mysql

Este proceso serviría de comprobación, para que el montaje se realizase automáticamente, deberíamos incluirlo en el fichero /etc/fstab:

...
/dev/vg_mysql/lv_mysql      /var/lib/mysql    ext4  defaults 0 0
...

Ampliación del tamaño en LVM

Todo este proceso inicial, nos servirá para que el futuro si uno de nuestros puntos de montaje necesita más capacidad de almacenamiento la podamos extender en caliente.
Comandos para extender el LVM: lvresize y resize2fs

Para poder ampliar un LV es necesario que el VG que usa tenga espacio libre disponible.

En nuestro ejemplo anterior, habíamos reservado la mitad del grupo de volumen, aproximadamente unos 1000g, si necesitamos ampliar el LV, siempre comprobaremos si hay espacio libre disponible:

## Ampliación del LV
# 1. Revisar espacio disponible en el VG
vgdisplay -C vg_mysql

Nos fijaremos en la última columna VFree en nuestro caso indicará: 1000g, como hay espacio disponible podemos proceder a asignar al LV todo el espacio disponible:

# 2. Indicamos al LV el tamaño que debe de tener (toda la capacidad)
lvresize -L +100% vg_mysql/lv_mysql

# 3. Adaptar el LV al nuevo tamaño asignado
resize2fs /dev/vg_mysql/lv_mysql

Tras la ampliación comprobaremos con el comando df -h /var/lib/mysql y veremos que su tamaño actual es de 2.000 Gb aprox.

Incluir nuevos discos

Si por algún motivo todo el espacio disponible ha sido consumido, podemos incluir nuevos discos mediante los comandos LVM para asignarlos a los VG y los LV que lo necesiten.

El procedimiento sería el siguiente:

  • Crear un nuevo PV Physical Volume con el disco deseado:
    pvcreate /dev/sdN
  • Extender un VG Volume Groupcon el nuevo PV creado:
    vgextend vg_mysql /dev/sdN
  • Comprobar el tamaño disponible del VG expandido:
    vgdisplay -C vg_mysql
  • Proceder a ampliar el tamaño del LV Logical Volume en el que nos faltaba espacio, tal y como hicimos en el apartado anterior.

¿Cómo practicar todo esto?

No necesitas disponer de un servidor con un array de discos disponibles.
Recuerda que puedes virtualizar un servidor con VirtualBox, puedes agregar a la máquina virtual tantos discos virtuales como desees y así practicar sin miedo a romper nada.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux