La Clínica Sonrisa es una clínica dental con recepción, dos gabinetes y un cuarto técnico. En su servidor con Proxmox van dos invitados: la agenda de citas (la VM 100) y la facturación (el contenedor 101). Si mañana se rompe el disco, o alguien borra lo que no debe, la clínica no puede abrir. Hasta hoy nadie hacía copias. Toca hacerlas, guardarlas fuera del servidor y saber sacarlas cuando haga falta.
root@pve1:~# qm list; pct list VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID 100 agenda running 2048 8.00 1001 VMID Status Lock Name 101 running facturas
Una copia: vzdump
vzdump hace la copia de un invitado: su configuración y sus discos, en un archivo (un
almacén de archivos como local) o en un servidor de copias. En la web es el Backup de
cada invitado ▸ Backup now. Tiene tres modos:
- snapshot: sin pararlo. En un contenedor, una snapshot de LVM de su disco el momento de copiarlo; en una VM, QEMU copia el disco mientras sigue en marcha. Lo normal.
- suspend: un contenedor se copia primero en marcha (rsync), se congela un momento para copiar lo que cambió y sigue. Más lento y más espacio.
- stop: lo apaga, lo copia y lo vuelve a encender. Lo más consistente, pero se para.
Parado, da igual el modo: siempre es stop. Y la compresión: zstd (rápida y buena, la de siempre), gzip (algo más pequeña, mucho más lenta) o lzo (rápida, más grande).
root@pve1:~# vzdump 101 --storage local --mode snapshot --compress zstd --protected 1 INFO: starting new backup job: vzdump 101 --storage local --mode snapshot --compress zstd --protected 1 INFO: Starting Backup of VM 101 (lxc) INFO: Backup started at 2026-10-08 08:47:47 INFO: status = running INFO: CT Name: facturas INFO: including mount point rootfs ('/') in backup INFO: backup mode: snapshot INFO: ionice priority: 7 INFO: create storage snapshot 'vzdump' freeze guest filesystem Logical volume "snap_vm-101-disk-0_vzdump" created. thaw guest filesystem INFO: creating vzdump archive '/var/lib/vz/dump/vzdump-lxc-101-2026_10_08-08_47_47.tar.zst' INFO: Total bytes written: 584908800 (558MiB, 69MiB/s) INFO: archive file size: 159MB INFO: marking backup as protected INFO: cleanup temporary 'vzdump' snapshot Logical volume "snap_vm-101-disk-0_vzdump" successfully removed. INFO: Finished Backup of VM 101 (00:00:08) INFO: Backup finished at 2026-10-08 08:47:55 INFO: Backup job finished successfully INFO: notified via target `mail-to-root`
Un contenedor se copia como un tar (.tar.zst); una VM, como un vma (.vma.zst). En
local van a /var/lib/vz/dump/, con su registro (.log), sus notas (.notes, si las
lleva) y, si está protegida, una marca (.protected): una copia protegida no se borra ni se
poda hasta quitarle la protección (en la web, con la copia elegida, Change Protection).
root@pve1:~# ls -l /var/lib/vz/dump/ total 163708 -rw-r--r-- 1 root root 785 Oct 8 08:47 vzdump-lxc-101-2026_10_08-08_47_47.log -rw-r--r-- 1 root root 167630179 Oct 8 08:47 vzdump-lxc-101-2026_10_08-08_47_47.tar.zst -rw-r--r-- 1 root root 0 Oct 8 08:47 vzdump-lxc-101-2026_10_08-08_47_47.tar.zst.protected
Los 558 MiB de la facturación quedan en 159 MB con zstd. Una VM con el disco casi vacío ocupa
muy poco: lo que son ceros no se copia (backup is sparse). pvesm list las enseña como
volúmenes del almacén, con su volid (local:backup/…), que es como las nombran las demás
órdenes:
root@pve1:~# pvesm list local --content backup Volid Format Type Size VMID local:backup/vzdump-lxc-101-2026_10_08-08_47_47.tar.zst tar.zst backup 167630179 101
Ejercicio
Una copia antes de la auditoría
Mañana viene la auditoría y quieren una copia de hoy de la facturación (el contenedor 101) que nadie pueda borrar sin querer. Hazla en local, sin pararla (snapshot), comprimida con zstd y protegida.
Encendiendo el nodo…
Las de cada noche: los trabajos
Nadie se acuerda de pulsar Backup now cada día. Un trabajo de copia (Datacenter ▸
Backup ▸ Add) dice qué se copia (unos invitados, todos, o todos menos algunos), cuándo
(su Schedule), dónde, con qué modo y compresión, y cuántas guardar. Se guardan en
/etc/pve/jobs.cfg:
root@pve1:~# cat /etc/pve/jobs.cfg vzdump: copias-noche comment cada noche schedule 21:00 compress zstd enabled 1 mode snapshot prune-backups keep-daily=7,keep-weekly=4 storage local vmid 100,101
El horario es un evento de calendario, como los de systemd: 21:00 es cada día a las nueve
de la noche; mon..fri 22:30, de lunes a viernes; sat 02:00, los sábados. La rejilla de la
web enseña cuándo toca la próxima (Next Run). Lo que no entiende, lo dice:
root@pve1:~# pvesh create /cluster/backup --id mal --schedule "cada dia" --storage local --vmid 100 400 Parameter verification failed. schedule: invalid format - invalid calendar event 'cada dia' - unable to parse calendar event at 'cada' - Context("weekday") pvesh create <api_path> [OPTIONS] [FORMAT_OPTIONS]
Un invitado nuevo que no entra en ningún trabajo se queda sin copias sin que nadie se entere: el
botón Guests without backup job (en la API, /cluster/backup-info/not-backed-up) los lista.
Para que entre, se edita el trabajo (Edit) y se marca en su lista; con All, entran todos,
también los que se creen después.
La retención
Sin límite, las copias llenan el almacén. La retención (la pestaña Retention del trabajo, o la del almacén) dice cuáles se quedan, de la más nueva a la más vieja:
- keep-last 3: las 3 últimas.
- keep-daily 7: la última de cada uno de los 7 últimos días que tengan copia.
- keep-weekly 4, keep-monthly, keep-yearly: igual, por semana, mes y año.
Se suman: con keep-daily=7,keep-weekly=4 quedan las de la última semana y, de antes, una por
semana del último mes. Las protegidas ni cuentan ni se van.
Ejercicio
Las copias de cada noche
Cada noche a las 21:00, cuando cierra la clínica, tiene que hacerse una copia de la agenda (la VM 100) y de la facturación (el contenedor 101) en local. Y que no se acumulen: que se queden las de los últimos 7 días y una por semana de las 4 últimas.
Encendiendo el nodo…
Fuera del servidor: Proxmox Backup Server
Las copias en local están en el mismo disco que los invitados. Si ese disco muere, o
alguien cifra el servidor, se pierden con todo lo demás. Por eso las copias tienen que salir del
servidor. Se puede usar un NAS (tema 2), pero lo mejor es un Proxmox Backup Server (PBS):
otra máquina, con su propia web, que guarda las copias en un datastore troceadas en bloques
y deduplicadas: la segunda copia de la facturación solo sube lo que cambió.
Para añadirlo como almacén (Datacenter ▸ Storage ▸ Add ▸ Proxmox Backup Server) hacen falta su dirección, el datastore, un usuario con su contraseña y la huella (fingerprint) de su certificado, la que enseña su panel. Sin ella, Proxmox no se fía del servidor y lo dice:
root@pve1:~# pvesm add pbs pbs --server 192.168.90.20 --datastore clinica --username copias@pbs --password Copias-2026 create storage failed: pbs: error fetching datastores - fingerprint '5C:2E:91:D7:4A:B0:13:F8:6E:A5:27:C9:0D:84:3B:E2:71:5F:C6:98:2D:4B:E0:A7:36:19:F1:8C:52:D3:0B:6A' not verified, abort!
Con la contraseña mal, 401 Unauthorized. Con todo bien, entra en storage.cfg. La contraseña
no va ahí: va aparte, en /etc/pve/priv/storage/, que solo lee root:
root@pve1:~# cat /etc/pve/storage.cfg; ls -l /etc/pve/priv/storage/ … pbs: pbs datastore clinica server 192.168.90.20 fingerprint 5c:2e:91:d7:4a:b0:13:f8:6e:a5:27:c9:0d:84:3b:e2:71:5f:c6:98:2d:4b:e0:a7:36:19:f1:8c:52:d3:0b:6a username copias@pbs total 1 -rw------- 1 root www-data 12 Oct 8 08:48 pbs.pw
Una copia al PBS ya no es un archivo: es un snapshot del servidor de copias
(ct/101/2026-10-08T08:48:13Z). La primera sube todo; la siguiente, solo lo nuevo:
root@pve1:~# vzdump 101 --storage pbs --mode snapshot … INFO: creating Proxmox Backup Server archive 'ct/101/2026-10-08T08:49:02Z' … INFO: Downloading previous manifest (Thu Oct 8 08:48:13 2026) … INFO: root.pxar: had to backup 0 B of 524.068 MiB (compressed 0 B) in 24.01 s (average 0 B/s) INFO: root.pxar: backup was done incrementally, reused 524.068 MiB (100.0%) … INFO: Backup job finished successfully
Ejercicio
El servidor de copias
En el cuarto técnico hay un servidor de copias (un Proxmox Backup Server) en 192.168.90.20: su almacén es clinica, su usuario copias@pbs (contraseña Copias-2026) y la huella de su certificado, la de su pantalla: 5c:2e:91:d7:4a:b0:13:f8:6e:a5:27:c9:0d:84:3b:e2:71:5f:c6:98:2d:4b:e0:a7:36:19:f1:8c:52:d3:0b:6a. Añádelo como almacén y haz en él una copia de la facturación (el contenedor 101).
Encendiendo el nodo…
Con el PBS dentro, lo lógico es que el trabajo de cada noche guarde en él (con la compresión del PBS: la suya no se pone). Y una copia que no se ha probado no es una copia: Run now lanza el trabajo en el momento.
Ejercicio
Las de cada noche, fuera del servidor
Si se rompe el disco del servidor, las copias de local se van con él. El servidor de copias ya está añadido (pbs): haz que el trabajo de cada noche (copias-noche) guarde en él, y lánzalo ahora para ver que funciona.
Encendiendo el nodo…
Restaurar
Restaurar es crear un invitado a partir de una copia: qmrestore para una VM y
pct restore para un contenedor (en la web, la copia ▸ Restore). Vuelve tal como estaba al
copiarlo: su configuración, sus discos y lo que tenían dentro. La pregunta importante es
dónde:
- En un VMID nuevo: lo de ahora sigue como está y, al lado, aparece el de la copia. Para sacar algo que se borró sin perder lo que se hizo después.
- Encima del que existe (
--force): lo de ahora se pierde. Proxmox no lo deja sin--force, ni con el invitado encendido:
root@pve1:~# qmrestore local:backup/vzdump-qemu-100-2026_10_07-21_00_00.vma.zst 100 unable to restore VM 100 - VM 100 already exists on node 'pve1'
root@pve1:~# qmrestore local:backup/vzdump-qemu-100-2026_10_07-21_00_00.vma.zst 102 --storage local-lvm restore vma archive: zstd -q -d -c /var/lib/vz/dump/vzdump-qemu-100-2026_10_07-21_00_00.vma.zst | vma extract -v -r /var/tmp/vzdumptmp1002.fifo - /var/tmp/vzdumptmp1002 CFG: size: 366 name: qemu-server.conf DEV: dev_id=1 size: 8589934592 devname: drive-scsi0 CTIME: Wed Oct 7 21:00:01 2026 Logical volume "vm-102-disk-0" created. Logical volume pve/vm-102-disk-0 changed. new volume ID is 'local-lvm:vm-102-disk-0' map 'drive-scsi0' to '/dev/pve/vm-102-disk-0' (write zeros = 0) progress 1% (read 85917696 bytes, duration 0 sec) … progress 100% (read 8589934592 bytes, duration 0 sec) total bytes read 8589934592, sparse bytes 8589934592 (100%) rescan volumes...
La 102 se llama igual que la 100 y lleva la misma MAC: si se enciende a la vez en la misma
red, chocan. Unique (--unique 1) le da otra MAC (y a una VM, otro UUID). Antes de
restaurar, Show Configuration (pvesm extractconfig) enseña lo que guarda la copia:
root@pve1:~# pvesm extractconfig local:backup/vzdump-lxc-101-2026_10_07-21_05_00.tar.zst arch: amd64 cores: 1 features: nesting=1 hostname: facturas memory: 512 net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:BA:B3:68,ip=dhcp,type=veth ostype: debian rootfs: local-lvm:vm-101-disk-0,size=4G swap: 512 unprivileged: 1
Ejercicio
Las citas que se borraron
Esta mañana alguien borró sin querer citas de la agenda (la VM 100). La copia de anoche (vzdump-qemu-100-2026_10_07-21_00_00.vma.zst, en local) las tiene. Sácala en una VM nueva (otro VMID) para que la recepción copie las citas de ahí, sin tocar la agenda que está funcionando: las citas de hoy solo están en ella.
Encendiendo el nodo…
Podar lo viejo
Podar (prune) aplica una retención a las copias que ya hay: en la web, Prune group en
una copia del almacén; en la shell, pvesm prune-backups. Con --dry-run 1 solo enseña lo que
haría, sin borrar nada:
root@pve1:~# pvesm prune-backups local --vmid 101 --keep-last 3 --dry-run 1 NOTE: this is only a preview and might not be what a subsequent prune call does if backups are removed/added in the meantime. Backup Backup-ID Prune-Mark local:backup/vzdump-lxc-101-2026_10_01-21_00_00.tar.zst lxc/101 remove local:backup/vzdump-lxc-101-2026_10_02-21_00_00.tar.zst lxc/101 protected local:backup/vzdump-lxc-101-2026_10_03-21_00_00.tar.zst lxc/101 remove local:backup/vzdump-lxc-101-2026_10_04-21_00_00.tar.zst lxc/101 remove local:backup/vzdump-lxc-101-2026_10_05-21_00_00.tar.zst lxc/101 keep local:backup/vzdump-lxc-101-2026_10_06-21_00_00.tar.zst lxc/101 keep local:backup/vzdump-lxc-101-2026_10_07-21_00_00.tar.zst lxc/101 keep
La del día 2 está protegida: ni cuenta para las 3 ni se borra. Sin --dry-run, borra las
marcadas (con su registro y sus notas):
root@pve1:~# pvesm prune-backups local --vmid 101 --keep-last 3 removing backup 'local:backup/vzdump-lxc-101-2026_10_01-21_00_00.tar.zst' removing backup 'local:backup/vzdump-lxc-101-2026_10_03-21_00_00.tar.zst' removing backup 'local:backup/vzdump-lxc-101-2026_10_04-21_00_00.tar.zst'
Ejercicio
local, lleno de copias
local se está llenando de copias de la facturación (el contenedor 101): una por noche desde el día 1. Deja solo las 3 últimas. La del día 2 es la de la auditoría y está protegida: esa no se toca.
Encendiendo el nodo…
Resumen
- vzdump copia un invitado (snapshot, suspend o stop; zstd, gzip o lzo) a un archivo en un
almacén (
/var/lib/vz/dump) o a un servidor de copias. Una copia protegida no se borra ni se poda. - Un trabajo (Datacenter ▸ Backup,
jobs.cfg) hace las copias solo: qué, cuándo (un evento de calendario), dónde y con qué retención (keep-last, keep-daily, keep-weekly…). Guests without backup job dice quién se queda fuera. - Las copias tienen que salir del servidor: un Proxmox Backup Server (con su huella) guarda copias deduplicadas e incrementales.
- Restaurar en un VMID nuevo no toca lo de ahora; encima (
--force) lo borra. Antes, Show Configuration dice lo que guarda la copia. - Podar aplica la retención a lo que ya hay; con
--dry-run, primero se mira.