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:
- Falta de programación centralizada – Proxmox no incluye un scheduler de snapshots; muchos administradores intentan usar tareas de
vzdumpsin distinguir entre backup y snapshot. - Retención inadecuada – Sin una política de borrado, los discos pueden llenarse rápidamente, provocando errores de creación de nuevos snapshots.
- Bloqueos de recursos – Si una VM está bajo alta carga o ejecuta migraciones en vivo, el snapshot puede abortarse.
- Configuración de almacenamiento – Los storage tipo
dironfspueden no soportar snapshots consistentes; se necesita un backend que los admita (ZFS, LVM thin, Ceph RBD). - 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:
- Uso de
pveshoqmpara crear snapshots – Estas herramientas llaman directamente al motor de Proxmox y respetan el tipo de storage. - 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. - 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
- Definir la lista de VMs – En un archivo
/etc/proxmox-snapshots/vm-list.txtcolocar los IDs que deben snapshotearse, uno por línea. - Crear script de snapshot – El script debe:
- Leer cada ID.
- Verificar que la VM está en estado
runningopaused(evitarstopped). - Ejecutar
qm snapshot $VM_ID "$(date +%Y%m%d-%H%M)" --description "Automated snapshot"para máquinas QEMU opct snapshot $CT_ID ...para LXC. - Registrar salida en
/var/log/proxmox-snapshots.log.
- Crear script de limpieza – Usa
qm listsnapshotpara 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_NAMEopct delsnapshot.
- 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
dirsobre 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
- Ejecución manual – Corre
/usr/local/bin/proxmox-create-snapshots.shy verifica que cada VM listada tenga un snapshot con la marca de tiempo actual (qm listsnapshot $VM_ID). - 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. - 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. - Espacio en disco – Usa
df -hantes 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 -rpara liberar espacio a nivel de pool. - Hook scripts: Proxmox permite definir
hookscripten 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.