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/user3FreeBSD es genial!.
No hay comentarios:
Publicar un comentario