Qué es LVM

Publicado por P. Ruiz en

Conceptos básicos

logo GNU/LinuxDe forma general, podemos decir que LVM (Logical Volume Manager) es una herramienta de gestión de almacenamiento lógico que se utiliza en sistemas operativos basados en GNU/Linux, como Red Hat Enterprise Linux, CentOS, Debian y Ubuntu. Permite administrar el almacenamiento de un sistema de forma flexible, creando volúmenes lógicos, como si se tratara de dispositivos de almacenamiento únicos, a partir de varias particiones o discos duros físicos independientes.

Fue desarrollado originalmente, en 1998, por el ingeniero de software alemán Heinz Mauelshagen, mientras trabajaba en la empresa Sistina Software (posteriormente adquirida por Red Hat). Se incluye en GNU/Linux desde la versión 2.4 del núcleo.

Los volúmenes creados con LVM pueden crecer o encogerse a lo largo del tiempo, para ir adaptándose a las necesidades de cada momento, sin necesidad de apagar el sistema. Algo que resulta especialmente útil cuando administramos el almacenamiento en sistemas de gran tamaño, ofreciendo una solución flexible y escalable.

Para entenderlo mejor, imagina que tienes un ordenador con dos discos duros físicos y quieres crear una partición para almacenar archivos de música. Con LVM, puedes crear un volumen lógico que abarque ambos discos duros y asignarle un tamaño determinado para la partición de música. Si más adelante necesitas más espacio, puedes añadir otro disco duro físico al volumen lógico sin tener que preocuparte por tener que reparticionar los discos o perder datos.

Como es lógico, este tipo de uso es aún más interesante cuando nos referimos al ámbito empresarial. Por ejemplo, podríamos añadir mayor capacidad de almacenamiento a un servidor web, sin detener el servicio en ningún momento.

Para conseguir su objetivo, LVM crea capas de abstracción entre los discos duros físicos y los volúmenes lógicos.

Las tres capas principales de abstracción que se utilizan en LVM son:

  1. Grupo de volúmenes (VG): es la capa superior de abstracción y agrupa uno o más discos duros físicos en un único recurso de almacenamiento lógico, con un nombre único que lo identifica. Los grupos de volúmenes se crean utilizando el comando vgcreate. También podremos añadir o quitar volúmenes físicos con los comandos vgextend o vgreduce.

  2. Volumen físico (PV): es la capa intermedia de abstracción y representa un disco duro físico, o una partición, que se usa como unidad básica de almacenamiento, añadiéndolo a un grupo de volúmenes LVM. Los volúmenes físicos se crean utilizando el comando pvcreate. Además, para ver sus propiedades, usaremos los comandos pvs, pvdisplay o pvscan.

  3. Volumen lógico (LV): es la capa inferior de abstracción y representa una partición lógica que se ha creado dentro de un grupo de volúmenes. Un volumen lógico se puede montar en el sistema de archivos como cualquier otra partición. Los volúmenes lógicos se crean utilizando el comando lvcreate. y con los comandos lvexten y lvreduce se puede cambiar su tamaño.

Una vez que se han creado los grupos de volúmenes (1) y los volúmenes físicos (2), se pueden crear los volúmenes lógicos (3). Estos últimos son los que se utilizarán para almacenar datos.

Los volúmenes lógicos se crean a partir de los volúmenes físicos disponibles y se les asigna un tamaño y un nombre. Estos volúmenes lógicos se pueden gestionar como si fueran particiones normales en un disco duro, pero en realidad están compuestos de varias particiones en múltiples discos duros físicos.

esquema LVM

Los volúmenes lógicos también se pueden extender o reducir dinámicamente, lo que significa que se pueden agregar o eliminar particiones físicas de los discos duros físicos y los volúmenes lógicos se ajustarán automáticamente para utilizar el espacio disponible. Esto es muy útil cuando se necesita aumentar el espacio de almacenamiento en un sistema sin tener que apagarlo o perder datos.

