LVM: pvcreate, vgcreate, lvcreate, lvextend, snapshots
Introducción
LVM (Logical Volume Manager) añade una capa de abstracción entre el hardware y el sistema de archivos. Permite redimensionar volúmenes en caliente, agregar discos sin interrumpir el servicio, crear snapshots y mover datos entre discos físicos. Es el estándar de almacenamiento en servidores Linux.
Arquitectura de LVM
- PV (Physical Volume) — disco o partición inicializado para LVM (
/dev/sdb,/dev/sdb1…) - VG (Volume Group) — pool de almacenamiento formado por uno o más PVs
- LV (Logical Volume) — volumen lógico extraído del VG; equivale a una partición virtual
- PE (Physical Extent) — unidad mínima de asignación dentro del VG (por defecto 4 MiB)
# Flujo típico:
# disco/partición → pvcreate → PV
# PV(s) → vgcreate → VG
# VG → lvcreate → LV → mkfs → mount
pvcreate — Inicializar volúmenes físicos
# Inicializar una partición como PV
pvcreate /dev/sdb1
# Inicializar un disco completo (sin partición)
pvcreate /dev/sdc
# Inicializar múltiples dispositivos
pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
# Ver información del PV
pvdisplay /dev/sdb1
pvdisplay # todos los PVs
# Vista compacta
pvs
pvscan
vgcreate — Crear grupo de volúmenes
# Crear VG llamado "datos" con un PV
vgcreate datos /dev/sdb1
# Crear VG con múltiples PVs
vgcreate datos /dev/sdb1 /dev/sdc1
# Con tamaño de PE personalizado (por defecto 4 MiB)
vgcreate -s 8m datos /dev/sdb1
# Ver información del VG
vgdisplay datos
vgdisplay
# Vista compacta
vgs
vgscan
# Añadir un PV a un VG existente
vgextend datos /dev/sdd1
# Eliminar un PV del VG (primero mover datos)
pvmove /dev/sdb1 # mover datos del PV a otros PVs del VG
vgreduce datos /dev/sdb1 # quitar el PV del VG
# Activar/desactivar un VG
vgchange -ay datos # activar
vgchange -an datos # desactivar
# Renombrar un VG
vgrename datos almacen
lvcreate — Crear volúmenes lógicos
# Crear LV de 10 GiB llamado "home" en el VG "datos"
lvcreate -L 10G -n home datos
# Crear LV usando el 100% del espacio libre del VG
lvcreate -l 100%FREE -n home datos
# Crear LV con el 50% del espacio libre
lvcreate -l 50%FREE -n var datos
# El LV se crea en: /dev/datos/home o /dev/mapper/datos-home
# Formatear y montar el LV
mkfs.ext4 /dev/datos/home
mount /dev/datos/home /home
# Ver información del LV
lvdisplay /dev/datos/home
lvdisplay
# Vista compacta
lvs
lvscan
Redimensionar volúmenes lógicos
Ampliar un LV (en caliente con ext4 y xfs):
# Ampliar el LV en 5 GiB más
lvextend -L +5G /dev/datos/home
# Ampliar usando todo el espacio libre del VG
lvextend -l +100%FREE /dev/datos/home
# Ampliar LV Y el sistema de archivos en un solo paso (ext4)
lvextend -L +5G -r /dev/datos/home
# -r (--resizefs) llama a resize2fs automáticamente
# Si se amplió sin -r, redimensionar el FS manualmente:
# Para ext4 (puede hacerse en caliente si está montado)
resize2fs /dev/datos/home
# Para XFS (solo puede crecer, no reducir; en caliente)
xfs_growfs /home
Reducir un LV (solo ext4; XFS no soporta reducción):
# ATENCIÓN: reducir puede causar pérdida de datos si no se hace bien
# Pasos obligatorios:
# 1. Desmontar el LV
umount /home
# 2. Comprobar el sistema de archivos
e2fsck -f /dev/datos/home
# 3. Reducir el sistema de archivos PRIMERO
resize2fs /dev/datos/home 15G # reducir FS a 15 GiB
# 4. Reducir el LV
lvreduce -L 15G /dev/datos/home
# 5. Montar de nuevo
mount /dev/datos/home /home
Snapshots LVM
Un snapshot LVM crea una imagen puntual de un LV. Solo guarda los bloques que cambian desde el momento del snapshot (copy-on-write). Ideal para backups consistentes.
# Crear snapshot de 2 GiB del LV "home"
lvcreate -L 2G -s -n home_snap /dev/datos/home
# -s: snapshot; -n: nombre; el origen es el último argumento
# El snapshot aparece como un LV normal
lvs
# Montar el snapshot (solo lectura recomendado)
mkdir /mnt/snap
mount -o ro /dev/datos/home_snap /mnt/snap
# Hacer backup desde el snapshot
tar -czf /backup/home_$(date +%F).tar.gz -C /mnt/snap .
# Desmontar y eliminar el snapshot cuando ya no sea necesario
umount /mnt/snap
lvremove /dev/datos/home_snap
# Revertir el LV al estado del snapshot (merge)
# El LV origen debe estar desmontado
umount /home
lvconvert --merge /dev/datos/home_snap
# Tras reiniciar o reactivar el VG, el LV vuelve al estado del snapshot
pvmove — Migración de datos entre discos
# Mover todos los datos de un PV a otros del mismo VG
# (se puede hacer en caliente, sin desmontar)
pvmove /dev/sdb1
# Mover a un PV específico de destino
pvmove /dev/sdb1 /dev/sdd1
# Ver el progreso
pvs -o +pv_pe_alloc_count
# Tras pvmove, quitar el PV del VG y retirarlo del hardware
vgreduce datos /dev/sdb1
pvremove /dev/sdb1