Backups en entornos FreeNAS mediante zfs send / zfs receive
Hoy voy a hablaros de cómo hacer copia de seguridad de nuestro NAS basado en la distribución FreeNAS hasta otro dispositivo. En este caso haremos la copia contra un servidor FreeBSD, pero podríamos hacerla contra una máquina Ubuntu de nuestra red.
Pero antes de nada os preguntaréis, ¿qué es un NAS?, ¿qué es FreeNAS? y sobre todo, ¿qué es ZFS?
Vamos a responder a estas preguntas primero.
Índice de contenidos
Qué es un NAS
Hoy en día, el almacenamiento masivo se ha vuelto una necesidad de andar por casa. Pese a la infinidad de servicios de streaming que nos traen a nuestro hogar música, películas, series o almacenamiento ilimitado en la nube para guardar nuestras fotos de las vacaciones o del confinamiento, siempre sentimos la necesidad de tener un respaldo o una copia de todo lo que hemos ido almacenando durante años (o décadas) en nuestros ordenadores de casa.
Si sois unos diógenes digitales como yo, sabréis de qué os hablo.
En fin, un NAS es un dispositivo que se conecta a nuestra red y nos permite almacenar datos como si de un ordenador autómono se tratase, en sus siglas en inglés «Network Attached Storage» o Almacenamiento Conectad en Red. Y aunque se le pueden dar usos muy diversos, es nuestro cajón de sastre digital, donde alojamos todas nuestras copias de seguridad o un poco de ambas cosas.
¿Quién no tiene un NAS en casa? Hay multitud de marcas, modelos, tamaños, precios y capacidad, pero yo en su momento decidí montarme uno a medida con una distribución llamada FreeNAS que me permitía configurar una infinidad de cosas que en otros marcas no podía y, siéndoos sincero, porque me gusta complicarme las cosas un poco.
De eso también os habréis dado cuenta ya.
Qué es FreeNAS
FreeNAS es una distribución *BSD derivada de FreeBSD y está pensada para, como bien dice su nombre, sistemas NAS.
Está mantenida por una empresa llamada iXsystems que tiene un producto comercial llamado TrueNAS con soporte comercial y hardware específico, pero en nuestro caso utilizaremos la versión Open Source y un ordenador viejo que tenemos por casa y al que queremos darle una segunda vida o un uso mejor.
FreeNAS está disponible para su descarga para plataformas de 64bits exclusivamente y podemos instalarlo incluso sobre un pendrive.
La instalación y configuración es bastante rápida y fácil. Se gestiona mediante un interfaz web moderno e intuitivo (al menos en las versiones 10.x y 11, antes era otro cantar), lo que nos permitirá tener en poco tiempo un sistema NAS completo, seguro y fácil de mantener para alojar nuestros datos.
Me he dejado para el final la parte más importante de FreeNAS, y es que funciona con un sistema de archivos venido del futuro, como la chica del anuncio de la lejía, se llama ZFS y ahora os voy a hablar de él.
Qué es ZFS
ZFS es un sistema de archivos avanzado de nueva generación creado por Matthew Ahrens y Jeff Bonwick en 2001 para Sun Microsystems y su sistema operativo OpenSolaris. En 2008 el proyecto ZFS fue portado a FreeBSD y licenciado bajo la CDDL.
Sun Microsystems fue comprada por Oracle en 2009 y convirtió su sistema OpenSolaris en producto de código cerrado, así que un gran número de desarrolladores que estaban trabajando en ZFS se desmarcaron del proyecto y crearon OpenZFS en 2013 para aunar esfuerzos en el desarrollo de ZFS con soporte de código abierto.
Las características más importantes de ZFS (que no todas) son:
- Almacenamiento basado en Pools.
- Copy-on-Write.
- Snapshots o instantáneas.
- Verificación de integridad y reparación automática.
- Niveles de RAID denominados RAID-Z (sin necesidad de controladora específica).
- Sistema de ficheros de 128-bits.
Podíamos dedicar varios posts a hablar de las características que acabamos de listar, pero simplemente haremos la reseña de que es un sistema de archivos avanzado, de muy alta capacidad, con características avanzadas y seguridad en su uso.
Como última característica, podemos utilizarlo, gracias al proyecto OpenZFS, también en nuestras distribuciones Linux favoritas, como Ubuntu o Debian.
Cómo puedo hacer copia de seguridad de un NAS basado en FreeNAS
Una de las tareas más olvidadas en nuestro sistema NAS es realizar tareas periódicas de backup. Ya sea en nubes públicas, almacenamiento de objetos, discos externos o cualquier otro soporte o destino, la copia de seguridad de nuestro NAS es una asignatura que habitualmente nos dejamos para septiembre.
Así que, ni cortos ni perezosos, hoy os voy a enseñar cómo replicar nuestro almacenamiento en el NAS desde un dispositivo a otro de forma fácil y con un rendimiento espectacular.
Como os hablaba anteriormente, una de las características más importantes de ZFS es la capacidad de generar snapshots de nuestro sistema de archivos. Estos snapshots o instantáneas contienen una imagen completa en un momento dado de nuestro sistema de archivos y podemos enviarla a otro dispositivo de forma fácil.
Entrando en materia, disponemos de dos hosts, uno con una distribución FreeNAS versión 11.2-STABLE al que hemos habilitado la consola SSH y otro un FreeBSD 12.1-RELEASE con acceso SSH también. Ambos son hardware de la marca HP MicroProliant, bastante económicos y con un rendimiento bastante bueno, así como una capacidad de almacenamiento de 4 discos de 3.5″.
Nuestro host1: nas.gtk.local tiene un dataset denominado musica montado en el path /mnt/tank/musica que contiene aproximadamente 192G de mi colección personal de música original. El host de destino beastie.gtk.local tiene una instalación limpia de FreeBSD en la que alojaremos una copia de nuestro NAS con el propósito de no perder tan valiosa colección.
Como paso inicial, debemos generar las claves públicas del usuario gtk que es propietario del dataset musica y copiarlas entre los servidores para que puedan comunicarse vía SSH sin contraseña.
De host a host
Al usuario gtk debemos darle permisos a nivel zfs en el host1 de la siguiente forma:
1 2 |
# Host1: nas.gtk.local root@nas:/mnt/tank # zfs allow -u gtk send,snapshot,hold tank/musica |
Y en el host2 debemos otorgar los siguientes permisos:
1 2 |
# Host2: beastie.gtk.local root@beastie:~ # zfs allow -u gtk compression,mountpoint,create,mount,receive zroot/musica |
Una vez hecho esto, ya podemos proceder a hacer un snapshot de nuestro directorio o dataset musica de la siguiente forma:
1 2 3 4 5 6 7 |
# Realizo un snapshot llamado 'backup-30062020' zfs snapshot -r tank/musica@backup-30062020 # Listo los snapshots disponibles en la máquina root@nas:/mnt/tank # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT tank/musica@backup-30062020 0 - 192G - |
Como veis, ya me aparece mi snapshot disponible en el host1 y puedo enviarlo hasta mi host2.
Esto lo realizaremos con las utilidades zfs send y zfs receive de la siguiente forma:
1 2 3 4 5 |
# Envío de snapshot al host2 % zfs send -R tank/musica@backup-30062020 | ssh gtk@172.26.13.228 zfs recv -dvu zroot/musica receiving full stream of tank/musica@backup-30062020 into zroot/musica/musica@backup-30062020 received 193GB stream in 2758 seconds (71.5MB/sec) |
Como podéis ver, ha tardado unos 46min en mover los 190GB al host2, a una media de 71MB/sec. No está nada mal para ser máquinas con potencia limitada y red gigabit estándar.
Pero, ¿qué sucedería si mañana decidiese hacer una copia incremental del mismo dataset? ¿He de mover todo el snapshot al completo? Afortunadamente no, ZFS permite el envío incremental de los cambios sufridos por un dataset sin tener que volver a copiar todo el snapshot.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# realizo un nuevo snapshot tras agregar varias carpetas al directorio zfs snapshot -r tank/musica@backup-01072020 # Listo los snapshots disponibles % zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT tank/musica@backup-30062020 1008K - 192G - tank/musica@backup-01072020 0 - 193G - # Envío de forma incremental los cambios hasta mi servidor host2 % zfs send -Ri tank/musica@backup-30062020 tank/musica@backup-01072020 | ssh gtk@172.26.13.228 'zfs recv -dvu zroot/musica' receiving incremental stream of tank/musica@backup-01072020 into zroot/musica/musica@backup-01072020 received 346MB stream in 6 seconds (57.7MB/sec) |
Como veis, esta vez sólo he copiado unos 346MB en apenas 6 segundos, enviando únicamente los cambios entre el snapshot de ayer y hoy.
De esta forma, puedo ir haciendo copias incrementales de mi almacenamiento de forma fácil y rápida.
Vamos a limpiar antes de acabar el post los snapshots realizados en el servidor FreeNAS:
1 2 3 4 5 6 7 8 |
% zfs destroy tank/musica@backup-30062020 % zfs destroy tank/musica@backup-01072020 % zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT |
Os he de confesar que toda esta operación se puede automatizar desde la interfaz gráfica del FreeNAS, pero… Si os lo explicara así, ¿qué gracia tendría?
¡Nos vemos en el próximo post!
Deja una respuesta