- LVM permite abstraer el almacenamiento físico en PV, VG y LV, ofreciendo una gestión flexible y dinámica del espacio en Linux.
- Con comandos como pvcreate, vgcreate, lvcreate, lvextend o pvmove se pueden crear, ampliar y migrar volúmenes en caliente.
- Snapshots, mirrors y migraciones entre cabinas convierten LVM en una herramienta clave para alta disponibilidad y mantenimiento sin downtime.
- Conocer los errores típicos y archivos de configuración de LVM es esencial para solucionar incidencias en entornos de producción.

Trabajar con almacenamiento en Linux sin romperse la cabeza con las particiones clásicas es posible gracias a LVM (Logical Volume Manager). Este sistema añade una capa de abstracción por encima de los discos físicos que permite redimensionar, mover y proteger datos con una flexibilidad que, en entornos profesionales, marca la diferencia entre tener que apagar un servidor o poder hacerlo todo en caliente.
Si administras sistemas o estás preparando certificaciones tipo LPIC, RHCSA o similares, entender bien LVM deja de ser opcional. A lo largo de este tutorial veremos qué es LVM, cómo está estructurado, cómo crear y gestionar PV, VG y LV, además de profundizar en operaciones reales: ampliaciones, reducciones, mirrors, snapshots, migraciones entre cabinas, uso de LUN ampliadas y resolución de problemas típicos que te puedes encontrar en producción.
Qué es LVM y por qué se utiliza en Linux
Cuando hablamos de LVM nos referimos a un sistema que permite gestionar el almacenamiento de forma lógica en lugar de depender directamente de particiciones fijas. En lugar de tener un /dev/sdb1 de 50 GB y un /dev/sdc1 de 100 GB que se usan por separado, LVM permite agruparlos en un único espacio combinando su capacidad para formar lo que se conoce como volumen de grupo o Volume Group (VG) de 150 GB.
Sobre ese VG podemos definir varios volúmenes lógicos (LV), por ejemplo, uno de 20 GB para /opt, otro de 100 GB para /var y otro de 30 GB para backups. Esa capa de abstracción hace posible redistribuir el espacio con mucha más soltura que con el particionado tradicional, donde una vez creado el tamaño de la partición, cambiarlo es delicado o directamente imposible en caliente.
Una de las grandes ventajas de LVM es que nos permite crear snapshots (instantáneas) de un volumen lógico para tener un punto de restauración rápido, ampliar sistemas de ficheros en caliente añadiendo nuevos discos al VG o mover datos de un disco a otro dentro del mismo grupo sin parar servicios. En entornos con cabinas de discos, SAN o almacenamiento compartido, esta capacidad de migrar datos entre discos o cabinas sin downtime es oro puro.
En el mundo real esto se traduce en que puedes mover una base de datos desde una cabina saturada a otra más rápida sin que los usuarios noten nada más allá de cierta carga de I/O extra, o en que puedes crecer un filesystem de aplicación porque se ha quedado corto, sin reiniciar el servidor ni tocar servicios a mano.
Estructura básica de LVM: PV, VG y LV

Para entender bien LVM hay que tener claros sus componentes principales, que forman una jerarquía desde lo más físico a lo más lógico. La clave está en que cada nivel se apoya en el anterior para proporcionar flexibilidad sin que el sistema de ficheros tenga que conocer todos los detalles del hardware.
En la base de todo se encuentran los Physical Volume (PV), que no son más que discos físicos, particiones (por ejemplo /dev/sdb1, /dev/sdc1), LUNs de cabina o incluso dispositivos RAID por software como /dev/md0. Cada PV se divide internamente en unidades fijas llamadas Physical Extents (PE), que serán las piezas con las que se construirán los volúmenes lógicos.
Por encima de los PV tenemos los Volume Group (VG), que agrupan uno o varios volúmenes físicos para formar un pool de almacenamiento. El tamaño de un VG será la suma de la capacidad de todos los PV que lo formen, descontando el espacio ya asignado a volúmenes lógicos. En la práctica, el VG es el “contenedor” del que iremos sacando espacio para crear LVs a medida.
En el último escalón se encuentran los Logical Volume (LV), que son los volúmenes que el sistema ve casi como si fueran particiones normales. Sobre un LV es donde creamos el sistema de ficheros (ext4, xfs, etc.) y lo montamos en /, /var, /home o donde necesitemos. Internamente, cada LV se compone de Logical Extents (LE), que se mapean 1:1 con los PEs del VG, pero pueden estar repartidos en varios discos físicos sin ser contiguos.
El kernel utiliza el device mapper para traducir estos dispositivos lógicos (/dev/mapper/vg00-rootvol, por ejemplo) a los bloques físicos correspondientes. Los nombres amigables de LVM suelen ser enlaces simbólicos hacia dispositivos /dev/dm-0, /dev/dm-1, etc., lo que permite una enorme flexibilidad a la hora de combinar discos, RAID, cifrado y LVM sin que las capas superiores se enteren.
En un sistema real, si ejecutamos comandos como vgs, pvs y lvs podremos ver la lista de grupos de volúmenes, volúmenes físicos y volúmenes lógicos existentes, su tamaño total y el espacio libre, así como atributos de activación, estado, UUID, etc. Con vgdisplay -v podemos obtener aún más detalle: número de LVs, tamaño de PE, número de PEs libres, lista de PV que forman el grupo, etc.
Visualizar la estructura LVM existente en el sistema

