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
          

LVM es imprescindible en servidores. Usar -r con lvextend para ampliar LV y FS en un solo paso. Crear snapshots antes de actualizaciones o cambios de riesgo. Nunca reducir un XFS.

RAID por software: mdadm, RAID 0/1/5/6/10, /proc/mdstat

Índice de la sección

Índice del curso