Bibliografía:
klarasystems.com
Klara Inc. Allan Jude y Jim Salter
iceflatline.com
Illumos ZFS Administracion
Diagrama Dia
Replication ZFS en FreeBSD
Lo que hace la replicación ZFS es poder serializar un sistema de archivos. Cuando serializa un objeto en ciencia de datos o programación de computadoras se trata de hacerlo en formato que pueda transportarse con facilidad de tal manera que podamos recrear ese sistema de archivos en el otro lado, de forma que nos permite cruzar sistemas operativos, no importa si la fuente es FreeBSD y el destino es Linux, Illumos, Mac o Windows, etc.
Recrea el sistema de archivo exactamente igual sin depender que sea byte por byte. Eso también proporciona compatibilidad hacia delante y hacia atrás, puede hacer una transmisión ZFS 10 con la última versión de ZFS y aún recibirlo con una versión de ZFS de hace 10 años o viceversa.
Otra cosa importante sobre la forma en que esto funciona en la replicación ZFS es que es unidireccional, por lo que el remitente controla todo lo que empaqueta el sistema de archivos en el formato serializado y lo enviará, no requiere ninguna interacción con el lado que lo va a recibir, lo que significa que no tiene que recibirlo ahora mismo.
Lo interesante sobre la forma en que esto funciona es que no requiere un manejo especial para cosas como permisos, atributos extentidos de ACLS y cualquier otra cosa que pueden estar adjuntos al sistema de archivos, todos son sólo datos que se serializan de la misma manera que el contenido de los archivos, por lo que ZFS no tiene que realizar comprobaciones adicionales ni nigún trabajo extra, simplemente envía los datos y el resto, el lado es responsable de interpretarlo, por lo que si usa algunas de las herramientas de depuración de ZFS podemos ver lo que hay dentro de una secuencia de envío, pero básicamente es un comando de objeto que dice que necesitamos crear un nuevo objeto.
Como toda copia de seguridad todavía debe probar y asegurarse de que puede restaurar el sistema de archivos desde su copia de seguridad.
Sumas de Verificación de un Extremo a Otro
ZFS utiliza sumas de verificación de extremo a extremo por lo que sabemos que ZFS almacena una suma de verificación para cada bloque en el que escribe incluido sus propios metadatos internos. Antes de enviar ZFS se asegura de que los datos que está a punto de enviar son correctos comprobando la suma de verificación, luego los envía con la suma de verificación para que cuando llegue al otro lado verificar que lo que recibe sigue siendo los datos correctos. Después se escriben en disco y al volver a leerlos desde la copia de seguridad verifica de nuevo que sigue siendo la misma suma de verificación y que los datos sobrevivieron intactos. Si los datos están cifrados, también hay un código de verificación allí, asegurándose de que no solo los datos estén intactos sino también que no han sido modificados maliciosamente porque verifica que se descibra correctamente.
¿Que ocurre si por algún motivo se interrumpe la replicación?.
En el lado receptor aparece una propiedad llamada token de reanudación y contiene en qué instantánea estábamos, en que objeto en esa instantánea, que tan lejos en ese objeto y permite reanudar esa replicación. Si ejecutamos
zfs get -H receive_resume_token zroot/backup
zstream token 1-ca6584b3f-c0-bb2...
object: 128
offset: 1507590144
bytes: 1511357704
toguid: 2687048938072742180
toname: 'zroot/usr/home@snap-20241214'
Nos dará una cadena, vemos que estamos enviando el objeto 128, este desplazamiento de 1.5 GB y que tenemos otros 1.5 GB para enviar, la cuadrícula de la instantánea y el nombre de la instantánea.
Como toda copia de seguridad todavía debe probar y asegurarse de que puede restaurar el sistema de archivos desde su backup
En el lado de envío (origen) se utiliza:
zfs send -t receive_resume_token 1-ca6584b3f-c0-bb2...
El token contiene el resto de la información sobre exactamente desde dónde continuar y dejaremos que este envio continue.
Conectar al servidor tormenta vía SSH desde el cliente solaris
El archivo de hosts contiene información sobre los hosts conocidos en la red.
Archivo /etc/hosts
cat /etc/hosts| grep tormenta
192.168.88.160 tormenta
Archivo ~/.ssh/config
$ cat .ssh/config
Host tormenta
HostName 192.168.88.160
User carlos
Port 30000
AddressFamily inet
BindInterface em0
CheckHostIP yes
...
$ ssh tormenta
Last login: Sat Dec 14 06:50:20 2024 from solaris
...
Compruebe que el ssh basado en clave funciona
Copiar la clave publica id_rsa.pub del cliente en el archivo authorized_keys de su cuenta en el servidor
ssh-keygen
cat ~/.ssh/id_rsa.pub | ssh remote_host "cat >> .ssh/authorized_keys"
ssh tormenta
carlos@tormenta:~ %
Particionar el Disco Para las Copias de Seguridad
El disco debe estar desmontado, para averiguar el punto de montaje se utiliza mount y unmount para desmontarlo.
Es importante asegurarse del disco sobre el que va a trabajar. Para ello dispone de múltiples opciones.
gpart
gpart show
lsblk
lsblk -d
Mostrar discos físicos
sysctl kern.disks
Y por último usando dmesg para identificar discos conectados, por ejemplo, si conecta un dispositivo de almacenamiento vía USB aparece al final del archivo dmesg
/sbin/dmesg | tail
Preparar el dispositivo de almacenamiento
El comando gpart destroy DESTRUYE EL ESQUEMA DE PARTICIONAMIENTO implementado por GEOM. Es un proceso irreversible. Destruye todos los datos.
-F Fuerza la destrucción de la tabla de particiones incluso si no está vacía.
Ya conoce el disco a particionar?
En esta laboratorio es (da1) /dev/da1 de 2 TB con una capacidad real de 1862 GB (2x0.9313 = 1.862 TB = 1862 GB)
gpart destroy -F /dev/da1
gpart create -s gpt /dev/da1
gpart add -t freebsd-zfs -a 1m da1
da1p1 created
zpool labelclear -f /dev/da1p1
zpool create backups /dev/da1p1
zfs set atime=off backups
zfs set snapdir=visible backups
zfs set canmount=off backups
zpool set mountpoint=/export backups
Consultar propiedades
zfs get mountpoint,name backups
NAME PROPERTY VALUE SOURCE
backups mountpoint /export local
backups name backups -
# zfs get canmount backups
NAME PROPERTY VALUE SOURCE
backups canmount on local
Crear Conjunto de Datos en pool backups
zfs create -p backups/usr/backup/docs
zfs create backps/usr/home
zfs create -p backups/solarishome/home
zfs create -p backups/recovery/solaris
zfs create backups/recovery/tormenta
zfs create backups/reserved
Listar recursivamente backups
zfs list -r backups
NAME USED AVAIL REFER MOUNTPOINT
backups 480G 1.29T 192K /export
backups/recovery 330G 1.29T 96K /export/recovery
backups/recovery/solaris 67.9G 1.29T 67.9G /export/recovery/solaris
backups/recovery/tormenta 262G 1.29T 262G /export/recovery/tormenta
backups/reserved 96K 1.34T 96K /export/reserved
backups/solarishome 62.8G 1.29T 96K /export/solarishome
backups/solarishome/home 62.8G 1.29T 40.4G /export/solarishome/home
backups/usr 7.78G 1.29T 96K /export/usr
backups/usr/backup 7.78G 1.29T 96K /export/usr/backup
backups/usr/backup/docs 7.78G 1.29T 7.78G /export/usr/backup/docs
backups/usr/home 6.14M 1.29T 5.97M /export/usr/home
Listar recursivamente pool zroot servidor tormenta
zfs list -r zroot
NAME USED AVAIL REFER MOUNTPOINT
zroot 170G 264G 112K /zroot
zroot/ROOT 40.8G 264G 96K none
zroot/ROOT/default 40.8G 264G 36.0G /
zroot/confsolaris 1.16M 264G 1.16M /zroot/confsolaris
zroot/jails 1.25G 264G 96K /jails
zroot/jails/loghost 1.25G 264G 1.25G /jails/loghost
zroot/jails/media 96K 264G 96K /jails/media
zroot/reserved 96K 289G 96K /zroot/reserved
zroot/tmp 2.87G 264G 2.87G /tmp
zroot/usr 90.7G 264G 96K /usr
zroot/usr/backup 88.5G 264G 128K /usr/backup
zroot/usr/backup/confiles 284M 264G 96K /usr/backup/confiles
zroot/usr/backup/confiles/tormenta 4.71M 264G 860K /usr/backup/confiles/tormenta
zroot/usr/backup/docs 7.78G 264G 7.78G /usr/backup/docs
zroot/usr/home 6.57M 264G 4.82M /usr/home
zroot/usr/ports 924M 264G 924M /usr/ports
zroot/usr/src 1.26G 264G 1.26G /usr/src
zroot/var 1.27G 264G 96K /var
zroot/var/audit 96K 264G 96K /var/audit
zroot/var/crash 96K 264G 96K /var/crash
zroot/var/db 96K 264G 96K /var/db
zroot/var/jail 1.26G 264G 96K /var/jail
zroot/var/jail/www 1.26G 264G 1.26G /var/jail/www
zroot/var/log 3.86M 264G 2.64M /var/log
zroot/var/mail 144K 264G 144K /var/mail
zroot/var/tmp 152K 264G 96K /var/tmp
Exportar e Importar backups
zpool export backups
Grupos disponibles para importar
zpool import
pool: backups
id: 10639314260213971789
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
backups ONLINE
da0p1 ONLINE
zpool import backups
Listar Información Sobre los Grupos de Almacenamiento ZFS
zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH
backups 1.81T 430G 1.39T - - 0% 23% 1.00x ONLINE
zroot 448G 142G 306G - - 4% 31% 1.00x ONLINE
Disponible para importar
zpool import
no pools available to import
Crear las instantáneas
Para crear instantáneas y todos sus sistemas de archivos descendientes se utiliza -r
Crear las instantáneas de los conjunto de datos zroot/usr/backup/docs y zroot/usr/home
zfs snapshot -r zroot/usr/home@snap-`date +%Y%m%d`
zfs snapshot -r zroot/usr/backup/docs@snap-`date +%Y%m%d`
Listar instantáneas creadas
zfs list -t snapshot zroot/usr/home@snap-20241213
NAME USED AVAIL REFER MOUNTPOINT
zroot/usr/home@snap-20241213 172K - 5.97M -
zfs list -t snapshot zroot/usr/backup/docs@snap-20241213
NAME USED AVAIL REFER MOUNTPOINT
zroot/usr/backup/docs@snap-20241213 216K - 7.78G -
Enviar la primera instantánea completa
-R con el comando zfs send. Esta opción preservará las propiedades ZFS de cualquier conjunto de datos, instantáneas y clones descendientes en la secuencia.
-d Utilice la ruta completa de la instantánea enviada sin el primer elemento (sin el nombre del grupo) para determinar el nombre de la nueva instantánea
-u No montar el flujo recibido
-v Imprime información detallada sobre la secuencia y el tiempo necesario para realizar la operación de recepción
En el primer envío se utiliza la ruta de destino completa (backups/usr/backup/docs)
En el flujo incremental sólo se utiliza el nombre del pool (backups)
zfs send -R -v zroot/usr/home@snap-20241213 | zfs receive -vd backups/usr/home
zfs send -R -v zroot/usr/backup/docs@snap-20241213 | zfs receive -vdF \
backups/usr/backup/docs
Envío incremental
Tenga en cuenta que el envío de un flujo incremental sólo tendrá éxito si ya existe una instantánea completa inicial en el lado receptor.
Envía todos los bloques que tienen una hora de creacion entre zroot@snap-20241213 y zroot@snap-20241214, se serializan y envían al otro lado que ya tiene zroot@snap-20241213 por lo que puede aplicar los cambios y tener eso también sin tener que mirar lo que hay en zroot@snap-20241213, al contrario que rsync que tiene que revisar archivo por archivo.
Si recibe un error como este al realizar una replicación incremental:
"No se puede recibir el flujo incremental las copias de seguridad de destino se han modificado desde la snapshot más reciente", es decir, que las instantáneas de origen y destino ya no son idénticas ZFS aborta la replicación. Use receive -F para forzar al sistema receptor a retroceder al estado de la última instantánea recibida para que los sistemas estén nuevamente sincronizados.
Tomar las instantáneas
zfs snapshot zroot/usr/home@snap-`date +%Y%m%d`
zfs snapshot zroot/usr/backup/docs@snap-`date +%Y%m%d`
Listar instantáneas creadas
zfs list -t snapshot zroot/usr/home@snap-20241213
NAME USED AVAIL REFER MOUNTPOINT
zroot/usr/home@snap-20241214 172K - 5.97M -
zfs list -t snapshot zroot/usr/backup/docs@snap-20241213
NAME USED AVAIL REFER MOUNTPOINT
zroot/usr/backup/docs@snap-20241214 216K - 7.78G -
Enviar el flujo de datos
-F Fuerce una reversión del sistema de archivos a la instantánea más reciente antes de realizar la operación de recepción. Si recibe un flujo de replicación incremental (por ejemplo, uno generado por zfs send -R [-i|-I]), destruya las instantáneas y los sistemas de archivos que no existan en el lado de envío.
zfs send -R -i zroot/usr/home@snap-20241213 zroot/usr/home@snap-20241214 | zfs \
>receive -vdF backups
zfs send -R -i zroot/usr/backup/docs@snap-20241213 \
zroot/usr/backup/docs@snap-20241214 | zfs receive -vdF backups
Replicación remota a través de SSH
Origen FreeBSD solaris, destino backups servidor tormenta
Tomar la instatánea del conjunto de datos zroot/home
solaris~ # zfs snapshot zroot/home@snap-`date +%Y%m%d`
Listar instantánea
solaris~ # zfs list -t snapshot zroot/home@snap-20241213
NAME USED AVAIL REFER MOUNTPOINT
zroot/home@snap-20241213 25.4M - 39.2G -
solaris~ # zfs send -Rv zroot/home@snap-20241213 | ssh root@tormenta "zfs \
receive -vdF backups/solarishome/home"
Replicación remota incremental
Tomar la instantánea
solaris~ # zfs snapshot zroot/home@snap-`date +%Y%m%d`
Listar las intantáneas
solaris~ # zfs list -t snapshot | grep "zroot/home@snap-*"
zroot/home@snap-20241213 185M - 39.2G -
zroot/home@snap-20241214 53.4M - 39.2G -
Replicar el flujo de datos
solaris~ # zfs send -R -v zroot/home@snap-20241213 zroot/home@snap-20241214 | \
ssh root@tormenta "zfs receive -vdF backups"
Donde están las instantáneas?
Conectarse al servidor tormenta vía SSH
solaris~ $ ssh tormenta
Exportar e importar pool backups
zfs export backups
zfs import backups
carlos@tormenta~ $ % ls -l /export/solarishome/home/.zfs/snapshot
total 1
drwxr-xr-x 5 root wheel 5 May 30 2024 snap-20241213
drwxr-xr-x 5 root wheel 5 May 30 2024 snap-20241214
carlos@tormenta~ $ % ls -l /export/usr/home/.zfs/snapshot
total 1
drwxr-xr-x 4 root wheel 4 Jul 24 17:31 snap-20241213
drwxr-xr-x 4 root wheel 4 Jul 24 17:31 snap-20241214
carlos@tormenta:~ % ls -l /export/usr/backup/docs/.zfs/snapshot
total 289
drwxr-xr-x 30 carlos wheel 923 Dec 12 08:19 snap-20241212
drwxr-xr-x 30 carlos wheel 926 Dec 13 07:34 snap-20241214
carlos@tormenta:~ % zfs list -t snapshot | grep "zroot/usr/backup/docs@snap-"
zroot/usr/backup/docs@snap-20241213 248K - 7.78G -
zroot/usr/backup/docs@snap-20241214 216K - 7.78G -
carlos@tormenta:~ % zfs list -t snapshot | grep "zroot/usr/home@snap-"
zroot/usr/home@snap-20241213 172K - 5.97M -
zroot/usr/home@snap-20241214 172K - 5.97M -
Listar todas las instantáneas en backups
carlos@tormenta:~ % zfs list -t snapshot -r backups
NAME USED AVAIL REFER MOUNTPOINT
backups/solarishome/home@snap-20241213 22.5G - 62.8G -
backups/solarishome/home@snap-20241214 0B - 40.4G -
backups/usr/backup/docs@snap-20241213 276K - 7.78G -
backups/usr/backup/docs@snap-20241214 0B - 7.78G -
backups/usr/home@snap-20241213 172K - 5.97M -
backups/usr/home@snap-20241214 0B - 5.97M -
Tenga en cuenta las siguientes consideraciones al restaurar una instantánea:
. Se restaura la instantánea y el sistema de archivos.
. El sistema de archivos y todos los sistemas de archivos descendientes se desmontan.
. Los sistemas de archivos son inaccesibles mientras se restauran.
. El sistema de archivos original que e va a restaurar no debe exister mientras está siendo restaurado.
. Si existe un nombre de sistema de archivos en conflicto, puede utilizarse zfs rename para cambiar el nombre del sistema de archivos.
Restaurar instantánea de forma remota
-d Utilice la ruta completa de la instantánea enviada sin el primer elemento (sin el nombre del grupo) para determinar el nombre de la nueva instantánea.
ssh root@tormenta "zfs send -Rv backups/filesolaris/confsolaris@snap-20241215" \
| zfs receive -vFd zroot
full send of toshiba/filesolaris/confsolaris@snap-20241215 estimated size is 1.20M
total estimated size is 1.20M
receiving full stream of toshiba/filesolaris/confsolaris@snap-20241215 into \
zroot/filesolaris/confsolaris@snap-20241215
received 1.20M stream in 0.06 seconds (19.0M/sec)
Recuperar el flujo de datos desde tormenta (pool backups) a solaris
solaris~ # ssh root@tormenta "zfs send -Rv backups/usr/backup/docs@snap-20241216" \
zfs receive zroot/documentos
full send of toshiba/usr/backup/docs@snap-20241216 estimated size is 7.88G
send from @snap-20241216 to toshiba/usr/backup/docs@snap-20241217 estimated size is 105K
total estimated size is 7.88G
TIME SENT SNAPSHOT toshiba/usr/backup/docs@snap-20241216
...
zfs list | grep "zroot/documentos"
zroot/documentos 96K 330G 96K /zroot/documentos
Enviar el flujo de datos a un archivo
zfs send zroot/usr/home@-20241222-snap1 > usr.home.20241222.servidor
Podemos utilizar el comando receive y proporcionar el grupo en el que desea importarlo y podría ser un grupo completamente diferente, y es probablemente la principal razon por la que usarias esto para transferir un conjunto de datos a otro sistema, especifica el grupo y el conjunto de datos al que desea importarlo, si no proporciona uno simplemente creará un conjunto de datos con el nombre que se usó desde el momento en que se creo la instantánea. Ahora, usando cat nombre del archivo y canalizarlo a través de una tuberia a zfs receive, se creará un nuevo conjunto de datos llamado zroot/homeservidor
cat usr.home.20241222.tormenta | zfs receive zroot/home.20241222.servidor
Listar el conjunto de datos
zfs list | grep "zroot/homeservidor"
zroot/homeservidor 4.82M 264G 4.82M /zroot/home.20241222.servidor
Otro ejemplo de envío y recepción de datos ZFS:
El comando zfs send crea una representación de flujo de una instantánea que está escrita, a la salida estándar. Puede redirigir la salida a un archivo o a un sistema diferente. El comando zfs receive crea una instantánea cuyo contenido se especifica en la secuencia que se proporciona en la entrada estándar. Si se recibe una transmisión completa, un nuevo sistema de archivos también se crea.
Creacion de los conjuntos de datos
zfs -p create zroot/usuarios/user1
zfs create zroot/usuarios/user2
zfs create zroot/usuarios/user3
zfs list -r zroot/usuarios
NAME USED AVAIL REFER MOUNTPOINT
zroot/usuarios 63.5M 351G 63.2M /zroot/usuarios
zroot/usuarios/user1 96K 351G 96K /zroot/usuarios/user1
zroot/usuarios/user2 96K 351G 96K /zroot/usuarios/user2
zroot/usuarios/user3 96K 351G 96K /zroot/usuarios/user3
Tomar las instantáneas
zfs snapshot -r zroot/usuarios@hoy
Se crea una secuencia de replicación para todas las instantáneas de usuarios
zfs send -R zroot/usuarios@hoy > /snaps/usuarios
A continuación, los sistemas de archivos originales y las instantáneas se destruyen
zfs destroy -r zroot/usuarios
zfs list -r zroot/usuarios
cannot open 'zroot/usuarios': dataset does not exist
Y luego se recuperan
zfs receive -Fd zroot < /snaps/usuarios
zfs list -r zroot/usuarios
NAME USED AVAIL REFER MOUNTPOINT
zroot/usuarios 63.6M 351G 112K /zroot/usuarios
zroot/usuarios/user1 96K 351G 96K /zroot/usuarios/user1
zroot/usuarios/user2 96K 351G 96K /zroot/usuarios/user2
zroot/usuarios/user3 96K 351G 96K /zroot/usuarios/user3
FreeBSD es genial!.