Antes de tocar nada es fundamental saber qué estructura LVM tenemos actualmente en el sistema. Para ello, se utilizan principalmente tres comandos de resumen: pvs, vgs y lvs. Cada uno muestra una vista diferente y complementaria de la misma realidad.
Si queremos ver qué discos o particiones pertenecen a cada grupo, utilizamos pvs. Este comando mostrará las rutas de dispositivo (por ejemplo /dev/sda2, /dev/sdb1, /dev/sdc1), el VG al que pertenecen, el tamaño del PV y cuánto espacio sin asignar hay aún en cada uno. Resulta muy útil para comprobar si un nuevo disco se ha incorporado correctamente a un VG.
Con el comando vgs obtendremos un listado de todos los grupos de volúmenes, indicando cuántos PV, cuántos LV y cuántos snapshots (SN) contiene cada uno, además del tamaño total del grupo y el espacio libre disponible. Así podemos detectar de un vistazo qué grupos están más llenos y dónde tenemos margen para ampliaciones.
Por último, con lvs veremos la lista de volúmenes lógicos, con información como el tamaño, el VG al que pertenecen, atributos (por ejemplo si son mirrors, snapshots, thin, etc.), porcentaje de uso en caso de snapshots y otros datos clave. En servidores con muchos LVs, este comando se vuelve casi imprescindible para tener controlados los distintos filesystems.
Si queremos un informe aún más detallado de un grupo concreto, podemos ejecutar vgdisplay -v NombreVG. Esta orden mostrará la configuración del VG, todos sus LVs con información extendida y al final el detalle de cada PV que lo forma. Es especialmente útil para tareas de diagnóstico o auditoría de almacenamiento.
Por otro lado, si inspeccionamos los sistemas de ficheros montados con mount o df -h, veremos que los puntos de montaje apuntan a rutas bajo /dev/mapper/VG-LV. Por ejemplo, /dev/mapper/vg00-rootvol montado en /, /dev/mapper/vg00-varvol en /var, etc. Esto confirma que los filesystems están realmente apoyados en volúmenes lógicos de LVM.
Creación de una estructura LVM desde cero
Para montar una nueva estructura LVM partimos de uno o varios discos (o particiones) que tengamos libres. El flujo típico de trabajo consiste en crear un PV, luego un VG y finalmente uno o varios LV sobre los que formatear sistemas de ficheros.
Inicializar un Physical Volume (PV)
El primer paso consiste en marcar un disco o partición como volumen físico para LVM utilizando la orden pvcreate. Esto inicializa los metadatos necesarios para que LVM pueda gestionarlo. Por ejemplo, si queremos usar /dev/sdb como PV, ejecutaríamos:
pvcreate /dev/sdb
Tras este paso, ese dispositivo pasa a poder integrarse en un grupo de volúmenes. En algunas distribuciones como Red Hat, cuando se crea un VG desde cero, el instalador ya realiza el pvcreate de forma automática, pero conocer el comando es esencial para ampliaciones y configuraciones manuales.
Crear un Volume Group (VG)
Con los PV listos, definimos el grupo de volúmenes con el comando vgcreate. Esta orden recibe el nombre del VG y la lista de dispositivos físicos que lo formarán. Por ejemplo, para crear un VG llamado vgMySQL con dos discos:
vgcreate vgMySQL /dev/sdb /dev/sdc
A partir de ese momento, vgMySQL será un pool de almacenamiento sobre el que podremos ir creando uno o varios volúmenes lógicos para diferentes usos (datos, logs, backups, etc.). Podemos comprobar el resultado con vgdisplay vgMySQL o con el resumen corto vgs.
Definir Logical Volumes (LV)
Una vez que el grupo de volúmenes está creado, el siguiente paso es reservar dentro de ese grupo el espacio para cada LV. Lo hacemos con la orden lvcreate, indicando nombre, tamaño y VG. Un ejemplo sencillo sería:
lvcreate -n lvMySQL -L 10G vgMySQL
Ese comando creará un volumen lógico de 10 GB dentro de vgMySQL, que aparecerá como /dev/vgMySQL/lvMySQL (y también como /dev/mapper/vgMySQL-lvMySQL). A partir de aquí, lo trataremos casi como si fuera una partición tradicional sobre la que crear un filesystem.
Crear el sistema de ficheros sobre el LV
Con el LV creado, sólo queda formatearlo con el tipo de sistema de ficheros que más nos convenga. Por ejemplo, si queremos usar XFS sobre el volumen lógico para la base de datos:
mkfs.xfs /dev/vgMySQL/lvMySQL
Después crearemos el punto de montaje (por ejemplo /Backup_MySQL, /datos_mysql, etc.) y añadiremos la entrada correspondiente en /etc/fstab para que se monte automáticamente al arrancar. A partir de ahí, las aplicaciones solo verán un filesystem normal, aunque por debajo se esté usando LVM.
Unificar dos grupos de volúmenes (vgmerge)
En ocasiones podemos querer fusionar dos VGs en uno solo para simplificar la gestión o para poder reasignar fácilmente el espacio entre volúmenes lógicos que antes estaban en grupos separados. Para ello existe la orden vgmerge, que combina el segundo grupo dentro del primero.
Antes de fusionar es importante asegurarse de que no haya nombres de LV duplicados entre ambos grupos y de que el tamaño de los extents (PE) sea el mismo en los dos VGs, de lo contrario el comando fallará o requerirá pasos previos de ajuste.
El procedimiento típico incluye desmontar los filesystems afectados, desactivar el VG que vamos a integrar y ejecutar vgmerge. Por ejemplo, para fusionar vgPostreSQL dentro de vgMySQL:
vgchange -an vgPostreSQL
vgmerge vgMySQL vgPostreSQL
Tras la fusión, todos los LVs que pertenecían a vgPostreSQL pasarán a formar parte de vgMySQL, y podremos volver a activarlos y montarlos con normalidad. Este tipo de operación es útil cuando reorganizamos el almacenamiento de un servidor a medio o largo plazo.
Comandos esenciales para administrar LVM
Además de crear PV, VG y LV, en el día a día de la administración es fundamental saber ampliar, reducir, eliminar y mover volúmenes sin comprometer los datos. LVM ofrece un repertorio amplio de órdenes que conviene dominar, tanto en su forma básica como en escenarios avanzados.
Ampliar un filesystem en LVM
Una de las tareas más frecuentes es cuando un filesystem se queda sin espacio y necesitamos aumentar el tamaño del LV y del sistema de ficheros. El flujo general en sistemas de ficheros tipo ext3/ext4 suele ser usar lvextend para el volumen lógico y después la herramienta de crecimiento del FS, como resize2fs.
Por ejemplo, para dejar un volumen en un tamaño total de 512 MB podríamos ejecutar:
lvextend -L 512M /dev/VolGroup00/LogVol02
resize2fs /dev/VolGroup00/LogVol02
Si en cambio lo que queremos es sumar espacio adicional al tamaño actual (por ejemplo crecer en 512 MB a partir de lo que ya tiene el LV), utilizamos la sintaxis con el signo más:
lvextend -L+512M /dev/VolGroup00/LogVol02
En sistemas con XFS, el crecimiento del filesystem se realiza con xfs_growfs apuntando al punto de montaje o al dispositivo. Es importante conocer la herramienta correcta para cada tipo de sistema de ficheros, ya que no todos se comportan igual con las ampliaciones.
Reducir el tamaño de un filesystem y un LV
La operación contraria, reducir, es más delicada porque implica achicar el sistema de ficheros y luego el LV. No todos los filesystems lo permiten: EXT4 sí admite reducción, mientras que XFS, por ejemplo, no soporta encoger, sólo crecer.
Un flujo típico con ext4 consiste en primero encoger el FS (normalmente tras desmontarlo y pasar fsck si la herramienta lo requiere) y después lvreduce para ajustar el tamaño del volumen lógico. Muchas distribuciones facilitan esto con la opción -r en lvreduce, que coordina ambos pasos de forma más segura:
lvreduce -r -L95G /dev/mapper/vgdml-lvdml
El propio proceso realizará las comprobaciones de integridad, ajustará el tamaño del filesystem y, por último, reducirá el LV al valor indicado. Aun así, es prudente tener siempre copia de seguridad cuando se realizan reducciones, ya que un error en este punto puede ser crítico.
Eliminar un volumen lógico
Para borrar un LV que ya no necesitamos debemos asegurarnos de que no esté montado ni siendo utilizado. Una vez desmontado el filesystem, podemos borrar el volumen lógico con lvremove:
lvremove /dev/VolGroup00/LogVol02
Este comando elimina la definición del LV y libera sus extents dentro del VG, de manera que ese espacio quedará disponible para crear otros volúmenes o para ampliar otros existentes dentro del mismo grupo.
Crear y gestionar mirrors con LVM
Si por hardware no disponemos de un RAID por controladora, podemos configurar espejos (mirror) a nivel de LVM, siempre que el VG tenga suficiente espacio y los discos físicos estén repartidos de forma apropiada. En versiones antiguas se usaba lvextend con la opción -m, pero en las más recientes se utiliza lvconvert.
Para crear un mirror de un LV existente, indicamos el número de copias (m1 significa una copia espejo además del original):
lvconvert -m1 /dev/VolGroup00/LogVol02 /dev/sdae
Durante el proceso, LVM sincroniza ambas copias y podemos observar el progreso con lvs, viendo cómo el porcentaje de sincronización pasa de 0 a 100. Si en algún momento queremos volver al modo lineal (sin espejo), podemos usar lvconvert con -m0 para retirar el mirror.
En un ejemplo práctico típico se crea un VG nuevo con dos discos, se define un LV en modo mirror y se formatea. Tras copiar datos al filesystem (por ejemplo un DVD de instalación ISO grande para probar la integridad), se puede comprobar que la sincronización ha finalizado y que ambos discos contienen los mismos contenidos.
Otra situación interesante es cuando queremos romper el mirror para retirar un disco (por ejemplo, para sustituirlo por otro). Primero convertimos el LV a modo lineal con lvconvert -m0, lo que permite que uno de los discos del VG quede libre de datos. Después ejecutamos vgreduce para expulsar ese PV del grupo y, finalmente, podemos reciclar o retirar físicamente el disco. Más adelante, podemos volver a incorporar una nueva unidad con vgextend y rehacer el mirror con lvconvert -m1.
Mover datos entre discos dentro de un mismo VG (pvmove)
En grandes entornos empresariales es habitual que, con el tiempo, algunas cabinas de discos se queden lentas o saturadas. LVM proporciona el comando pvmove para mover datos de un PV antiguo a uno nuevo dentro del mismo VG sin parar servicios, copiando los extents de un disco a otro de forma transparente.
El flujo típico sería añadir primero los nuevos discos rápidos al VG con vgextend, de manera que veamos en pvs tanto los antiguos como los nuevos. Después lanzamos pvmove indicando el origen y destino, por ejemplo:
pvmove /dev/sdg1 /dev/sdk1
A medida que se va ejecutando, pvmove muestra el porcentaje completado. Es un proceso intensivo de I/O que conviene programar fuera de las horas punta, porque va a leer del disco viejo, escribir en el nuevo y limpiar la información antigua. Una vez finalizado y verificado que ya no quedan datos en el antiguo PV, podemos expulsarlo del grupo con vgreduce para no volver a usar esa cabina lenta.
Activar y desactivar grupos de volúmenes (vgchange)
En configuraciones de alta disponibilidad, especialmente en clusters, es habitual que los VGs se activen y desactiven en distintos nodos según dónde esté corriendo el servicio. Aunque normalmente esto lo gestiona el software de cluster, en ocasiones hay que hacerlo a mano.
Para marcar un VG como activo (disponible para montar sus LVs) usamos:
vgchange -a y NombreVG
Y para desactivarlo, por ejemplo antes de migrar un volumen a otro servidor, utilizados:
vgchange -a n NombreVG
Combinado con vgscan, que fuerza al sistema a escanear los dispositivos para encontrar estructuras LVM, podemos hacer que otro nodo del cluster reconozca y active los mismos grupos que se han creado o modificado en el primero.
Snapshots en LVM: crear, restaurar y eliminar
Una de las funciones más potentes de LVM es la capacidad de crear snapshots (instantáneas) de volúmenes lógicos. Un snapshot captura el estado de un LV en un momento dado y se apoya en un área de almacenamiento adicional donde se registran los cambios posteriores. Esto permite volver atrás si una actualización o un cambio de configuración sale mal.
El flujo básico sería: crear un archivo o un conjunto de datos en el filesystem de origen, generar el snapshot con lvcreate usando la opción -s, realizar cambios adicionales y, si algo falla, desmontar el FS y fusionar el snapshot con lvconvert –merge para restaurar el estado anterior.
Por ejemplo, para crear un snapshot de 100 MB de /dev/vgtest/lvtest podríamos ejecutar:
lvcreate -s -n lvtest_snapshot -L 100M /dev/vgtest/lvtest
Mientras el snapshot exista, LVM irá guardando en él los bloques modificados respecto al original. Si queremos “deshacer” cambios hechos en el FS tras crear la instantánea, desmontamos el volumen, lanzamos lvconvert –merge sobre el snapshot y volvemos a montar el filesystem. Los ficheros volverán al estado que tenían en el momento de crear la instantánea.
Si en cambio comprobamos que todo funciona correctamente y queremos hacer permanentes los cambios, simplemente eliminamos el snapshot con lvremove. De esta forma liberamos el espacio que tenía reservado en el VG y evitamos que pueda llenarse por exceso de cambios.
Herramientas y comandos clave de LVM
LVM2, que es la versión utilizada en los kernels modernos, ofrece un conjunto amplio de comandos especializados. Aunque ya hemos mencionado algunos, conviene tener una visión global de las herramientas más importantes para gestionar el ciclo de vida completo de los volúmenes.
- pvcreate, vgcreate, lvcreate: crean volúmenes físicos, grupos y lógicos.
- pvdisplay, vgdisplay, lvdisplay: muestran información detallada de cada tipo de objeto LVM.
- pvs, vgs, lvs: dan una vista resumida muy útil para tener una foto rápida del estado del almacenamiento.
- lvextend, vgextend: amplían volúmenes lógicos o grupos añadiendo tamaño o nuevos PV.
- lvreduce, vgreduce: reducen el tamaño de LVs o eliminan PV de un VG.
- pvscan, vgscan, lvscan: escanean el sistema en busca de estructuras LVM.
- pvchange, vgchange, lvchange: modifican atributos (por ejemplo, activación, permisos) de los distintos elementos.
- pvmove: migra datos de un volumen físico a otro dentro del mismo VG.
- pvresize, lvresize: ajustan la estructura de datos para poder crecer o encoger volúmenes.
- vgcfgbackup, vgcfgrestore: guardan y restauran metadatos de VGs.
- vgconvert: cambia el formato de metadatos, útil para migrar entre versiones de LVM.
- lvconvert: convierte volúmenes entre modos lineal, mirror, snapshot, etc.
- vgexport, vgimport, vgimportclone: exportan/importan VGs para moverlos a otros sistemas, evitando conflictos de nombres.
- vgmerge, vgsplit: permiten fusionar o dividir grupos de volúmenes.
- vgrename, lvrename: cambian el nombre de VGs y LVs sin afectar a los datos.
- pvremove, lvremove: eliminan PV de LVM y borran LVs que ya no se utilizan.
Tener cierto dominio de este conjunto de herramientas convierte el trabajo con almacenamiento en Linux en algo mucho más maleable y menos traumático, permitiendo realizar cambios profundos sin interrumpir servicios y facilitando el mantenimiento a largo plazo.
Dominar LVM implica entender bien su estructura PV-VG-LV, saber cómo interactúan con los sistemas de ficheros, y manejar con soltura comandos como pvcreate, vgcreate, lvcreate, pvmove, lvextend o snapshots; con esa base, cualquier administrador puede gestionar el almacenamiento de servidores Linux con mucha más seguridad y flexibilidad que con el particionado tradicional.
Redactor apasionado del mundo de los bytes y la tecnología en general. Me encanta compartir mis conocimientos a través de la escritura, y eso es lo que haré en este blog, mostrarte todo lo más interesante sobre gadgets, software, hardware, tendencias tecnológicas, y más. Mi objetivo es ayudarte a navegar por el mundo digital de forma sencilla y entretenida.