TL;DR — Resumen Rápido
Guía completa de LVM en Linux: extiende volúmenes lógicos, añade discos, crece filesystems ext4/XFS, thin provisioning, snapshots y VMs en la nube.
LVM (Logical Volume Manager) es la capa de abstracción de almacenamiento estándar en Linux que permite redimensionar, crear instantáneas y migrar espacio en disco sin interrumpir el servicio. Esta guía cubre el flujo completo de LVM: arquitectura, adición de discos, extensión de volúmenes lógicos, crecimiento y reducción de filesystems, thin provisioning, snapshots, extensión en VMs en la nube y los errores más comunes en producción.
Requisitos Previos
- Sistema Linux con el paquete
lvm2instalado (sudo apt install lvm2osudo dnf install lvm2). - Acceso root o sudo.
- Al menos un grupo de volúmenes LVM existente, o un disco para inicializar desde cero.
- Familiaridad básica con particionado de discos en Linux (
fdisk,lsblk,df).
Arquitectura LVM
LVM introduce tres capas de abstracción entre los discos físicos y los filesystems montados:
| Capa | Prefijo de comando | Descripción |
|---|---|---|
| Volumen Físico (PV) | pv* | Disco o partición inicializada para uso con LVM |
| Grupo de Volúmenes (VG) | vg* | Reserva de almacenamiento formada por uno o más PVs |
| Volumen Lógico (LV) | lv* | Dispositivo de bloques virtual extraído del espacio libre del VG |
Los Physical Extents (PE) son la unidad mínima de asignación dentro de un VG (4 MiB por defecto). Cada LV es un rango de PEs. Esta abstracción permite que los LVs abarquen múltiples discos y se redimensionen en cualquier momento.
La pila de almacenamiento se ve así:
/dev/sda1 /dev/sdb1 /dev/sdc ← discos físicos / particiones
└─── pvcreate ───────────┘
↓
Grupo de Volúmenes (vg_data) ← reserva de PEs
↓
lv_root lv_home lv_db ← volúmenes lógicos (dispositivos de bloque)
↓
ext4 ext4 xfs ← filesystems sobre los LVs
Ver el Diseño Actual
lsblk — árbol de dispositivos de bloque
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sda 8:0 0 50G 0 disk
# ├─sda1 8:1 0 1G 0 part /boot
# └─sda2 8:2 0 49G 0 part
# ├─vg_sys-lv_root 253:0 0 20G 0 lvm /
# └─vg_sys-lv_home 253:1 0 29G 0 lvm /home
pvdisplay, vgdisplay, lvdisplay
pvdisplay # volúmenes físicos: disco, tamaño, PEs usados/libres
vgdisplay # grupos de volúmenes: PEs totales / usados / libres
lvdisplay # volúmenes lógicos: ruta, tamaño, tipo de filesystem
Comandos rápidos:
pvs # resumen compacto de PVs
vgs # resumen compacto de VGs (fíjate en VFree para el espacio disponible)
lvs # resumen compacto de LVs
df -h # uso de filesystems (lo que ve el sistema operativo)
Añadir un Nuevo Disco a LVM
Es la operación más común en producción: una VM recibe un disco nuevo y quieres añadir esa capacidad a un VG existente.
Paso 1 — Particionar el nuevo disco
fdisk /dev/sdb
# Dentro de fdisk:
# n → nueva partición
# p → primaria
# 1 → número de partición
# [Enter] dos veces → usar todo el disco
# t → cambiar tipo
# 8e → Linux LVM
# w → escribir y salir
Para discos GPT (>2 TB o sistemas UEFI) usa gdisk o parted. Establece el tipo de partición en Linux LVM.
Paso 2 — Inicializar el volumen físico
pvcreate /dev/sdb1
# Physical volume "/dev/sdb1" successfully created.
Paso 3 — Extender el grupo de volúmenes
vgextend vg_sys /dev/sdb1
# Volume group "vg_sys" successfully extended
vgs # confirma que VFree ha aumentado
Paso 4 — Extender el volumen lógico
# Añadir exactamente 20 GB
lvextend -L +20G /dev/vg_sys/lv_root
# O consumir TODO el espacio libre del VG
lvextend -l +100%FREE /dev/vg_sys/lv_root
Paso 5 — Redimensionar el filesystem
ext4 (en caliente, sin desmontar):
resize2fs /dev/vg_sys/lv_root
XFS (en caliente, usar punto de montaje):
xfs_growfs /
Extender un LV con Espacio Libre en el VG
Si ya tienes PEs libres en el VG (visibles en vgs bajo VFree), omites los pasos de añadir disco y vas directamente a lvextend:
vgs
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 3 0 wz--n- 200.00g 45.00g ← 45 GB libres
lvextend -L +30G /dev/vg_data/lv_db
resize2fs /dev/vg_data/lv_db # ext4
# o
xfs_growfs /var/lib/mysql # XFS
Puedes combinar lvextend y resize2fs en un solo comando con la opción -r:
lvextend -L +30G -r /dev/vg_data/lv_db
La opción -r llama automáticamente a la herramienta de redimensión adecuada tras extender el LV.
Redimensión en Caliente vs. Fuera de Línea
| Filesystem | ¿Crecer en caliente? | ¿Reducir en caliente? | Notas |
|---|---|---|---|
| ext4 | Sí | No — hay que desmontar | El más flexible; soporta crecer y reducir |
| XFS | Sí | Nunca | XFS no puede reducirse — por diseño |
| Btrfs | Sí | Sí | Crecimiento y reducción en caliente |
| ext3 | Sí | No | Heredado; preferir ext4 |
| swap | No | No | swapoff, redimensionar LV, mkswap, swapon |
Reducir un Volumen Lógico (Solo ext4 — Peligroso)
Reducir es irreversible si se hace mal. Haz siempre una copia de seguridad. XFS no puede reducirse.
# 1. Desmontar el filesystem
umount /dev/vg_data/lv_home
# 2. Comprobar y reparar el filesystem ANTES de redimensionar
e2fsck -f /dev/vg_data/lv_home
# 3. Reducir el filesystem al tamaño objetivo (debe ser menor que el LV)
resize2fs /dev/vg_data/lv_home 50G
# 4. Reducir el volumen lógico para que coincida (debe ser >= tamaño del filesystem)
lvreduce -L 50G /dev/vg_data/lv_home
# 5. Volver a montar y verificar
mount /dev/vg_data/lv_home /home
df -h /home
Regla crítica: ejecuta siempre resize2fs para reducir el filesystem ANTES de lvreduce. Reducir el LV primero trunca datos y corrompe el filesystem.
Thin Provisioning
El thin provisioning permite sobrecomprometer el almacenamiento — asignar más espacio a los LVs del que existe físicamente en el VG.
# Crear un thin pool (100 GB en un VG que puede tener solo 50 GB libres en disco)
lvcreate --thin -L 100G vg_data/thin_pool
# Crear thin LVs desde el pool
lvcreate --thin -V 30G --name lv_web vg_data/thin_pool
lvcreate --thin -V 30G --name lv_db vg_data/thin_pool
# Monitorizar el uso real del pool
lvs -a vg_data
# Data% muestra qué tan lleno está el pool — alerta al 80%, actúa al 90%
Advertencia: si el thin pool se llena por completo, todos los LVs del pool pasan a solo lectura. Monitoriza el uso con lvs.
Snapshots LVM
Las instantáneas capturan el estado de un LV en un momento dado usando copy-on-write. Son la forma más rápida de hacer una copia de seguridad consistente de un servidor en producción.
# Crear una instantánea de 5 GB de lv_root
lvcreate --snapshot -n lv_root_snap -L 5G /dev/vg_sys/lv_root
# Montar la instantánea en solo lectura para backup
mount -o ro /dev/vg_sys/lv_root_snap /mnt/snap
tar -czf /backup/root-$(date +%Y%m%d).tar.gz -C /mnt/snap .
umount /mnt/snap
# Eliminar la instantánea cuando hayas terminado
lvremove /dev/vg_sys/lv_root_snap
Fusionar una instantánea (rollback)
# Revertir lv_root al estado de la instantánea en el próximo arranque
lvconvert --merge /dev/vg_sys/lv_root_snap
reboot
LVM en VMs en la Nube
Cuando extiendes un disco en Azure, AWS o GCP, el SO ve el disco más grande pero el PV sigue reportando el tamaño antiguo. Usa pvresize para actualizar la vista de LVM:
# Ejemplo Azure: disco extendido de 30 GB a 50 GB en el portal
lsblk # /dev/sda debe mostrar 50G
# Redimensionar la partición si es necesario
sudo growpart /dev/sda 2
# Informar a LVM que el PV es ahora más grande
pvresize /dev/sda2
# Confirmar que apareció espacio libre en el VG
vgs
# Extender el LV y crecer el filesystem
lvextend -l +100%FREE -r /dev/vg_sys/lv_root
Errores Comunes
| Mensaje de error | Causa | Solución |
|---|---|---|
Insufficient free space | No hay suficientes PEs en el VG | Añade un nuevo PV con pvcreate + vgextend, o usa -l +100%FREE |
Can't reduce LV below used space | El objetivo de resize2fs es menor que los datos reales | Ejecuta e2fsck -f primero, luego reduce el filesystem antes de lvreduce |
Filesystem not showing new size | resize2fs / xfs_growfs no ejecutados tras lvextend | Ejecuta resize2fs /dev/vg/lv o xfs_growfs /puntomontaje |
Device /dev/sdX not found | Tabla de particiones no re-leída | Ejecuta partprobe /dev/sdX y reintenta pvcreate |
WARNING: snapshot is full | Espacio COW agotado | Amplía la instantánea: lvextend -L +2G /dev/vg/snap o recréala |
LVM vs ZFS vs Btrfs vs mdadm vs Particiones Simples
| Característica | LVM | ZFS | Btrfs | mdadm | Particiones simples |
|---|---|---|---|---|---|
| Redimensión en caliente | Sí | Sí | Sí | Limitado | No |
| Instantáneas | Sí (COW) | Sí (COW) | Sí (COW) | No | No |
| RAID | Sí | Sí (nativo) | Sí | Sí | No |
| Compresión | No | Sí | Sí | No | No |
| Thin provisioning | Sí | Sí | Parcial | No | No |
| Curva de aprendizaje | Media | Alta | Media | Media | Baja |
| Ideal para | Servidores Linux generales | NAS, FreeBSD | Desktop, Fedora | RAID heredado | Disco único simple |
Resumen
- LVM añade la abstracción PV → VG → LV: redimensiona y mueve almacenamiento sin reiniciar.
- Usa
pvdisplay,vgdisplay,lvdisplayyvgspara entender el diseño actual. - Añadir capacidad:
pvcreate→vgextend→lvextend→resize2fsoxfs_growfs. - Crecer ext4 y XFS es siempre en caliente y seguro; usa
-renlvextendpara un solo paso. - Reducir requiere desmontar +
e2fsck+resize2fsantes delvreduce. XFS no puede reducirse. - El thin provisioning permite sobrecomprometer; monitoriza el uso del pool con
lvs. - Las instantáneas son backups COW rápidos; dimensiónalas generosamente.
- En VMs en la nube, usa
pvresizetras extender el disco en el portal.