LVM en Linux: volúmenes físicos, grupos y volúmenes lógicos en la práctica
LVM (Logical Volume Manager) en Linux es una capa entre los discos y los sistemas de archivos: los discos se convierten en volúmenes físicos (PV), se agrupan en un grupo de volúmenes (VG) y de él se reparten volúmenes lógicos (LV) de cualquier tamaño. Su gran ventaja es que un volumen se amplía en caliente con lvextend -r, se le puede añadir un disco nuevo sin detener el servicio y se puede crear un snapshot antes de una operación arriesgada.
LVM (Logical Volume Manager) es el gestor de volúmenes lógicos de Linux, que separa los sistemas de archivos de los discos físicos. En lugar de atar /var a la partición /dev/sdb1, se juntan los discos en un grupo común y de allí se reparten volúmenes del tamaño necesario. Cuando falta espacio, el volumen crece con un solo comando, sin reiniciar ni detener el servicio. A continuación veremos cómo funciona LVM en Linux, cómo crear volúmenes desde cero, ampliarlos, hacer un snapshot y evitar la pérdida de datos en los errores habituales.
Para qué sirve LVM si ya existen las particiones
Una partición normal es un trozo continuo de un único disco. Su tamaño se decide al particionar y solo puede aumentarse si justo detrás hay espacio libre. Si el disco se llena, hay que comprar otro, trasladar los datos, reescribir /etc/fstab y parar el servicio durante todo ese tiempo.
LVM resuelve tres problemas:
- Tamaño flexible. Un volumen lógico puede crecer (y, en ext4, también reducirse) en cualquier momento.
- Unión de discos. Varios discos físicos forman un único conjunto; un mismo volumen puede ocupar dos discos a la vez.
- Snapshots. Una instantánea del volumen antes de una actualización, una migración de base de datos u otra operación arriesgada.
Por eso los instaladores de Ubuntu Server, RHEL, Rocky y AlmaLinux proponen LVM por defecto, y en los servidores de datos casi siempre se usa.
Tres niveles de LVM: PV, VG y LV
Toda la lógica de LVM cabe en tres conceptos. Una analogía útil: los discos son sacos de harina, el grupo es el almacén común y los volúmenes lógicos son las porciones que se sacan del almacén.
| Nivel | Qué es | Ejemplo de nombre | Se crea con |
|---|---|---|---|
| PV (Physical Volume) | disco o partición preparados para LVM | /dev/sdb, /dev/sdc1 | pvcreate |
| VG (Volume Group) | conjunto que une uno o varios PV | data_vg | vgcreate |
| LV (Logical Volume) | volumen sacado de un VG; sobre él se crea el sistema de archivos | /dev/data_vg/app | lvcreate |
Dentro de un VG el espacio se divide en extents (PE, physical extents), bloques de tamaño fijo, por defecto de 4 MiB. Un volumen lógico es simplemente un conjunto de extents que no tienen por qué estar seguidos y pueden residir en discos distintos. Por eso es tan fácil ampliar un volumen: LVM le añade extents libres de cualquier parte.
Un volumen lógico tiene dos rutas equivalentes: /dev/data_vg/app y /dev/mapper/data_vg-app. Por debajo es un dispositivo device-mapper del núcleo.
Qué hay ya en el sistema
Primero compruebe que el paquete está instalado: en Debian y Ubuntu es lvm2 (sudo apt install lvm2); en la familia RHEL viene por defecto. Para una vista general hay comandos cortos y detallados:
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdb data_vg lvm2 a-- <20.00g 0
/dev/sdc data_vg lvm2 a-- <20.00g <10.00g
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
data_vg 2 1 0 wz--n- 39.99g <10.00g
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta%
app data_vg -wi-ao---- 30.00g
Los detalles los muestran pvdisplay, vgdisplay y lvdisplay. Una visión completa junto con las particiones normales la da lsblk: los volúmenes lógicos aparecen con el tipo lvm.
$ lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
sdc 8:32 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
Se ve que el volumen app de 30 GB ocupa a la vez dos discos de 20 GB; con una partición normal esto no se puede hacer.
LVM desde cero: del disco vacío al volumen montado
Supongamos que al servidor se ha añadido un disco vacío /dev/sdb y que los datos de la aplicación necesitan un volumen de 15 GB. Compruebe el nombre del disco con lsblk dos veces: todos los comandos siguientes destruyen los datos del dispositivo indicado.
Paso 1. Crear el volumen físico
$ sudo pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
Puede entregar a LVM el disco completo o crear antes una partición con fdisk o parted de tipo «Linux LVM» e indicarla (/dev/sdb1). La partición es más clara para otros administradores y evita que alguien particione el disco por encima de LVM; además, en la nube un disco entero se amplía más fácilmente.
Paso 2. Crear el grupo de volúmenes
$ sudo vgcreate data_vg /dev/sdb
Volume group "data_vg" successfully created
Paso 3. Crear el volumen lógico
$ sudo lvcreate -n app -L 15G data_vg
Logical volume "app" created.
El flag -L indica un tamaño absoluto; -l indica el tamaño en extents o en porcentaje: -l 100%FREE toma todo el espacio libre del grupo y -l 50%VG, la mitad del grupo. Conviene dejar algo de espacio libre en el VG: después se podrá dar a cualquier volumen o usar para un snapshot.
Paso 4. Sistema de archivos y montaje
$ sudo mkfs.ext4 /dev/data_vg/app
$ sudo mkdir -p /srv/app
$ sudo mount /dev/data_vg/app /srv/app
$ df -h /srv/app
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data_vg-app 15G 24K 14G 1% /srv/app
Para que el volumen se monte tras reiniciar, añada una línea en /etc/fstab. Para los volúmenes lógicos la ruta /dev/mapper/... es estable, así que puede usarla o bien el UUID de blkid:
/dev/mapper/data_vg-app /srv/app ext4 defaults 0 2
Compruebe la entrada con sudo mount -a antes de reiniciar: un error en fstab puede dejar el servidor en modo de emergencia.
Cómo ampliar un volumen LVM sin parar el servicio
Esta es la razón principal para usar LVM. El volumen crece con el sistema de archivos montado y la aplicación sigue escribiendo datos. El procedimiento depende de si hay espacio libre en el grupo.
Si hay espacio libre en el VG
$ sudo vgs data_vg
VG #PV #LV #SN Attr VSize VFree
data_vg 1 1 0 wz--n- <20.00g <5.00g
$ sudo lvextend -r -L +4G /dev/data_vg/app
Size of logical volume data_vg/app changed from 15.00 GiB to 19.00 GiB.
Logical volume data_vg/app successfully resized.
resize2fs 1.47.0
Filesystem at /dev/mapper/data_vg-app is mounted on /srv/app; on-line resizing required
La clave es el flag -r (--resizefs): tras aumentar el volumen, amplía también el sistema de archivos. Sin él, el volumen será más grande, pero df -h seguirá mostrando el tamaño anterior, porque el sistema de archivos no sabe del nuevo espacio. Es el error más frecuente: en ese caso basta con ejecutar a mano resize2fs para ext4 o xfs_growfs para XFS.
$ sudo resize2fs /dev/data_vg/app # ext4, se indica el dispositivo
$ sudo xfs_growfs /srv/app # XFS, se indica el punto de montaje
Atención a la diferencia: -L +4G añade 4 GB, mientras que -L 4G fija el tamaño final en 4 GB. Para dar al volumen todo el espacio restante, use -l +100%FREE.
Si se acabó el espacio en el VG: añadir un disco
Conecte el disco nuevo (en la nube, adjunte el volumen), localícelo con lsblk y añádalo al grupo:
$ sudo pvcreate /dev/sdc
$ sudo vgextend data_vg /dev/sdc
Volume group "data_vg" successfully extended
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Tres comandos y sin tiempo de parada. El sistema de archivos ahora ocupa dos discos, y la aplicación no lo nota.
Si el disco se amplió en la nube
En la nube suele ser más sencillo no añadir un disco, sino agrandar el existente. Entonces el núcleo ve el nuevo tamaño del dispositivo, y el volumen físico hay que estirarlo con pvresize:
$ sudo pvresize /dev/sdb
Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Si el PV está creado sobre una partición (/dev/sdb1), primero amplíe la partición, por ejemplo con growpart /dev/sdb 1 del paquete cloud-guest-utils, y solo después ejecute pvresize /dev/sdb1.
¿Se puede reducir un volumen LVM?
Sí, pero no para cualquier sistema de archivos ni en caliente. XFS no sabe reducirse en absoluto: solo se puede recrear con traslado de datos. Ext4 se reduce, pero únicamente desmontado:
$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app
Con el flag -r, LVM comprueba por sí mismo el sistema de archivos (e2fsck) y lo comprime antes de reducir el volumen. Sin -r es fácil recortar el volumen por debajo del tamaño del sistema de archivos y dañar los datos. Antes de reducir, haga siempre una copia de seguridad.
Snapshots de LVM: una instantánea antes de una operación arriesgada
Un snapshot es una instantánea de un volumen lógico. Se crea en una fracción de segundo y no copia los datos: LVM trabaja con el principio copy-on-write y guarda en la instantánea solo los bloques que cambian en el volumen original después de su creación. Por eso el snapshot necesita espacio en el VG únicamente para los cambios, no para todo el volumen.
$ sudo lvcreate -s -n app_before_upgrade -L 2G /dev/data_vg/app
Logical volume "app_before_upgrade" created.
$ sudo lvs data_vg
LV VG Attr LSize Origin Data%
app data_vg owi-aos--- 19.00g
app_before_upgrade data_vg swi-a-s--- 2.00g app 0.01
La columna Data% indica cuánto está ocupado el almacén de cambios. Si llega al 100 %, el snapshot clásico queda inválido y solo queda borrarlo. Elija el tamaño con margen según el volumen de cambios esperado, y vigile los snapshots que llevan mucho tiempo con lvs, o amplíelos con lvextend.
Cómo volver a un snapshot
Si la actualización sale mal, devuelva el volumen al estado en que estaba al crear el snapshot:
$ sudo umount /srv/app
$ sudo lvconvert --merge /dev/data_vg/app_before_upgrade
Merging of volume data_vg/app_before_upgrade started.
$ sudo mount /srv/app
Tras la fusión, el snapshot desaparece. Si el volumen no se puede desmontar (por ejemplo, es la raíz del sistema), la fusión se aplaza hasta la siguiente activación del volumen, es decir, hasta el reinicio.
Si todo salió bien
El snapshot simplemente se elimina, para que no ralentice las escrituras ni ocupe espacio:
$ sudo lvremove /dev/data_vg/app_before_upgrade
Un snapshot también puede montarse solo para lectura, a fin de obtener una copia de seguridad coherente de un sistema en funcionamiento: mount -o ro y copiar con rsync o tar. En XFS añada la opción nouuid; si no, el montaje fallará porque el UUID coincide con el del original.
LVM y RAID: no confundir las tareas
LVM por sí solo no protege frente a la avería de un disco. Si un volumen se extiende sobre dos discos y uno de ellos falla, se pierde todo el volumen, no la mitad. Para tolerancia a fallos, debajo de LVM se coloca RAID (mdadm) o se usa el modo espejo integrado en LVM (lvcreate --type raid1 -m 1).
Y ni RAID ni los snapshots sustituyen a la copia de seguridad. El snapshot está en los mismos discos que el original, y RAID replica con la misma fidelidad un rm -rf accidental. Hace falta una copia aparte, en otro soporte.
Chuleta de comandos de LVM
| Tarea | Comando |
|---|---|
| Ver PV, VG y LV | pvs, vgs, lvs |
| Crear un volumen físico | pvcreate /dev/sdb |
| Crear un grupo | vgcreate data_vg /dev/sdb |
| Añadir un disco al grupo | vgextend data_vg /dev/sdc |
| Crear un volumen | lvcreate -n app -L 15G data_vg |
| Ampliar volumen y sistema de archivos | lvextend -r -L +5G /dev/data_vg/app |
| Estirar el PV tras ampliar el disco | pvresize /dev/sdb |
| Snapshot | lvcreate -s -n snap -L 2G /dev/data_vg/app |
| Volver a un snapshot | lvconvert --merge /dev/data_vg/snap |
| Quitar un disco del grupo | pvmove /dev/sdb, después vgreduce data_vg /dev/sdb |
| Eliminar un volumen | lvremove /dev/data_vg/app |
Errores habituales
- El volumen se amplió, pero df muestra el tamaño anterior. Se olvidó
-r. Ejecuteresize2fsoxfs_growfs. - Insufficient free space. No hay extents libres en el grupo: revise
vgsy añada un disco convgextendo estire el PV. - Device /dev/sdc excluded by a filter. En el disco queda una tabla de particiones o una firma de sistema de archivos antiguos. Si los datos de ese disco no hacen falta, bórrelos con
wipefs -a /dev/sdc. - El snapshot aparece como Invalid. El almacén de cambios se llenó al 100 %. No se puede recuperar: solo borrarlo y, la próxima vez, reservar más espacio.
Resumen
LVM en Linux son tres capas: los volúmenes físicos (PV) se agrupan en un grupo (VG), del que se sacan los volúmenes lógicos (LV). Esto ofrece lo que no tienen las particiones normales: ampliar un volumen en caliente con lvextend -r, añadir discos sin parar el servicio y crear snapshots antes de cambios arriesgados. Recuerde que LVM no reemplaza a RAID ni a las copias de seguridad. El particionado, LVM, RAID y las cuotas se practican en la lección del curso de Linux.
Preguntas frecuentes
¿Se puede pasar a LVM una partición con datos que ya está en uso?
No directamente: pvcreate sobrescribe el principio del dispositivo. Hay que crear LVM en otro disco, copiar los datos con rsync, ajustar fstab y solo después liberar la partición antigua.
¿Ralentiza LVM el disco?
Sin snapshots, la carga de device-mapper es prácticamente imperceptible. Los snapshots clásicos activos frenan las escrituras en el volumen original por el copy-on-write, así que no conviene mantenerlos durante semanas.
¿Hace falta LVM en un ordenador de casa o en un portátil?
No es obligatorio, pero resulta útil con el cifrado de disco (LUKS con LVM dentro) y si quiere cambiar tamaños de particiones sin volver a particionar. En los servidores de datos, LVM es prácticamente el estándar.
¿Qué es el thin provisioning en LVM?
Son los volúmenes finos: se crea un pool (lvcreate --type thin-pool) y los volúmenes que contiene ocupan espacio real solo a medida que se escriben datos. Así se pueden asignar a los volúmenes más espacio del que hay físicamente, pero hay que vigilar la ocupación del pool.
¿Cómo quitar un disco de un grupo de volúmenes sin perder datos?
Mueva sus extents a otros discos del grupo con pvmove /dev/sdb (hace falta espacio libre suficiente) y después ejecute vgreduce data_vg /dev/sdb y pvremove /dev/sdb.
Este tema se explica a fondo y con práctica en el curso «Linux: с нуля до уверенного администрирования».
Ir al curso