Problema

En infraestructuras basadas en Proxmox es frecuente necesitar un punto de restauración rápido antes de operaciones programadas (actualizaciones de contenedores, despliegues de software o cambios de configuración). Los backups tradicionales son seguros pero tardan varios minutos y, al restaurarlos, los discos externos o dispositivos USB pueden quedar desvinculados, obligando a una re‑asociación manual. Un snapshot de la VM captura el estado completo del disco y la configuración en segundos, facilitando una reversión inmediata. El reto consiste en crear snapshots de forma programada, sin interferir con los backups existentes y garantizando que la retención sea manejable.

Causa

Los snapshots fallan o no se crean automáticamente por varias razones habituales:

  1. Falta de programación centralizada – Proxmox no incluye un scheduler de snapshots; muchos administradores intentan usar tareas de vzdump sin distinguir entre backup y snapshot.
  2. Retención inadecuada – Sin una política de borrado, los discos pueden llenarse rápidamente, provocando errores de creación de nuevos snapshots.
  3. Bloqueos de recursos – Si una VM está bajo alta carga o ejecuta migraciones en vivo, el snapshot puede abortarse.
  4. Configuración de almacenamiento – Los storage tipo dir o nfs pueden no soportar snapshots consistentes; se necesita un backend que los admita (ZFS, LVM thin, Ceph RBD).
  5. Hooks mal definidos – Los scripts que se ejecutan antes o después del snapshot pueden fallar y detener la cadena.

Solución

Una solución robusta combina tres componentes:

  1. Uso de pvesh o qm para crear snapshots – Estas herramientas llaman directamente al motor de Proxmox y respetan el tipo de storage.
  2. Programación mediante cron – Un cron simple permite definir la frecuencia (ej. 02:00 y 14:00) y ejecutar un script que recorra una lista de VMs.
  3. Política de retención – Un script de limpieza que elimina snapshots más antiguos que N días o que supera un número máximo por VM.

Paso a paso

  1. Definir la lista de VMs – En un archivo /etc/proxmox-snapshots/vm-list.txt colocar los IDs que deben snapshotearse, uno por línea.
  2. Crear script de snapshot – El script debe:
    • Leer cada ID.
    • Verificar que la VM está en estado running o paused (evitar stopped).
    • Ejecutar qm snapshot $VM_ID "$(date +%Y%m%d-%H%M)" --description "Automated snapshot" para máquinas QEMU o pct snapshot $CT_ID ... para LXC.
    • Registrar salida en /var/log/proxmox-snapshots.log.
  3. Crear script de limpieza – Usa qm listsnapshot para obtener la fecha del snapshot (el nombre incluye la marca de tiempo) y elimina los que superen el límite:
    • qm delsnapshot $VM_ID $SNAP_NAME o pct delsnapshot.
  4. Configurar cron – Dos entradas, una para la creación y otra para la limpieza, garantizan que el espacio se recupere antes de la siguiente ejecución.

Cuándo aplicar esta solución

  • Entornos con actualizaciones programadas (por ejemplo, contenedores Docker que se actualizan cada sábado) donde se necesita un punto de restauración inmediato.
  • Infraestructuras homelab o pequeñas empresas que usan Proxmox con ZFS/LVM thin y no disponen de una solución de backup empresarial.
  • Escenarios donde los backups son diarios y los snapshots deben ser más frecuentes (2‑4 veces al día).

No es recomendable cuando:

  • El storage es dir sobre NFS sin soporte de snapshots; la consistencia puede verse comprometida.
  • La carga de la VM es extremadamente alta en los horarios de snapshot; en ese caso, mover la ventana a horas de menor actividad.
  • Se requiere cumplimiento regulatorio que obliga a usar backups inmutables; los snapshots son volátiles y pueden ser modificados.

Código

#!/usr/bin/env bash
# /usr/local/bin/proxmox-create-snapshots.sh
VM_LIST="/etc/proxmox-snapshots/vm-list.txt"
LOG="/var/log/proxmox-snapshots.log"

while read -r VM_ID; do
    [[ -z "$VM_ID" ]] && continue
    STATE=$(qm status "$VM_ID" | awk '{print $2}')
    if [[ "$STATE" != "running" && "$STATE" != "paused" ]]; then
        echo "$(date) VM $VM_ID not in runnable state ($STATE)" >> "$LOG"
        continue
    fi
    SNAP_NAME=$(date +%Y%m%d-%H%M)
    qm snapshot "$VM_ID" "$SNAP_NAME" --description "Automated snapshot" >> "$LOG" 2>&1
done < "$VM_LIST"
#!/usr/bin/env bash
# /usr/local/bin/proxmox-clean-snapshots.sh
VM_LIST="/etc/proxmox-snapshots/vm-list.txt"
MAX_DAYS=7
LOG="/var/log/proxmox-snapshots.log"

while read -r VM_ID; do
    [[ -z "$VM_ID" ]] && continue
    qm listsnapshot "$VM_ID" --output json | jq -r '.[] | "\(.name) \(.snaptime)"' | while read -r NAME TS; do
        AGE=$(( ($(date +%s) - TS) / 86400 ))
        if (( AGE > MAX_DAYS )); then
            qm delsnapshot "$VM_ID" "$NAME" --purge >> "$LOG" 2>&1
        fi
    done
done < "$VM_LIST"

Verificación

  1. Ejecución manual – Corre /usr/local/bin/proxmox-create-snapshots.sh y verifica que cada VM listada tenga un snapshot con la marca de tiempo actual (qm listsnapshot $VM_ID).
  2. Revisión de logs – Busca errores en /var/log/proxmox-snapshots.log. Mensajes como “not in runnable state” indican que la VM estaba apagada y no se creó snapshot.
  3. Prueba de restauración – Selecciona una VM, deténla (qm stop $VM_ID), y restaura el snapshot (qm rollback $VM_ID $SNAP_NAME). La VM debe volver a iniciar sin pérdida de datos.
  4. Espacio en disco – Usa df -h antes y después de varias ejecuciones para confirmar que la política de retención está funcionando.

Notas adicionales

  • ZFS snapshots: Si el storage es ZFS, los snapshots de Proxmox se traducen en snapshots de ZFS. Puedes combinar la política de retención de Proxmox con zfs destroy -r para liberar espacio a nivel de pool.
  • Hook scripts: Proxmox permite definir hookscript en la configuración de la VM. Un hook que marque el snapshot con una etiqueta personalizada (--description) facilita la identificación posterior.
  • Monitorización: Añade una alerta en Prometheus o Zabbix que observe el número de snapshots por VM; así evitarás sorpresas de llenado de disco.
  • Backup vs Snapshot: Mantén los backups completos (ej. vzdump) en una ubicación externa (NAS, S3) y usa los snapshots solo como punto de restauración rápido. No sustituyas los backups por snapshots.