Header Ads

Sincronización Espejo

Rios de tinta se ha escrito sobre cómo hacer una copia de seguridad y sus diferentes modalidades. Existen muchos tipos, como la diferencial, la completa, la incremental, etc. También hay otras modalidades como el backup completo sintético, la espejo, la incremental inversa y la protección de datos continua (CDP), entre otras. Sin embargo hay una muy crítica para cualquier entorno que consideramos la pena dedicarle un post. Se trata de la Sincronización o Backup Espejo.
Sin entrar en muchos detalles técnicos (puede consultarlos AQUI), básicamente una Sincronización Espejo es replicar un soporte de almacenamiento A en un soporte B, sin importar que sean soportes físicos (discos duros, dispositivos usb, etc) o virtuales (Discos VDI, VHD, etc).
Es importante aclarar que una sincronización o backup espejo es "1-way mirror" (de una sola vía: Disco A al B), en cambio las sincronizaciones en otras modalidades normalmente son "2-way sync" (doble vía: Disco A al B y viceversa).
Pero son muchas las herramientas que realizan esta modalidad de sincronización, de forma automática y desatendida, y describirlas todas es imposible. Es por eso que nos centraremos en un caso específico y para un sistema operativo en particular.
Sincronización Espejo de sistemas Linux (en caliente)
Para sincronizar discos (o más bien contenido de discos), existen muchas aplicaciones. Por ejemplo SyncToy, SyncBackSynkron, Goodsync, Allway Sync, Unison, y la archiconocida Rsync (de la cual se derivó gran parte de esta familia sync), entre muchas muchas otras similares.
Pero este no es un tema exclusivo de Windows, Linux o Mac. También marcas como Acer y sistemas operativos como Android, tienen sus aplicaciones específicas, solo para ellos, o sistemas multiplataforma y multipropósito, como Acersync y SimpleDrop, o por terminal. Saber cuál es la mejor o cuál se ajusta más a nuestras necesidades, puede ser tedioso. Una comparativa detallada la puede encontrar en el post A comparison of file synchronisation software
Entre este insondable mar de programas, elegimos FreeFileSync, para la sincronización espejo de discos "en caliente", basados en Linux, debido a que, aparte de que la consideramos de las mejores alternativas gratuitas, esta herramienta es rápida y multi-plataforma, y sobre todo, una de las pocas que tiene la opción Espejo, pero es escasa la documentación para Linux y muchos sitios que la promueven solo se limitan a mencionar a Windows o a decir que es buena, que bla, bla, bla, pero no explican como configurarla y automatizarla en Linux, especialmente en Debian/Ubuntu.
Una limitante de FreeFileSync es que, a pesar de tener la opción Espejo (mirror) y reducir bastante el MTBF, no completa el procedimiento de Clonado Incremental durante la sincronización en Espejo de dos discos que contengan un SO en ejecución, ya que no copia el Sector de arranque.
De hecho ninguna aplicación actual, para ningún sistema operativo, es capaz de "sincronizar" el MBR/Tabla de Particiones + Datos, "en caliente"; y mucho menos EFI-GPT (Vea MBR vs GPT), solamente compatible con sistemas de 64bits.
Una alternativa sería usar cualquier otra herramienta especializada para clonar el sector de arranque del disco A al B (ej: Clonezilla, AcronisNorton Ghost, Paragon, etc) o decantarnos por el versátil comando DD, o usar sus herramientas GUI front-end AIR o Gdiskdump, clonando MBR/Tabla de Particiones y Contenidos y luego actualizar los datos con FreeFileSync.
Si opta por el clonado con el comando DD antes del sincronizado Espejo, debe hacer el siguiente procedimiento "en frío", desmontando las unidades.
Ejemplo de DD
# clonar disco hda en hdb (discos IDE):
sudo dd if=/dev/hda |pv|dd of=/dev/hdb bs=1M
# clonar disco sda en sdb (discos SATA):
sudo dd if=/dev/sda |pv|dd of=/dev/sdb bs=1M
Donde PV muestra el proceso y bs son bloque de 1 M, ideal para este tipo de transferencias.
También existen otras maneras de clonar/copiar/replicar un disco, como Copy the files from the old disk to the new disk, o con netcat + Partclone o solo con nc y con FreeFileSync completamos el sincronizado en espejo.
Después de tanto preámbulo, al grano...
Instalando FreeFileSync en Ubuntu
Desde Repositorio
sudo add-apt-repository ppa:freefilesync/ffs --yes # descontinuado
o
sudo add-apt-repository ppa:eugenesan/ppa --yes # actualizado pero no a la última versión
Actualizando e instalando
sudo apt-get update && sudo apt-get -y install freefilesync
En dependencia de la versión de Ubuntu, será la versión que se instale de FreeFileSync.
Configuración
Si dispone de entorno gráfico, inicie la aplicación, y en la opción "Arrastrar y Soltar" (a la izquierda) elija la unidad de disco origen y en la de la derecha la unidad de destino (donde se almacenará el espejo). Luego pulse F7, y le saldrá un cuadro: Seleccione "Espejo", en gestión de errores, seleccione "ignorar", en "al completar" elija "cerrar diálogo de progreso" y por último, en "Gestión de Borrado", elija "permanente" y pulse Aceptar. Finalmente pulse "Salvar como tarea lote" (en la versión 3.17 para Ubuntu 10.04.XX es "Guardar Configuración"). Seguidamente se activará una ventana, donde se repite nuevamente muchas de las opciones anteriores; o sea, en "gestión de errores" seleccionará "ignorar", en "Al completar" elegirá "Cerrar diálogo en progreso".
Logs
Hay dos casillas en la última ventana, llamadas "Mostrar diálogo en progreso" y "Guardar registro". Puede desmarcarlas, pero no se recomienda. La primera muestra el progreso del Espejo, y se cerrará una vez concluya y la segunda activa los log de la operación, y los guarda (donde decidamos), para luego poderlos consultar y determinar si se presentó algún error. Puede marcar la casilla "límite" y elegir que guarde los últimos 10 registro (cree una carpeta para estos registros). Al finalizar elija "guardar como" y guarde el archivo en su directorio preferido.
En este punto, en su "home" (o donde decidió guardar el archivo), se guardará un archivo de nombre similar a BatchRun.ffs_batch (o SyncSetting.ffs_gui  para la v3.17 en Ubuntu 10.04.XX). El ultimo paso es programarlo en el cron:
Automatizando el Espejo (Desatendido)
En el crontab (no-root no-sudo):
crontab -e
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        
  3. /usr/bin/vim.tiny
