
Guía de configuración de ZFS para un rendimiento óptimo
ZFS (Zettabyte File System) combina las funciones de un sistema de archivos tradicional y un gestor de volúmenes en una sola solución. Esta guía explica cómo instalar, configurar, optimizar y mantener ZFS para lograr un rendimiento sólido en tu homelab.
Why ZFS Hates Hardware RAID
¿Qué hace diferente a ZFS?
El cálculo integrado de sumas de comprobación detecta y corrige la corrupción silenciosa de datos, mientras que las instantáneas proporcionan copias inmediatas y eficientes en espacio de un punto temporal concreto. RAID-Z es un RAID por software que ofrece mejor rendimiento que un RAID por hardware convencional. ZFS también incluye compresión transparente para ahorrar espacio, deduplicación para eliminar bloques de datos duplicados y la caché ARC, un sistema de almacenamiento en memoria inteligente pensado para acelerar el acceso a los datos.
Requisitos del sistema
Requisitos mínimos
Como mínimo necesitas 8GB de RAM (se recomiendan 16GB o más), cualquier procesador de 64 bits y al menos 2 unidades para tener redundancia.
Configuración recomendada
Calcula 1GB de RAM por cada TB de almacenamiento, o 5GB por cada TB si utilizas deduplicación. Un procesador multinúcleo mejora el rendimiento, y los discos deben ser unidades para empresas con protección frente a cortes de alimentación.
Instalación de ZFS
Ubuntu y Debian
sudo apt update
sudo apt install zfsutils-linux
Proxmox
ZFS viene incluido de serie en Proxmox, así que puedes comprobar la versión instalada al instante:
zfs version
Creación de pools de ZFS
Disco único (sin redundancia)
Un pool con un único disco carece de redundancia, por lo que no se recomienda para datos en producción.
sudo zpool create tank /dev/sdb
Espejo o Mirror (RAID-1)
Un espejo utiliza dos discos y cada uno almacena una copia íntegra de la información:
sudo zpool create tank mirror /dev/sdb /dev/sdc
RAID-Z1 (similar a RAID-5)
RAID-Z1 necesita un mínimo de 3 discos y soporta el fallo de 1 disco:
sudo zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
RAID-Z2 (similar a RAID-6)
RAID-Z2 necesita un mínimo de 4 discos y soporta el fallo simultáneo de 2 discos:
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
RAID-Z3
RAID-Z3 necesita un mínimo de 5 discos y soporta el fallo simultáneo de 3 discos:
sudo zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf
Recomendaciones para pools de ZFS
Entornos domésticos y oficinas pequeñas
Con 3 o 4 discos, utiliza RAID-Z1. Con entre 5 y 8 unidades, emplea RAID-Z2. Con 9 o más discos, contempla RAID-Z3 o varios vdevs en RAID-Z2.
Entornos empresariales y datos críticos
Utiliza siempre RAID-Z2 o RAID-Z3, añade discos de repuesto en caliente (hot spares) y emplea unidades para empresas.
Optimización del rendimiento de ZFS
Ajuste de la caché ARC
Para limitar el tamaño de la caché ARC, define los valores máximo y mínimo en /etc/modprobe.d/zfs.conf:
# Limit ARC to 8GB
options zfs zfs_arc_max=8589934592
# Minimum ARC size
options zfs zfs_arc_min=4294967296
A continuación, regenera el initramfs y reinicia el equipo para aplicar los cambios:
sudo update-initramfs -u
sudo reboot
Habilitar la compresión
La compresión LZ4 es rápida y ahorra espacio de forma transparente. Actívala en el pool con:
sudo zfs set compression=lz4 tank
Configuración del tamaño de registro (recordsize)
Para bases de datos con operaciones de E/S aleatorias pequeñas, utiliza un tamaño de registro reducido:
sudo zfs set recordsize=16K tank/database
Para archivos multimedia con lecturas y escrituras secuenciales grandes, define un bloque mayor:
sudo zfs set recordsize=1M tank/media
Desactivar la actualización de fecha de acceso (atime)
Desactivar las actualizaciones de fecha de acceso mejora el rendimiento general. Aplica este cambio en el pool con:
sudo zfs set atime=off tank
Habilitar el trim automático
Si el pool está configurado sobre unidades SSD, activa la opción autotrim:
sudo zpool set autotrim=on tank
Gestión de datasets
Crear datasets
sudo zfs create tank/documents
sudo zfs create tank/photos
sudo zfs create tank/videos
Establecer cuotas
sudo zfs set quota=100G tank/documents
Establecer reservas de espacio
sudo zfs set reservation=50G tank/database
Listar datasets
zfs list
Instantáneas (Snapshots)
Crear una instantánea
sudo zfs snapshot tank/documents@backup-2024-01-15
Listar instantáneas
zfs list -t snapshot
Revertir a una instantánea
sudo zfs rollback tank/documents@backup-2024-01-15
Eliminar una instantánea
sudo zfs destroy tank/documents@backup-2024-01-15
Instantáneas automatizadas
Instala Sanoid para la gestión automatizada de instantáneas en tus datasets:
sudo apt install sanoid
A continuación, define tus datasets y una plantilla de retención en /etc/sanoid/sanoid.conf:
[tank/documents]
use_template = production
recursive = yes
[template_production]
frequently = 0
hourly = 24
daily = 7
monthly = 12
yearly = 0
autosnap = yes
autoprune = yes
Envío y recepción de datos (Replicación)
Enviar una instantánea a un archivo
sudo zfs send tank/documents@backup | gzip > backup.gz
Recibir una instantánea desde un archivo
gunzip -c backup.gz | sudo zfs receive tank/restore
Replicación incremental
Comienza enviando una réplica inicial completa del dataset hacia el servidor de backup:
sudo zfs send tank/documents@initial | ssh user@backup-server \
sudo zfs receive backup/documents
Los envíos incrementales posteriores transferirán únicamente las modificaciones realizadas desde la instantánea previa:
sudo zfs send -i @initial tank/documents@today | ssh user@backup-server \
sudo zfs receive backup/documents
Monitorización de ZFS
Estado del pool
sudo zpool status
Estadísticas de E/S del pool
sudo zpool iostat -v 2
Estadísticas de la caché ARC
cat /proc/spl/kstat/zfs/arcstats
También puedes utilizar arc_summary para obtener un informe formateado y fácil de interpretar:
sudo arc_summary
Uso del dataset
zfs list -o name,used,avail,refer,mountpoint
Comprobación de errores
sudo zpool status -v
Mantenimiento
Comprobación de integridad del pool (Scrub)
Las operaciones periódicas de scrub comprueban la integridad de cada bloque. Lanza una revisión manual en el pool con:
sudo zpool scrub tank
Mientras la tarea se ejecuta, puedes seguir su evolución con el comando de estado:
sudo zpool status
Para planificar revisiones mensuales de forma automática, añade esta línea en tu crontab:
# Run on the first Sunday of each month at 2 AM
0 2 1-7 * * [ "$(date +\%u)" = "7" ] && /sbin/zpool scrub tank
Sustitución de un disco averiado
sudo zpool replace tank /dev/sdb /dev/sdf
Tras cambiar la unidad, vigila el proceso de reconstrucción (resilver) hasta que concluya:
watch -n 5 zpool status
Añadir un repuesto en caliente
sudo zpool add tank spare /dev/sdg
Resolución de incidencias
El pool no se importa
Si un pool no se importa de la manera habitual, puedes forzar la importación:
sudo zpool import -f tank
Pool en estado degradado
Si el pool está degradado, empieza revisando el informe detallado de estado:
sudo zpool status -v
Si los fallos fueron puntuales, restablece los contadores de errores del pool con:
sudo zpool clear tank
Espacio agotado
Cuando el pool se queda sin espacio, comprueba el almacenamiento consumido por datasets e instantáneas:
zfs list -o name,used,avail,refer
zfs list -t snapshot
Después, borra las instantáneas antiguas que ya no necesites para liberar bloques:
sudo zfs destroy tank/documents@old-snapshot
Problemas de rendimiento
Ante caídas de velocidad, revisa primero el porcentaje de aciertos en la caché ARC:
sudo arc_summary | grep "Hit Rate"
A continuación, comprueba el nivel de fragmentación del pool con el comando de listado:
sudo zpool list -o name,fragmentation
Buenas prácticas
Qué debes hacer
- Utiliza memoria RAM con ECC para proteger la integridad de los datos.
- Ejecuta tareas de scrub periódicas (una vez al mes).
- Habilita la compresión (lz4).
- Realiza instantáneas con regularidad.
- Pon a prueba tus backups con restauraciones reales.
- Supervisa la salud del pool de forma continua.
- Asigna discos enteros en lugar de particiones sueltas.
Qué debes evitar
- No superes nunca el 80% de capacidad del pool.
- No construyas un RAID-Z mezclando discos de distintos tamaños.
- Evita la deduplicación a menos que dispongas de 5GB de RAM por cada TB.
- No intentes ampliar vdevs RAID-Z añadiendo discos sueltos (operación no soportada).
- Nunca utilices discos de gama doméstica sin pruebas rigurosas previas.
- No ignores jamás los avisos o errores reportados por un scrub.
Características avanzadas
Cifrado
Para crear un dataset cifrado y protegido por una frase de paso, ejecuta:
sudo zfs create -o encryption=aes-256-gcm \
-o keyformat=passphrase tank/secure
Deduplicación
La deduplicación exige una cantidad sustancial de memoria RAM. Puedes activarla en un dataset con:
sudo zfs set dedup=on tank/vms
Recursos compartidos NFS
sudo zfs set sharenfs=on tank/share
sudo zfs set sharenfs="rw=@192.168.1.0/24" tank/share
Recursos compartidos SMB
sudo zfs set sharesmb=on tank/share
Pruebas de rendimiento
Evalúa la velocidad de escritura secuencial generando un archivo de prueba grande mediante dd:
dd if=/dev/zero of=/tank/testfile bs=1M count=10000
Prueba la lectura secuencial volviendo a leer ese mismo archivo:
dd if=/tank/testfile of=/dev/null bs=1M
Para evaluaciones más completas y representativas, instala fio y ejecuta una prueba de escritura secuencial:
sudo apt install fio
fio --name=seqwrite --rw=write --bs=1M --size=10G \
--filename=/tank/testfile
Conclusión
ZFS traslada funciones de almacenamiento empresarial a tu homelab. Con una configuración acertada y el mantenimiento adecuado, proporciona una integridad de datos sobresaliente y un rendimiento muy sólido. Recuerda emplear RAID-Z2 para la información crítica, activar la compresión LZ4, programar scrubs regulares, crear instantáneas con frecuencia, monitorizar la salud del pool y no superar nunca el 80% de su capacidad.