Otros conceptos básicos que debemos conocer son:

  • Extensión física (PE): es la unidad mínima de espacio que se asigna a un volumen lógico dentro de un volumen físico. Por defecto, tiene un tamaño de 4 MB, pero se puede cambiar con el comando vgcreate. Cada extensión física pertenece a un solo volumen lógico y se identifica por su número dentro del volumen físico.

  • Instantánea (snapshot): es una copia temporal de un volumen lógico que se crea con el comando lvcreate -s. La instantánea solo almacena los cambios que se hacen en el volumen lógico original, por lo que ocupa menos espacio y se puede crear más rápido. Se puede usar una instantánea para restaurar el estado anterior del volumen lógico con el comando lvconvert –merge.

Para terminar de entenderlo, imagina que tienes dos discos (/dev/sda y /dev/sdb) y quieres crear un sistema RAID-0 con LVM para mejorar el rendimiento:

  • Primero, deberías crear dos particiones LVM, una en cada disco con los comandos fdisk o parted.

  • Después crearías, a partir de las particiones anteriores, dos volúmenes físicos con el comando pvcreate (algo parecido a pvcreate /dev/sda1 /dev/sdb1).

  • Seguirías creando un grupo de volúmenes con el comando vgcreate (algo como vgcreate raid0 /dev/sda1 /dev/sdb1).

  • A continuación, crearías un volumen lógico con el comando lvcreate (con una sintaxis como lvcreate -l 100%FREE -i 2 -n datos raid0 que, básicamente, significa que usarás el 100% del espacio libre de dos volúmenes físicos, que el nombre del volumen será datos).

  • Por último, tendrás que crear el sistema de archivos en el volumen lógico usando, por ejemplo, el comando mkfs.ext4 /dev/raid0/datos, y montarlo en el directorio que prefieras (algo como mount /dev/raid0/datos /mnt/datos.

Ventajas e inconvenientes relacionados con el uso de LVM

Llegados a este punto, quizás te estés preguntando cuáles son las principales ventajas e inconvenientes que puede presentar el uso de esta tecnología en tus sistemas. Aquí que incluyo las más importantes según mi criterio.

Comencemos por las ventajas:

  1. Ya hemos comentado antes la más importante, la flexibilidad, porque podemos cambiar el tamaño y la ubicación de los volúmenes sin que se vean afectados los datos o el sistema de archivos. Esto hace el sistema fácilmente escalable.

  2. También aumentaremos el rendimiento, porque los datos quedarán distribuidos entre varios discos. Esto permitirá realizar lecturas o escrituras en todos los discos participantes de forma simultánea.

  3. Además de volúmenes RAID-0 como el descrito más arriba, LVM permite usar otros esquemas, como RAID-1, lo que le permite ampliar la seguridad de los datos, evitando su pérdida en el caso de que falle cualquiera de los discos.

  4. LVM también permite crear instantáneas (snapshots) de los volúmenes lógicos. Esto nos permite volver, en cualquier momento, al estado en el que se encontraba el sistema en el momento de crear la instantánea.

  5. El almacenamiento es fácilmente portable, porque se pueden mover o copiar volúmenes entre distintos sistemas sin preocuparnos por diferencias de tamaños o geometría de los discos físicos que intervienen.

Por otro lado, entre los inconvenientes que presenta LVM, podemos nombrar los siguientes:

  1. Usar LVM significa aprender una serie de conceptos completamente nuevos y también una serie de comandos que pueden resultar confusos para los usuarios menos avanzados.

  2. En cierto modo, vinculado a lo anterior, tenemos el peligro que supone la manipulación de volúmenes lógicos, que puede ocasionar la pérdida de datos o un daño para el sistema.

  3. No solo suponen un riesgo para el sistema los posibles errores de los usuarios comentados en el punto anterior, también el hecho de que estamos añadiendo una capa de abstracción adicional, entre el hardware y el sistema operativo. Esto aumenta el riesgo potencial de posibles fallos.

  4. No todos los gestores de arranque o todos los sistemas operativos son capaces de leer o escribir en un volumen lógico. De forma particular, pueden aparecer problemas cuando compartimos tratamos de compartir volúmenes lógicos con Windows o macOS.

  5. El uso de LVM implica una sobrecarga complementaria en el acceso a los datos, que puede afectar al rendimiento general del sistema. Sobre todo si creamos muchas instantáneas o efectuamos modificaciones frecuentes en la estructura de los volúmenes.

  6. En caso de fallo, podemos encontrar más dificultades para recuperar los datos. Además, las herramientas de recuperación pueden ser incompatibles con LVM o, incluso, no reconocer los volúmenes lógicos.

  7. Dependemos de un software específico para gestionar el almacenamiento. Eso puede limitar nuestras opciones, por ejemplo, si queremos cambiar de distribución de GNU/Linux o de gestor de arranque.

Cifrado de volúmenes con LVM

Otra característica que nos ofrece LVM es el cifrado de volúmenes. Se trata de un método que nos permite proteger los datos guardados en el medio de almacenamiento frente a accesos no autorizados.

El cifrado se realiza usando una clave y se puede aplicar de dos formas: sobre un volumen físico (PV) o sobre un volumen lógico (LV):

  • Cifrar el volumen físico: Se cifra todo el disco, o la partición. que contiene que contiene el volumen físico (ver concepto de volumen físico más arriba). Esto incluye el área de metadatos de LVM.

    Esto significa que necesitaremos la clave de cifrado para tener acceso a cualquier información relacionada con el grupo de volúmenes, incluidos los nombres y los tamaños de los volúmenes lógicos.

    Esta es la opción que ofrece una mayor seguridad pero, a cambio, necesitaremos tener más precauciones al administrar las claves y los discos.

  • Cifrar los volúmenes lógicos: En este caso, se cifra cada volumen lógico de forma individual, dejando sin cifrar el volumen físico y el área de metadatos.

    Esto implica que se puede acceder a la información sobre el grupo de volúmenes sin usar la clave de cifrado. Sin embargo, seguiremos necesitando la clave para leer o escribir datos en cada volumen lógico.

    Como puedes imaginar, en este caso tenemos una mayor flexibilidad, porque podremos cifrar unos volúmenes lógicos, y otros no.  Por el contrario, obtenemos un nivel de seguridad inferior.

Como alternativa al cifrado de volúmenes, puedes recurrir al cifrado, únicamente, de aquellas carpetas que contengan datos sensibles o, incluso, cifrar toda la carpeta que contiene el perfil de usuario (como aprendimos a hacer en el artículo Cifrar la carpeta de usuario en Ubuntu 22.04 LTS).

En este caso, piensa que en tu sistema puede haber otros lugares que contengan información sensible, como el área de intercambio para la memoria virtual que, de forma predeterminada, no se mantendrá cifrada.

De cualquier modo, la seguridad final de los datos dependerá de aspectos como:

  • El tipo de cifrado que usemos: Para cifrar volúmenes en LVM podemos utilizar diferentes algoritmos y opciones que especificaremos en el momento de crear el volumen cifrado.

    Por ejemplo, podemos utilizar el algoritmo AES con una clave de 256 bits y un modo XTS-PLAIN64. Así, establecemos el método por el que se transforman los datos antes de escribirlos o después de leerlos del disco.

    Como puedes suponer, la elección del algoritmo afectará a la seguridad de los datos y al rendimiento en los accesos de lectura y escritura.

  • La longitud y complejidad de la contraseña empleada: Obviamente, cuanto más larga y compleja sea la contraseña, más difícil será que un atacante la adivine o la rompa mediante fuerza bruta. De hecho, para transmitir esa idea, en lugar de contraseña suele hablarse de frase de paso.

    De forma orientativa, se recomienda utilizar, como mínimo, 12 caracteres. Además, deberemos incluir letras mayúsculas y minúsculas, números y símbolos. Aún así, nada nos impide usar combinaciones mucho más largas.

    También se pueden usar otros métodos, como datos biométricos, claves aleatorias o almacenadas en un dispositivo externo (por ejemplo, una memoria USB o una tarjeta inteligente).

En definitiva, siempre debemos tener presente que, el cifrado de volúmenes ofrece una protección contra el acceso no autorizado a los datos en caso de robo o pérdida del disco. Sin embargo, el cifrado no impide que el disco pueda dañarse físicamente o se que produzca algún error lógico que corrompa los datos.

Al fin y al cabo, estamos añadiendo una capa complementaria de complejidad al sistema. Piensa que el cifrado puede dificultar la recuperación de los datos en caso de fallo del disco o del sistema operativo.

Por todo ello, será de vital importancia hacer copias de seguridad periódicas de los datos que consideremos importantes y verificar la integridad del sistema de archivos. Además, deberemos guardar la clave de cifrado en un lugar seguro y accesible.

Si necesitas cifrar información en tu sistema, y lo que te hemos dicho hasta ahora no te convence, recuerda que en GNU/Linux dispones de diferentes herramientas o algoritmos para realizar el cifrado, como dm-crypt, LUKS, eCryptfs, VeraCrypt, etc.

Cada uno tiene sus ventajas y desventajas, por lo que se debe elegir el más adecuado según las necesidades y preferencias.

Arranque del sistema desde un volumen LVM

Cuando el sistema operativo reside en un volumen LVM, el proceso de carga del propio sistema debe contemplar esa situación y adaptarse a ella. Como, probablemente, te estés preguntando cómo lo consigue, a continuación te incluyo las diferentes etapas que se atraviesan, desde que pulsamos el botón de encendido, hasta que introducimos la información de autenticación:

  • Al poner en marcha el ordenador, se carga el firmware de la placa base (BIOS o UEFI, según el equipo), que realiza una serie de pruebas de autodiagnóstico (POST) y configura el hardware. A continuación, busca un dispositivo desde el que arrancar y carga en memoria el gestor de arranque de dicho dispositivo.

    A pesar de que BIOS (Basic Input/Output System) y UEFI (Unified Extensible Firmware Interface) tienen básicamente los mismos objetivos, difieren en varios aspectos importantes.

    BIOS es un sistema antiguo que se ha utilizado durante décadas. Su misión ha sido, básicamente, comprobar que el hardware funciona correctamente y buscar un dispositivo de arranque válido. Cuando lo encuentra, carga su gestor de arranque, que será el encargado de iniciar el sistema operativo.

    Por otro lado, UEFI es un sistema más moderno y avanzado que ha ido sustituyendo a la BIOS. Es más flexible y potente e incluye diferentes mejoras. Una de sus principales ventajas es que puede arrancar sistemas operativos en particiones superiores a 2 TeraBytes (que era el límite de la BIOS).

    UEFI también admite interfaces gráficas de usuario más avanzadas y más opciones de configuración que la BIOS.

    Además, mientras BIOS se limita a cargar el gestor de arranque y entregar el control, UEFI puede comunicarse con el sistema operativo directamente a través de una interfaz más avanzada. Esto le permite realizar tareas más complejas.

    Por último, en general podríamos decir que, en sistemas BIOS, el gestor de arranque se encuentra en el sector de arranque del disco (MBR o GPT) mientras que en sistemas UEFI se encuentra en la partición ESP.

  • etapas de inicioLa función del gestor de arranque es localizar, cargar y ejecutar el núcleo (kernel) del sistema operativo con las opciones adecuadas.

    En el caso de que el volumen se encuentre cifrado, el gestor de arranque accede a su área de metadatos LUKS, que contiene la información sobre el algoritmo y el método de cifrado. Si es necesario, nos solicita la clave para descifrar el volumen.

    A continuación, carga los controladores de dispositivos que le permiten acceder al disco que contiene el sistema de archivos raíz y ejecuta las herramientas LVM que necesita para detectar y activar los volúmenes LVM.

    En este momento, estará en disposición de montar el sistema de archivos raíz en la ubicación temporal /mnt/sysimage para acceder al núcleo del sistema.

    En GNU/Linux encontramos distintos gestores de arranque, como LILO o SYSLINUX, pero el más utilizado es GRUB2.

  • A continuación, se carga en memoria el núcleo del sistema operativo y toma el control. El núcleo necesitará acceder al sistema de archivos donde se encuentra el resto del sistema operativo. Para lograrlo, utiliza dos módulos, llamados initramfs (en versiones del núcleo de GNU/Linux posteriores a la 2.6) o initrd (en versiones anteriores), que se cargan junto al núcleo y que utilizan un script con las siguientes funciones:

    • Cargar los módulos del núcleo para soportar LVM y otros dispositivos como RAID o cifrado.

    • Escanear los discos y detectar los volúmenes físicos, los grupos de volúmenes y los volúmenes lógicos que forman LVM.

    • Activar el grupo de volúmenes donde se encuentra el sistema de archivos raíz (/) y montarlo en un directorio temporal.

    • Desmontar initramfs o initrd y devolver el control al núcleo, indicándole dónde está el sistema de archivos raíz.

  • A partir de aquí, se completa la carga del sistema operativo. En el proceso, se montan el resto de sistemas de archivos que se hayan definido en el archivo /etc/fstab y se ejecuta el programa init.

    init es el primer proceso que se inicia en el espacio de usuario y se encarga de iniciar el resto de procesos y servicios del sistema operativo.

    Los procesos y servicios concretos dependerán del nivel de ejecución (runlevel) o target definido en la configuración del sistema. Por ejemplo, cuando se trata de un sistema operativo con interfaz gráfica, se incluirá el servidor X y el entorno gráfico.

    El programa init puede ser systemd, SysVinit, Upstart, etc.

  • Al final, el sistema operativo muestra la pantalla de autenticación, que solicita al usuario su nombre y contraseña para acceder al sistema operativo.

    La pantalla de autenticación puede estar gestionada por un programa como GDM, LightDM, SDDM, etc..

Otras características de LVM

Aunque más arriba hemos mencionado casi todos los aspectos importantes de LVM, aún me gustaría mencionar algunas características, que pueden resultar interesantes:

  • Lo primero, que ya hemos mencionado de pasada antes, es su capacidad para realizar instantáneas (snapshots). Una instantánea nos permite crear una copia de un volumen lógico en un momento concreto. Podemos usarlas para devolver el volumen lógico al estado en el que se encontraba cuando las creamos.

    Se crean usando la técnica de copy-on-write (COW), lo que significa que los datos originales no se copian inmediatamente. En lugar de eso, se genera una copia vacía que apunta a los mismos de datos que forman el volumen original. Después, a medida que se escriben datos en el volumen original, los bloques modificados se copian en la instantánea.

    Debemos tener en cuenta que, aunque pueden actuar como copias de seguridad, no serían una solución completa y no deben usarse con ese objetivo.

  • Otro aspecto interesante es su capacidad para crear volúmenes híbridos. La idea es utilizar dispositivos de almacenamiento rápidos (uno o varios), que actúen como caché para almacenar información en dispositivos más lentos.

    Por ejemplo, podemos usar dispositivos basados en memoria flash, como los SSD, para acelerar el funcionamiento de discos duros HDD convencionales.

    gParted logoPara lograrlo, LVM utiliza dm-cache, un componente del mapeador de dispositivos que incorpora el núcleo de GNU/Linux para la gestión del almacenamiento intermedio en el acceso a los dispositivos.

Por último, no quiero dejar de mencionar algunas herramientas que nos permiten administrar volúmenes LVM desde la interfaz gráfica. Quizás las más conocidas sean  KVPM, system-config-lvm, blivet-gui y LVM GUI, pero también puedes usar herramientas maś generales, como GParted, KDE Partition Manager o Gnome Disks.