Choose 1-3 [2]: 2
Y una vez terminada la tarea...
crontab -l
# m h  dom mon dow   command
* 2 * * 0,3 export DISPLAY=:0; FreeFileSync /home/usuario/backup/backup.ffs_batch
Pero si no está familiarizado con crontab y tiene Gnome, puede utilizar la herramienta Gnome-schedule (GUI de crontab) o también puede usar Webmin (Modulo Sistemas/Tareas Planificadas (Cron), compatible con cualquier versión de Linux.
Ej:  gnome-schedule
sudo apt-get install gnome-schedule
o
git clone git://git.gnome.org/gnome-schedule
Y programar el horario en el que decida correr la sincronización espejo, eligiendo una tarea repetitiva
Para programarla a la hora deseada
Y al final probar su funcionamiento.
Lo más importante (y donde muchos meten la pata)
Sin importar que use el crontab, gnome-schedule, Webmin, algún script o cualquier otro aplicativo para programar la tarea de la ejecución del archivo tipo *.ffs_batch, lo más importante es:
1. Definir quién es el que ejecuta la tarea: Este punto es crucial para evitar el error:
Unable to initialize GTK+, is DISPLAY set properly?
Lo recomendado es que ejecute la tarea como usuario (ni como root, ni con sudo), ya que al ejecutarla como root (o con sudo) es altamente probable que salga el error.
2. Línea de comando en el crontab: En Windows, simplemente se agrega al programador de tareas y listo, pero en Linux muchos creen que con agregar la ruta hacia el archivo en el crontab es suficiente
/home/usuario/backup/backup.ffs_batch
Sin embargo generará error. Esto se debe a que *.ffs_batch es un texto xml asociado a la aplicación FreeFileSync. Por tanto, la forma correcta es:
export DISPLAY=:0; FreeFileSync /home/usuario/backup/backup.ffs_batch
Donde /home/usuario/backup es la ruta de ejemplo donde estamos guardado el archivo y backup.ffs_batch es el nombre del archivo (ambas cosas pueden ser cambiadas a elección del usuario) dentro de la carpeta backup que creamos para almacenar los registros y script.
Nota: Es recomendable que verifique la salida (echo $DISPLAY). Si es 0:0, cambie el comando a:
export DISPLAY=:0.0; FreeFileSync /home/usuario/backup/backup.ffs_batch
Para concluir, es importante que defina los parámetros de ejecución (hora, minuto, día de la semana, etc), cuando se vaya a ejecutar la sincronización desatendida, porque si no define esto con exactitud, puede ocurrir que esta app se ejecute indefinidamente.
Ejemplo de la tarea Espejo en el programador del Webmin
Ejecutando varios scripts de FreeFileSync
Supongamos que programamos varias tareas en el crontab (del usuario crontab -e sin sudo), o sea realizamos varios backups de carpetas y archivos con Freefilesync y que estas tareas se van a ejecutar el mismo día pero de fuentes y en horario diferente. Ejemplo:
1 1 * * * export DISPLAY=:0; FreeFileSync /home/user/backup/tarea1.ffs_batch
1 2 * * * export DISPLAY=:0; FreeFileSync /home/user/backup/tarea2.ffs_batch
Sin importar la hora de programación que le pongamos de diferencia entre tareas, puede suceder que FreeFileSync no haya terminado una tarea programada cuando la otra inicie su ejecución, haciendo colapsar nuestro equipo, si la tarea implica grandes volúmenes de datos. Desafortunadamente no hay manera de que podamos programar FreeFilesync para que espere a que termine una tarea antes de comenzar la siguiente, salvo poner mucha diferencia en el tiempo de ejecución de las tareas. Pero hay una solución más sencilla; echar mano de bash:
#!/bin/bash
### BEGIN INIT INFO
# Provides:          freefilesync
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon
# By:                Maravento.com and Novatoz.com
### END INIT INFO
 killall FreeFileSync >/dev/null 2>&1
 export DISPLAY=:0; FreeFileSync /home/user/backup/tarea1.ffs_batch &
 wait
 export DISPLAY=:0; FreeFileSync /home/user/backup/tarea2.ffs_batch &
 wait
 echo "FreeFileSync done $date >> /home/user/backup/sync.log"
Este sencillo script lo que hace es matar FreeFileSync "por si acaso", para evitar varias instancias corriendo al mismo tiempo, antes de lanzar en background las tareas, esperando a que termine una para lanzar la siguiente, y al terminar manda un mensaje a un .log (los nombres y rutas pueden ser cambiados a voluntad del usuario). No olvide correrlo con privilegios de usuario (no root no sudo) y darle permisos de ejecución, y reemplazar las ordenes de tareas en el crontab con el script, de acuerdo a su programación de tareas habitual. Ejemplo:
@daily /home/user/backup/freefilesync.sh
Con la tecnología de Blogger.