Skip to content

PBS restore drill

Proxmox Backup Server vive en LXC 186 (pmx-50, 192.168.0.22 — renombrado desde .186 en la renumeración IP de 2026-07-31), datastore main, 41% usado (verificado 2026-08-01; llegó a 89-91% a finales de julio, se recortó keep-daily 3→2 y el GC de 2 fases liberó el espacio real en el ciclo siguiente). Hace backups diarios de todas las VMs/LXCs según jobs.cfg.

El restore drill mensual valida que los backups son realmente restorables — "un backup que nunca se restauró no es un backup".

Cron actual

Script pbs-drill.sh corre día 1 (LXC, mensual) + día 15 trimestral (VM) en pmx-50. El drill de día 5 es otro script, pbs-restore-test.sh, en pmx-51. Logs en /var/log/pbs-drill.log. Resultado push a Telegram via n8n.

Drill automatizado (lo que corre el cron)

pbs-drill.sh (resumen):

  1. Crea un LXC temporal pct restore 999 <snapshot> --storage zfs-ha.
  2. Arranca el LXC.
  3. Verifica que un servicio canario responde (depende del LXC restaurado).
  4. Destruye el LXC temporal.
  5. Reporta éxito/fallo.
# Trigger manual del drill
ssh pmx-50 '/usr/local/bin/pbs-drill.sh'

Restore manual de una VM/LXC

Vía PBS UI

  1. Abrir https://pbs.monxas.casa/ (CF Access).
  2. Datastore main → seleccionar el guest (e.g. ct/200).
  3. Click en un snapshot → Restore.
  4. Target: nodo destino, storage destino, VMID nuevo (para no pisar el original).
  5. Confirmar.

Vía CLI desde el nodo Proxmox

Listar snapshots disponibles:

ssh pmx-50 'pvesm list pbs --content backup --vmid 200'

Restore a un VMID temporal:

ssh pmx-50 'pct restore 999 pbs:backup/ct/200/2026-05-18T03:00:00Z --storage zfs-ha --rootfs zfs-ha:32'

Para VMs (qm restore):

ssh pmx-50 'qmrestore pbs:backup/vm/208/2026-05-18T03:00:00Z 998 --storage zfs-ha'

Restore "file-level" (recuperar un archivo concreto)

PBS soporta montar el snapshot como FUSE para extraer archivos sin restore completo:

ssh pmx-50 'proxmox-backup-client mount --repository <user>@[email protected]:main vm/208/2026-05-18T03:00:00Z /mnt/restore-tmp'
# Copiar lo que necesites
ssh pmx-50 'cp /mnt/restore-tmp/path/to/file /destino/'
# Desmontar
ssh pmx-50 'proxmox-backup-client unmount /mnt/restore-tmp'

Verificación post-restore

Después de un restore "real" (no drill):

ssh pmx-50 'pct start 999'                # o qm start
ssh pmx-50 'pct exec 999 -- systemctl is-system-running'
ssh pmx-50 'pct exec 999 -- ip a'         # ¡cuidado IP duplicada con el original!

IP duplicada

El LXC/VM restaurado conserva la IP del original. Si la VM origen sigue viva, vas a tener conflicto ARP. Cambia la IP antes de arrancar el restore, o arranca con red desconectada (--net0 name=eth0,bridge=vmbr0,link_down=1).

Capacidad del datastore

ssh pmx-50 'pct exec 186 -- proxmox-backup-manager datastore show main'

Métrica clave: available. Si baja de 20% → revisar prune policy:

ssh pmx-50 'pct exec 186 -- proxmox-backup-manager prune-job list'

Política actual (job main-prune, verificada 2026-08-01): keep-daily 2, keep-weekly 1 (sin keep-last/monthly/yearly). Recortada desde keep-daily 3 a finales de julio 2026 por presión de espacio (ver nota de capacidad arriba). Datastore archive (job archive-prune) tiene política separada: keep-daily 14, keep-weekly 8, keep-monthly 12.

Troubleshooting

Síntoma Causa Fix
Restore falla con chunk store error Bit-rot en datastore proxmox-backup-manager datastore verify main
Restore lentísimo (<10MB/s) Network entre PBS y nodo destino saturada Verificar iperf3 entre nodos
Sin snapshots recientes Cron vzdump paró journalctl -u vzdump.timer en pmx-50
403 permission denied Token PBS expirado o sin permisos Regenerar token en UI → actualizar /etc/pve/storage.cfg

Plan futuro

  • Test restore fuera del cluster (a un Proxmox standalone aislado) — valida que los backups son portables. Pendiente.
  • Off-site backup PBS (sync a NAS externo o cloud) — pendiente, riesgo evaluado en ADR-0007.