TL;DR — Resumen Rápido
Los snapshots ZFS ofrecen protección instantánea. Aprende pools, datasets, rollback, replicación send/receive y automatización con sanoid en producción.
Los snapshots de ZFS ofrecen protección de datos casi instantánea y eficiente en espacio que ninguna herramienta de backup tradicional puede igualar a nivel de sistema de archivos. Esta guía cubre desde los fundamentos de ZFS hasta las políticas de retención automatizadas con sanoid.
Prerequisitos
- Servidor Linux con Ubuntu 22.04/24.04, Debian 12 o RHEL 9/Fedora
- Uno o más dispositivos de bloque
- Acceso root o sudo
- Familiaridad básica con la línea de comandos de Linux
Fundamentos de ZFS
Copy-on-Write (CoW): ZFS nunca sobreescribe datos existentes. Cuando cambia un bloque, ZFS escribe la nueva versión en una nueva ubicación y actualiza el puntero. El bloque antiguo permanece hasta que la transacción confirma. Así los snapshots son instantáneos.
Pools, vdevs y datasets:
- Un pool (
zpool) es el contenedor de almacenamiento de nivel superior. - Un vdev define la redundancia: disco único,
mirror,raidz,raidz2oraidz3. - Un dataset es un sistema de archivos montable dentro del pool.
Checksums y autocorrección: Cada bloque almacena un checksum. En la lectura, ZFS lo verifica y, si el pool tiene redundancia, repara automáticamente los bloques corruptos.
Creación de Pools ZFS
# Ubuntu / Debian
sudo apt install zfsutils-linux -y
# Mirror (equivalente RAID-1)
sudo zpool create tank mirror /dev/sdb /dev/sdc
# RAIDZ2 (equivalente RAID-6) — recomendado para producción
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# Verificar estado
zpool status tank
Gestión de Datasets
# Crear dataset con punto de montaje personalizado
zfs create -o mountpoint=/srv/web tank/web
# Compresión LZ4 (casi siempre beneficiosa)
zfs set compression=lz4 tank/data
# Cuota — límite duro en el tamaño del dataset
zfs set quota=500G tank/data
# Ajustar recordsize para bases de datos
zfs set recordsize=16K tank/databases
# Listar propiedades
zfs get compression,quota,recordsize tank/data
Snapshots: Creación y Gestión
# Snapshot de un dataset (convención: @YYYY-MM-DD o @YYYY-MM-DDTHH:MM)
zfs snapshot tank/data@2026-03-23
# Snapshot recursivo — captura dataset y todos los hijos al mismo momento
zfs snapshot -r tank@2026-03-23T03:00
# Snapshot con etiqueta descriptiva
zfs snapshot tank/data@antes-actualizacion-nginx
# Listar todos los snapshots
zfs list -t snapshot
# Mostrar espacio usado por cada snapshot
zfs list -t snapshot -o name,used,referenced,written tank/data
Rollback
# Rollback al snapshot más reciente
zfs rollback tank/data@2026-03-23
# Rollback a través de snapshots intermedios (destruye todo lo intermedio)
zfs rollback -r tank/data@antes-actualizacion-nginx
Advertencia:
zfs rollback -rdestruye TODOS los snapshots intermedios entre el objetivo y el estado actual. Crea un clon del estado actual antes si podrías necesitar esos datos.
Clones: Alternativa Segura al Rollback
# Crear un clon desde un snapshot
zfs clone tank/data@2026-03-23 tank/data-clon
# Si el clon debe convertirse en el principal, promoverlo
zfs promote tank/data-clon
Send y Receive: Replicación
# Envío completo inicial a servidor remoto
zfs send tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data
# Envío incremental (-i: delta entre dos snapshots específicos)
zfs send -i tank/data@2026-03-22 tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data
# Envío comprimido (-c: transfiere bloques ya comprimidos)
zfs send -c -i tank/data@snap1 tank/data@snap2 | ssh user@remote zfs receive backup/data
# Envío cifrado raw (para datasets con cifrado nativo)
zfs send -w tank/data@snap1 | ssh user@remote zfs receive backup/data
Cifrado Nativo
# Crear dataset cifrado
zfs create -o encryption=aes-256-gcm -o keylocation=prompt -o keyformat=passphrase tank/secrets
Snapshots Automatizados con sanoid
# Ubuntu / Debian
sudo apt install sanoid -y
Editar /etc/sanoid/sanoid.conf:
[tank/data]
use_template = produccion
[tank/databases]
use_template = produccion
recursive = yes
[template_produccion]
hourly = 24
daily = 30
weekly = 8
monthly = 12
autosnap = yes
autoprune = yes
# Prueba en seco
sudo sanoid --cron --verbose --dryrun
# Activar timer de systemd
sudo systemctl enable --now sanoid.timer
Syncoid para Replicación
# Replicar tank/data al servidor remoto
sudo syncoid tank/data user@backup-server:backup/data
# Replicación recursiva
sudo syncoid -r tank user@backup-server:backup
Programación de Scrub
# Scrub manual
sudo zpool scrub tank
# Programar scrub mensual vía systemd
sudo systemctl enable --now zfs-scrub-monthly@tank.timer
# O via cron
0 2 1 * * zpool scrub tank
ZFS vs Tecnologías Alternativas de Snapshots
| Característica | ZFS | Btrfs | LVM Snapshots | ext4+LVM | XFS |
|---|---|---|---|---|---|
| Snapshots instantáneos | Sí | Sí | Sí | Sí (vía LVM) | No nativo |
| Snapshots recursivos | Sí (-r) | Solo subvolúmenes | No | No | No |
| Replicación send/receive | Sí (nativo) | Sí (btrfs send) | No | No | No |
| Checksums autocorrectivos | Sí | Sí | No | No | No |
| Cifrado nativo | Sí (ZoL 0.8+) | No | Vía dm-crypt | Vía dm-crypt | Vía dm-crypt |
| RAID integrado | Sí (raidz) | Sí (raid1/5/6) | No | No | No |
| Deduplicación | Sí (alto RAM) | Sí (limitada) | No | No | No |
Estrategia de Backup en Producción con sanoid + syncoid
Nivel 1 — Snapshots locales (sanoid): Cada hora por 24 horas, diarios por 30 días, semanales por 8 semanas.
Nivel 2 — Replicación a servidor de respaldo (syncoid): Sincronización diaria a un servidor backup en la misma red. Recuperación rápida ante fallo de hardware.
Nivel 3 — Replicación fuera del sitio (syncoid vía SSH): Envío cifrado semanal a un servidor cloud. Protección ante desastres a nivel del sitio.
Casos Especiales y Errores Frecuentes
Requerimiento de RAM para deduplicación: ZFS dedup necesita ~5 GB de RAM por TB de datos deduplicados. Sin suficiente RAM provoca swapping intensivo. Usa dedup solo para repositorios con alta redundancia.
Acumulación de snapshots: Los snapshots olvidados retienen bloques que ZFS no puede liberar. Un pool que parece “lleno” pero tiene poco dato referenciado suele tener snapshots con alto used. Usa siempre sanoid o zfs destroy explícito.
Tamaño del ARC: ZFS usa un caché adaptativo (ARC) que puede consumir casi toda la RAM. Limítalo en /etc/modprobe.d/zfs.conf: options zfs zfs_arc_max=4294967296 (4 GB).
Resumen
- El copy-on-write de ZFS hace los snapshots instantáneos y sin coste hasta que los datos divergen.
- Usa
raidz2para pools de producción; mirror para dos discos. - Ajusta
recordsizeycompression=lz4por dataset según la carga de trabajo. zfs snapshot -rpara snapshots recursivos atómicos; prefiere clones para pruebas seguras.zfs send | zfs receivepor SSH proporciona replicación nativa incremental cifrada.- sanoid + syncoid es el estándar en producción para retención y replicación automatizadas.