Problema

En entornos con Proxmox es frecuente crear contenedores LXC con discos más grandes de lo necesario. Cuando la necesidad de espacio disminuye, la única forma de “encoger” el disco es recrear el contenedor o restaurarlo desde una copia de seguridad con un tamaño diferente. La interfaz web de Proxmox no expone una opción para cambiar el tamaño del disco durante la restauración, lo que obliga a recurrir a la línea de comandos. El reto consiste en restaurar el LXC desde Proxmox Backup Server (PBS) sin perder la configuración y, al mismo tiempo, asignarle un disco más pequeño.

Causa

  1. Diseño de LXC: Los discos de los contenedores se definen en la configuración (rootfs) y, una vez creados, Proxmox no permite reducir su tamaño porque el backend de almacenamiento (ZFS, LVM, directory) no soporta shrink nativo sin riesgos de corrupción.
  2. Interfaz web limitada: El wizard de restauración solo replica la configuración original del backup, por lo que el tamaño del disco queda idéntico al del snapshot.
  3. Falta de documentación consolidada: La mayoría de los artículos cubren la expansión de discos, pero rara vez explican el proceso inverso usando pct restore.

Solución

Restaurar el contenedor desde PBS mediante pct restore y sobrescribir la definición del disco en la configuración antes de iniciar el contenedor. El flujo genérico es:

  1. Identificar el backup
    Usa pvebackup o la API de PBS para listar los snapshots disponibles y obtener el backup-id (por ejemplo, vzdump-lxc-101-2024_05_12-10_30_00.tar.lzo).

  2. Crear una configuración temporal
    Copia la configuración original del contenedor (/etc/pve/lxc/101.conf) a un archivo temporal.

  3. Editar la línea rootfs
    Cambia rootfs: local-lvm:vm-101-disk-0,size=20G por el nuevo tamaño deseado, por ejemplo size=8G.

  4. Ejecutar pct restore con la opción --force
    El flag --force permite sobrescribir una configuración existente (útil si el ID ya está reservado).

  5. Ajustar el sistema de archivos interno
    Después de iniciar el contenedor, verifica que el filesystem dentro del LXC refleje el nuevo tamaño. En la mayoría de los casos, el backend (LVM, ZFS) ya habrá creado el volumen con el tamaño indicado, por lo que no es necesario redimensionar el FS. Si usas directory como storage, ejecuta resize2fs o el equivalente dentro del contenedor.

Paso a paso

  1. Listar backups

    pvebackup list <storage-id>
    

    Busca la entrada que corresponde al contenedor que quieres restaurar y anota el nombre del archivo.

  2. Crear contenedor vacío (opcional)

    Si el ID está libre, puedes saltarte este paso. Si ya existe y quieres reutilizarlo, elimina primero el contenedor:

    pct destroy 101 --purge
    
  3. Restaurar con nuevo tamaño

    pct restore 101 /mnt/pbs-backup/vzdump-lxc-101-2024_05_12-10_30_00.tar.lzo \
        --storage local-lvm \
        --force \
        --rootfs local-lvm:8G
    
    • 101 es el ID del contenedor.
    • --storage indica el pool donde se creará el disco.
    • --rootfs sobrescribe el tamaño especificado en el backup.
  4. Iniciar y validar

    pct start 101
    pct exec 101 -- df -h /
    

    El comando df debe mostrar aproximadamente 8 GB de espacio total.

  5. Ajustes post‑restauración

    • Revisa que los paquetes y servicios críticos arrancan sin errores.
    • Si el contenedor usa snapshots internos, verifica que la configuración de lxc.mount.entry sigue siendo válida.

Cuándo aplicar esta solución

  • Necesitas reducir el tamaño del disco y el backup contiene una configuración con un disco mayor.
  • El contenedor está en producción y no puedes permitirte una reinstalación completa.
  • El storage backend soporta creación de volúmenes con tamaños arbitrarios (LVM, ZFS, directory).
  • No hay dependencias externas que requieran el ID original del contenedor (por ejemplo, firewalls que referencian la IP estática del LXC).

No es adecuada cuando:

  • El backup está corrupto o incompleto.
  • El contenedor depende de volúmenes externos que no forman parte del backup.
  • El storage es btrfs con subvolúmenes que no permiten shrink sin recrear.

Código

# 1. Listar backups en el storage PBS
pvebackup list pbs-storage

# 2. (Opcional) Eliminar contenedor existente
pct destroy 101 --purge

# 3. Restaurar con tamaño de disco reducido
pct restore 101 /mnt/pbs-storage/vzdump-lxc-101-2024_05_12-10_30_00.tar.lzo \
    --storage local-lvm \
    --force \
    --rootfs local-lvm:8G

# 4. Iniciar y comprobar espacio
pct start 101
pct exec 101 -- df -h /

Verificación

  1. Espacio del disco: pct exec 101 -- df -h / debe mostrar el tamaño especificado (p.ej. 8 G).
  2. Estado del contenedor: pct status 101 debe devolver running.
  3. Logs de arranque: journalctl -u [email protected] o pct console 101 para detectar errores de montaje.
  4. Integridad de datos: Ejecuta una verificación rápida de los servicios críticos (web, base de datos) dentro del contenedor.

Si alguno de estos pasos falla, revierte con pct destroy 101 y repite la restauración ajustando el tamaño o el storage.

Notas adicionales

  • Backup incremental: Si usas backups incrementales, el primer pct restore debe ser del snapshot base; los incrementales se aplican automáticamente.
  • Snapshots LXC: Después de la restauración, crea un snapshot inmediato (pct snapshot 101 pre‑shrink) para volver rápidamente al estado actual en caso de error.
  • Almacenamiento mixto: Cuando el backup proviene de un pool local y deseas restaurar en local-lvm, el flag --storage gestiona la migración sin pasos intermedios.
  • Automatización: Incluye este flujo en scripts de Ansible o Terraform para que el proceso sea reproducible en clústers de alta disponibilidad.

Con este método puedes reducir el tamaño de los discos de tus contenedores LXC sin perder la configuración ni los datos, manteniendo la operatividad de tus entornos Proxmox.