Si alguna vez ha tenido que mover con cuidado los límites de las particiones en un disco, reduciendo una y procurando no dañar la contigua, ya sabe dónde nace el miedo del administrador. LVM fue creado como antídoto contra ese horror: oculta la mecánica tosca de las particiones tras un nivel de abstracción ordenado y ofrece un pool flexible de espacio, del que se pueden extraer volúmenes lógicos, cambiar su tamaño y montarlos donde convenga. En este artículo no solo analizaremos los conceptos, sino que montaremos un pequeño laboratorio donde practicar con comandos reales sin riesgo.
Qué es LVM y para qué sirve
La idea que ahorra nervios
LVM (Logical Volume Manager) es un subsistema de gestión de almacenamiento que propone una alternativa a las particiones clásicas. En lugar de dividir rígidamente el disco en secciones y luego arrepentirse de los tamaños elegidos, se agrupan los soportes en un volumen común y a partir de ese pool se crean volúmenes lógicos de la capacidad necesaria. Cuando una de las sistemas de archivos de pronto "crece", el volumen se puede ampliar sin acrobacias con la tabla de particiones.
El valor principal de LVM es la flexibilidad. Se pueden añadir nuevos dispositivos, ampliar el grupo de volúmenes, redistribuir rápidamente el espacio disponible y mantener una estructura ordenada de puntos de montaje. Las abstracciones eliminan el dolor donde el esquema de particiones clásico deja de ser cómodo y aumenta el riesgo de errores.
Hay un matiz con el arranque del sistema: /boot tradicionalmente se mantiene fuera del volumen lógico, porque los cargadores de arranque no siempre leen LVM. El GRUB más extendido puede convivir con LVM, pero es más seguro dejar /boot en una partición simple aparte con formato vfat o ext2/ext4. systemd-boot solo lee vfat y tampoco extraerá el kernel desde un volumen lógico; esto conviene tenerlo en cuenta al planificar.
Arquitectura: PV, VG y LV sin tecnicismos
En LVM todo gira alrededor de tres entidades. Physical Volume (PV) es el "ladrillo" físico, es decir, el dispositivo real o la partición que inicializamos para LVM. Volume Group (VG) es la piscina común donde se colocan esos ladrillos; el tamaño del grupo es la suma de los volúmenes físicos disponibles. Logical Volume (LV) es la "partición del nuevo tiempo" que se crea dentro del grupo y luego se formatea en ext4, XFS o lo que convenga, para montarse como de costumbre.
Si se compara con la partición clásica, el LV se parece a una partición, y el VG es el "disco" lógico, solo que flexible y ampliable. El PV no tiene un análogo directo: es la superficie preparada para LVM, que puede ser todo un disco o solo una parte. Toda la magia del escalado ocurre entre PV y VG, y el usuario final trabaja con el LV como con un dispositivo de bloque habitual.
Preparación del laboratorio: Vagrant + VirtualBox
Es mejor aprender con práctica, pero sin arriesgar los datos de trabajo. Por eso montaremos un mini banco en una máquina virtual. Como base vale Vagrant con el proveedor VirtualBox: levanta el entorno con rapidez y también lo destruye tras los experimentos. Crearemos una VM con varios discos adicionales de 5 GB para simular soportes independientes.
Crear un directorio y poner allí un archivo Vagrantfile con el siguiente contenido. Despliega Ubuntu 20.04 y añade tres discos:
Vagrant.configure "2" do |config| config.vm.box = "ubuntu/focal64" config.vm.hostname = "lvm" 3.times {|i| config.vm.disk :disk, size: "5GB", name: "drive-#{i}"} config.vm.provider :virtualbox do |machine| machine.memory = 1024 machine.cpus = 1 machine.customize ["modifyvm", :id, "--cpuexecutioncap", "50"] end end # vi: set ft=ruby
Antes de iniciar, instale Vagrant y VirtualBox, luego active el soporte experimental de discos y levante la máquina desde el directorio con el Vagrantfile:
export VAGRANT_EXPERIMENTAL=disks vagrant up vagrant ssh
Dentro del invitado compruebe que los dispositivos adicionales son visibles para el sistema. El comando lsblk -o name,size,fstype mostrará la lista; en nuestro ejemplo veremos el disco base sda con la partición raíz y tres discos "limpios" sdc, sdd, sde, en los que practicaremos. Al terminar, vuelva al directorio del proyecto y destruya la VM con vagrant destroy para no dejar residuos.
Volúmenes físicos (PV): inicialización, inventario, limpieza
El primer paso en LVM es preparar los soportes. PV es la superficie con la que trabajará el gestor. La inicialización se realiza con pvcreate y lleva segundos. En esta etapa no formateamos "para sistema de archivos", solo marcamos el dispositivo como apto para agruparse en un volumen.
Para la demostración usaremos el disco limpio /dev/sdc y lo convertiremos en PV con una orden: sudo pvcreate /dev/sdc. La utilidad escribirá una etiqueta de servicio y mostrará confirmación. Después podemos tomar /dev/sdd: dividirlo por la mitad con la herramienta que prefiera — fdisk, cfdisk o parted — e inicializar ambas mitades con una sola llamada: sudo pvcreate /dev/sdd1 /dev/sdd2.
El inventario se realiza con pvscan, pvs y pvdisplay. La primera cuenta rápidamente la capacidad total y muestra qué dispositivos aún no están incluidos. La segunda muestra una tabla compacta con tamaños y espacio libre. La tercera revela la ficha completa de cada PV con UUID, número de extensiones físicas y estado de asignación. Esto es suficiente para saber con qué se puede operar.
A veces conviene "resetear" la preparación y devolver el dispositivo al estado inicial. Para eso sirve pvremove, que borra las etiquetas LVM del soporte elegido. Es útil cuando se decide no incluir una partición en un grupo o se va a reestructurar el disco.
Advertencia importante: todas las acciones con PV pueden destruir los datos que contengan. En el laboratorio los errores son perdonables; en producción no. Si el dispositivo ya pertenece a un grupo y soporta volúmenes lógicos activos, la limpieza mediante pvremove no se ejecutará: primero habrá que migrar correctamente los datos y excluir el soporte del pool.
Grupos de volúmenes (VG): pools, ampliación, reducción, eliminación
El grupo de volúmenes es la piscina combinada donde se almacenan los PV preparados. Se crea con vgcreate: primero el nombre del pool y luego la lista de volúmenes físicos. Por ejemplo, sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1 reunirá dos dispositivos en un único espacio. A partir de entonces la capacidad libre del VG será la suma de los bloques disponibles en los PV entrantes, teniendo en cuenta las extensiones de servicio.
Para comprobar el estado son útiles tres nombres conocidos: vgs, vgscan y vgdisplay. El informe corto vgs mostrará el número de volúmenes físicos y lógicos, el tamaño total y el espacio libre. vgscan confirma la presencia del pool en el sistema, y el detallado vgdisplay revela parámetros de las extensiones y la secuencia de metadatos. Este conjunto es suficiente para un diagnóstico rápido.
La buena noticia es que los grupos escalan en caliente. Para añadir soportes al pool se usa vgextend. Si previamente borró la etiqueta LVM de una partición, la ampliación la re-inicializará e incorporará al conjunto. Un comando como sudo vgextend lvm_tutorial /dev/sdd2 incrementará el volumen total del VG y preparará terreno para el crecimiento de los volúmenes lógicos.
A veces hace falta reducir el pool, extrayendo uno o varios dispositivos. Esa tarea corresponde a vgreduce. Pero hay una condición importante: en el PV que se excluye no deben quedar extensiones asignadas a ningún LV. Si las hay, primero se migra el contenido con pvmove y solo después se reduce el grupo. Ese orden preserva la integridad y evita interrupciones.
La lista de dispositivos que pertenecen a una VG concreta se obtiene con filtros: sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name enumerará los soportes empleados. De forma similar se puede obtener su número o el volumen de espacio libre. Estos comandos cortos ayudan a automatizar tareas de mantenimiento y a controlar el estado del pool desde scripts.
Eliminar completamente un grupo se hace con vgremove, pero solo debe usarse después de desactivar y borrar todos los volúmenes lógicos. De lo contrario la utilidad se negará a operar. En el laboratorio se puede experimentar libremente; en entornos productivos siga una lista de verificación estricta: desmontar, detener servicios, desactivar LV, borrar LV, reducir VG, limpiar PV.
Volúmenes lógicos (LV): creación, sistemas de archivos, montaje, cambio de tamaño, eliminación
El volumen lógico es el objeto principal del trabajo diario. A nivel del sistema operativo aparece como un dispositivo de bloque habitual en /dev/<VG>/<LV>, que se puede formatear, comprobar y montar como una partición convencional. La creación se realiza con lvcreate, indicando tamaño y nombre, así como el grupo base de donde se tomarán las extensiones.
Un ejemplo sencillo: sudo lvcreate -L 5G -n lv1 lvm_tutorial reservará un volumen de cinco gigabytes dentro del pool lvm_tutorial. Después viene la rutina habitual: formatear en ext4 con sudo mkfs.ext4 /dev/lvm_tutorial/lv1 y montar en el sistema, por ejemplo con sudo mount -t ext4 /dev/lvm_tutorial/lv1 /mnt. Desde ese momento el directorio /mnt alberga su propio sistema de archivos y las operaciones sobre él se realizan sobre el LV.
El estado de los volúmenes lógicos se puede consultar con lvs y lvdisplay. La primera produce una tabla compacta con tamaños, atributos y extensiones libres. La segunda muestra la metainformación ampliada, incluyendo la ruta al dispositivo y el estado. Para comprobaciones masivas convienen selectores y la salida de columnas separadas; así es más fácil encadenar comandos.
Una de las fortalezas de LVM es el cambio dinámico de tamaño. Se puede ampliar un volumen con lvextend o con la más universal lvresize. El enfoque con el signo "+" indica volumen adicional en lugar del tamaño final. Por ejemplo, sudo lvresize -L +2G lvm_tutorial/lv1 aumentará el LV existente en 2 GB. Luego es necesario ajustar el sistema de archivos: para ext4 se usa sudo resize2fs /dev/lvm_tutorial/lv1. En sistemas modernos ext4 y XFS pueden ampliarse en caliente, sin desmontar.
Reducir requiere precaución. El orden es inverso: primero se reduce el sistema de archivos con la herramienta adecuada (para ext4, resize2fs indicando el tamaño menor y habiendo desmontado previamente), y después se reduce el LV con lvreduce o lvresize con signo "-". Saltarse la secuencia puede provocar pérdida de datos, por lo que en entornos reales siempre se hacen copias de seguridad y se comprueba espacio libre para migraciones.
Eliminar un volumen lógico es directo: desmontar, asegurarse de que no hay archivos abiertos, luego ejecutar sudo lvremove lvm_tutorial/lv1 y confirmar. LVM limpiará los metadatos y devolverá las extensiones al pool del grupo, desde donde podrán asignarse a otros volúmenes. Ese ciclo permite mantener el sistema ordenado sin acumular volúmenes "muertos".
Pregunta frecuente: qué sistemas de archivos elegir. Para la mayoría de escenarios ext4 es suficiente: es fiable, conocida y compatible con la ampliación en caliente. XFS funciona bien en volúmenes grandes y bajo carga intensa, pero reducirlo es complicado. btrfs ofrece instantáneas y modos RAID propios, pero en combinación con LVM exige una arquitectura pensada para evitar conflictos entre funcionalidades. En entornos de aprendizaje es preferible quedarse con ext4 y centrarse en la lógica de LVM.
Otro punto práctico: vigile el espacio libre no solo en el grupo, sino también en los sistemas de archivos. Combine vgs para evaluar el pool y df -h para el directorio montado, para no encontrarse con la situación en que el LV ya fue ampliado pero el sistema de archivos no, o viceversa.
Para terminar, una idea sencilla: LVM no es "magia por la magia", sino una forma de recuperar el control sobre el espacio en disco sin operaciones estresantes con la tabla de particiones. Hemos explicado las entidades básicas, montado el laboratorio, preparado volúmenes físicos, creado el grupo y trabajado con el volumen lógico — desde su creación hasta el cambio de tamaño y la eliminación. Ahora le queda jugar su propia "partida": añadir otro disco, ampliar el pool, practicar la migración de extensiones y afinar la rutina hasta automatizarla. Cuando la próxima vez un servicio necesite un par de gigabytes "ahora mismo", simplemente los añadirá con un comando y volverá a sus tareas.