Trabajar con LVM
LVM (Logical Volume Manager) es un sistema de gestión de discos que añade una capa de abstracción sobre el almacenamiento físico. Permite asignar el espacio en disco de forma flexible, cambiar su tamaño en línea y realizar copias de seguridad basadas en snapshots. Se utiliza ampliamente como capa de almacenamiento para la virtualización. En sistemas cifrados, LVM suele situarse sobre un dispositivo cifrado con LUKS, de modo que un único desbloqueo expone todo el grupo de volúmenes.
Este artículo explica cómo instalar LVM en Linux, crear Physical Volumes, Volume Groups y Logical Volumes, cambiar su tamaño, trabajar con snapshots y utilizar thin provisioning.
Instalar LVM
LVM está incluido de forma predeterminada en la mayoría de las distribuciones de Linux. Si no está disponible, instale el paquete lvm2 mediante el gestor de paquetes del sistema.
En Debian y Ubuntu:
sudo apt-get install lvm2
En RHEL, CentOS Stream, AlmaLinux y Rocky Linux:
sudo dnf install lvm2
Crear un Physical Volume
Un Physical Volume (PV) es el componente básico de LVM en el nivel más bajo. Puede ser un disco completo (por ejemplo, /dev/sdb) o una sola partición (por ejemplo, /dev/sdb1).
El uso de un disco completo como PV simplifica las operaciones posteriores de cambio de tamaño, ya que no es necesario ampliar primero una partición subyacente. Se recomienda utilizar una partición cuando el disco también deba alojar datos que no pertenezcan a LVM o cuando otras herramientas del sistema esperen una tabla de particiones.
Cree un Physical Volume con pvcreate:
sudo pvcreate /dev/sdb
Sustituya /dev/sdb por la ruta de su dispositivo de bloques.
Compruebe el resultado con pvdisplay:
sudo pvdisplay
La salida muestra los Physical Volumes que LVM administra actualmente, junto con su tamaño y la información de la Volume Group correspondiente.
Crear una Volume Group
Una Volume Group (VG) combina uno o varios Physical Volumes en un único pool de almacenamiento. A partir de este pool se crean los Logical Volumes.
Cree una Volume Group llamada vg0 a partir de un único Physical Volume:
sudo vgcreate vg0 /dev/sdb
O a partir de varios Physical Volumes al mismo tiempo:
sudo vgcreate vg0 /dev/sdb /dev/sdc
Compruebe el resultado con vgdisplay:
sudo vgdisplay
Crear un Logical Volume
Un Logical Volume (LV) aparece en el sistema como un dispositivo de bloques normal. Puede formatearlo con un sistema de archivos y montarlo.
Cree un Logical Volume lv0 de 10 GB dentro de la Volume Group vg0:
sudo lvcreate -n lv0 -L 10G vg0
La opción -n establece el nombre del Logical Volume y -L establece su tamaño.
Compruebe el resultado con lvdisplay:
sudo lvdisplay
Cree un sistema de archivos en el Logical Volume:
sudo mkfs.ext4 /dev/vg0/lv0
Cree un punto de montaje y monte el sistema de archivos:
sudo mkdir -p /mnt/lv0 sudo mount /dev/vg0/lv0 /mnt/lv0
El nuevo sistema de archivos estará disponible en /mnt/lv0. Para montarlo automáticamente durante el arranque, añada una entrada correspondiente a /etc/fstab.
LVM expone cada Logical Volume mediante dos rutas equivalentes: /dev/<vg>/<lv> y /dev/mapper/<vg>-<lv>. En el ejemplo anterior son /dev/vg0/lv0 y /dev/mapper/vg0-lv0. Ambas rutas apuntan al mismo dispositivo; las herramientas y los archivos de configuración pueden utilizar cualquiera de ellas.
Para ver la jerarquía completa de PV/VG/LV junto con los dispositivos de bloques normales, ejecute:
lsblk
Cambiar el tamaño de los volúmenes
LVM admite el cambio de tamaño en línea en cada nivel: Physical Volumes, Volume Groups y Logical Volumes.
pvresize actualiza la información que LVM tiene sobre un Physical Volume después de que se haya cambiado el tamaño del dispositivo de bloques subyacente (por ejemplo, después de ampliar un disco virtual en el hipervisor):
sudo pvresize /dev/sdb
vgextend añade un Physical Volume a una Volume Group existente, aumentando así el tamaño de la Volume Group:
sudo vgextend vg0 /dev/sdc
vgreduce elimina un Physical Volume de una Volume Group:
sudo vgreduce vg0 /dev/sdc
lvresize cambia el tamaño de un Logical Volume. Por ejemplo, para añadir 5 GB a lv0:
sudo lvresize -L +5G /dev/vg0/lv0
O para ampliar el Logical Volume y utilizar todo el espacio libre de la Volume Group:
sudo lvresize -l +100%FREE /dev/vg0/lv0
Preste atención a la diferencia entre -L (mayúscula) y -l (minúscula). La versión en mayúscula acepta un tamaño con un sufijo de unidad como M, G o T. La versión en minúscula acepta un número de extents o un porcentaje.
Cambiar el tamaño de un Logical Volume no cambia el tamaño del sistema de archivos que contiene. Utilice la herramienta correspondiente al sistema de archivos. Para ext2, ext3 y ext4:
sudo resize2fs /dev/vg0/lv0
Para XFS, ejecute xfs_growfs sobre el punto de montaje del sistema de archivos.
En los sistemas de archivos compatibles, incluidos ext4 y XFS, lvextend con la opción -r cambia el tamaño del Logical Volume y del sistema de archivos en un solo paso:
sudo lvextend -r -L +5G /dev/vg0/lv0
Esta es la forma más habitual de realizar un crecimiento en línea.
Reducir un Logical Volume requiere el orden contrario: primero debe reducirse el sistema de archivos y solo después el Logical Volume. Si se hace al revés, el dispositivo subyacente se recorta mientras el sistema de archivos sigue considerando que tiene su tamaño original, lo que destruye los datos. En ext4, la operación se realiza sin conexión. Desmonte el sistema de archivos, ejecute sudo e2fsck -f /dev/vg0/lv0, reduzca el sistema de archivos con sudo resize2fs /dev/vg0/lv0 <new_size>, reduzca el Logical Volume al mismo tamaño con sudo lvresize -L <new_size> /dev/vg0/lv0 y vuelva a montar el sistema de archivos. XFS no admite la reducción de tamaño; la única forma de hacer más pequeño un sistema de archivos XFS es realizar una copia de seguridad, crear uno más pequeño y restaurar los datos.
Todos los comandos anteriores aceptan --help para mostrar la lista completa de opciones.
Snapshots de LVM
Un snapshot captura el estado de un Logical Volume en un momento determinado. Funciona mediante un mecanismo copy-on-write: a medida que cambia el Logical Volume original, los bloques modificados se guardan en el espacio reservado del snapshot, por lo que este continúa mostrando el estado original.
Los snapshots son útiles para crear copias de seguridad consistentes frente a fallos de un sistema de archivos en ejecución y para probar cambios que pueden revertirse eliminando el snapshot. Las copias de seguridad consistentes con la aplicación requieren coordinación adicional, como congelar el sistema de archivos o poner la aplicación en un estado de espera antes de crear el snapshot.
Crear un snapshot
Cree un snapshot con lvcreate y la opción -s:
sudo lvcreate -L 1G -s -n myvolume_snap /dev/myvg/myvolume
Esto crea un snapshot llamado myvolume_snap del Logical Volume myvolume en la Volume Group myvg, reservando 1 GB para los cambios. Elija el tamaño reservado en función de la cantidad de datos que se espera que cambie mientras exista el snapshot: los snapshots de volúmenes casi inactivos necesitan poco espacio, mientras que los volúmenes con mucha actividad de escritura pueden requerir una parte considerable del tamaño original.
Para snapshots de larga duración y casos de uso que impliquen muchos snapshots, considere utilizar thin snapshots dentro de un thin pool. Obtienen el espacio del pool compartido según sea necesario en lugar de reservar una cantidad fija por adelantado, lo que normalmente aprovecha mejor el espacio.
Si el Logical Volume original cambia más de lo que el snapshot puede almacenar, el snapshot deja de ser válido y los datos que había capturado se pierden. Dimensione el snapshot para cubrir la cantidad de cambios esperada durante su vida útil.
Usar un snapshot
Un snapshot puede montarse como cualquier otro Logical Volume. Para tareas de copia de seguridad e inspección, móntelo en modo de solo lectura a menos que realmente se necesite acceso de escritura:
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/myvg/myvolume_snap /mnt/snapshot
Una vez montado, el snapshot puede leerse para realizar copias de seguridad o inspecciones.
Eliminar un snapshot
Cuando el snapshot ya no sea necesario, elimínelo con lvremove:
sudo lvremove /dev/myvg/myvolume_snap
Eliminar un snapshot libera el espacio que tenía reservado. Cualquier dato escrito directamente en el snapshot, en lugar del volumen original, se pierde.
Para revertir el volumen original al estado capturado por el snapshot, utilice lvconvert --merge en lugar de lvremove:
sudo lvconvert --merge /dev/myvg/myvolume_snap
Después de la fusión, el snapshot se consume y se elimina automáticamente. Si el volumen original está actualmente en uso, la fusión se pospone hasta la próxima vez que se active el volumen.
Thin provisioning
Un thin pool es un tipo especial de Logical Volume que asigna almacenamiento bajo demanda. Los Logical Volumes creados dentro de él (thin volumes) pueden tener un tamaño declarado superior al espacio libre real del pool, y solo los bloques que se escriben consumen almacenamiento real.
Esta tecnología se utiliza ampliamente en virtualización, donde muchos discos virtuales comparten un único pool de almacenamiento, pero rara vez todos alcanzan simultáneamente su capacidad declarada.
Crear un thin pool
Cree un thin pool mythinpool de 50 GB en la Volume Group myvg:
sudo lvcreate -L 50G -T -n mythinpool myvg
La opción -L establece el tamaño del pool, -T indica a lvcreate que cree un thin pool y -n establece el nombre del pool. LVM asigna el pool a partir del espacio libre de la Volume Group; al final del comando se pueden indicar Physical Volumes concretos si el pool debe ubicarse en determinados dispositivos.
Crear un thin volume
Cree un thin volume mythinvolume de 10 GB dentro de mythinpool:
sudo lvcreate -V 10G -T myvg/mythinpool -n mythinvolume
La opción -V establece el tamaño virtual del thin volume, -T hace referencia al thin pool y -n establece el nombre del nuevo volumen.
Usar un thin volume
Un thin volume se utiliza como cualquier otro Logical Volume. Cree un sistema de archivos en él:
sudo mkfs.ext4 /dev/myvg/mythinvolume
Después, el thin volume puede montarse y utilizarse como un dispositivo de bloques normal.
Debido a que los thin pools pueden sobreasignarse, supervise su uso real. Tanto el espacio de datos como el espacio de metadatos pueden agotarse de forma independiente, y ambos son críticos: si un thin pool se queda sin espacio de datos o de metadatos mientras se escribe en un thin volume, las operaciones de escritura de ese volumen comenzarán a fallar.
El uso actual de datos y metadatos de todos los Logical Volumes, incluidos los thin pools, puede consultarse con lvs:
sudo lvs -o +data_percent,metadata_percent
Cuando data_percent o metadata_percent se acerque al 100 %, amplíe el thin pool con lvextend antes de que se llene.
Referencia de comandos
Comandos comunes de LVM agrupados por nivel.
Physical Volumes:
- pvcreate inicializa un dispositivo de bloques como Physical Volume.
- pvdisplay muestra información detallada sobre los Physical Volumes.
- pvs muestra una tabla resumida de los Physical Volumes.
- pvresize actualiza un Physical Volume después de cambiar el tamaño del dispositivo subyacente.
Volume Groups:
- vgcreate crea una Volume Group a partir de uno o varios Physical Volumes.
- vgextend añade un Physical Volume a una Volume Group.
- vgreduce elimina un Physical Volume de una Volume Group.
- vgdisplay muestra información detallada sobre las Volume Groups.
- vgs muestra una tabla resumida de las Volume Groups.
Logical Volumes:
- lvcreate crea un Logical Volume.
- lvextend y lvresize cambian el tamaño de un Logical Volume.
- lvremove elimina un Logical Volume.
- lvconvert --merge fusiona un snapshot de nuevo con su volumen de origen.
- lvdisplay muestra información detallada sobre los Logical Volumes.
- lvs muestra una tabla resumida de los Logical Volumes.
Para el uso diario, los comandos de resumen pvs, vgs y lvs suelen ser más prácticos que las variantes detalladas *display. Cada comando admite --help para consultar la lista completa de opciones.