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, raidz2 o raidz3.
  • 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 -r destruye 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ísticaZFSBtrfsLVM Snapshotsext4+LVMXFS
Snapshots instantáneosSí (vía LVM)No nativo
Snapshots recursivosSí (-r)Solo subvolúmenesNoNoNo
Replicación send/receiveSí (nativo)Sí (btrfs send)NoNoNo
Checksums autocorrectivosNoNoNo
Cifrado nativoSí (ZoL 0.8+)NoVía dm-cryptVía dm-cryptVía dm-crypt
RAID integradoSí (raidz)Sí (raid1/5/6)NoNoNo
DeduplicaciónSí (alto RAM)Sí (limitada)NoNoNo

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 raidz2 para pools de producción; mirror para dos discos.
  • Ajusta recordsize y compression=lz4 por dataset según la carga de trabajo.
  • zfs snapshot -r para snapshots recursivos atómicos; prefiere clones para pruebas seguras.
  • zfs send | zfs receive por SSH proporciona replicación nativa incremental cifrada.
  • sanoid + syncoid es el estándar en producción para retención y replicación automatizadas.

Artículos Relacionados