junio 07, 2014

Sincronización Espejo

Update: Mar 24/2017
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).
Y si de prevención de desastres se trata, todos los caminos nos conducen al backup, sin importar su modalidad.
Afortunadamente, Dios ha iluminado a muchos programadores, los cuales han creado magníficas herramientas, que hacen el trabajo sucio por nosotros (muchas de ellas realizan sus tareas de forma automática y desatendida) y que son tantas que 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 nadie es un secreto que la causa de que Linux aún no haya podido superar a Windows en materia de aplicaciones de escritorio, es porque una gran cantidad de aplicaciones que usamos en Windows, por lo general no corren en Linux, ni con Wine, crossover, ni con ningún otro derivado o emulador. Y los que usamos Linux casi siempre tenemos que echar mano de maquinas virtuales con Windows para poder utilizarlas.
Otro problema que enfrentamos son las aplicaciones que se diseñan para ambos sistemas operativos, pero que funcionan diferentes en cada entorno, o no tienen todo el abanico de posibilidades, y casi siempre el afectado es Linux.
Tampoco es un secreto que Linux carece de herramientas de backup GUI que superen a las diseñadas para Windows, especialmente a la hora de hacer sincronizaciones espejo de sistemas "en caliente". Si bien existe un largo listado de aplicaciones que pueden hacer muchos tipos de backup, hoy en día, la sincronización "en caliente", al estilo de dropbox, box.net, pero en discos locales, puede ser una tarea difícil si el entorno es Linux. Y los sistemas de Backup por hardware (Raid, etc) no son una garantía, ya que transfieren los errores a su espejo... Tal vez sea el precio a pagar por usar Software Libre.
Dejando las quejas a un lado y entrando en materia, 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 app 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. Y luego con FreeFileSync completamos el sincronizado en espejo lo cual ahorra mucho tiempo.
Vea otras formas de copiar en Copy the files from the old disk to the new disk
Después de tanto preámbulo, al grano...
Instalando FreeFileSync en Ubuntu
# Cargando el repositorio
sudo add-apt-repository ppa:freefilesync/ffs --yes # desactualizado
# o
sudo add-apt-repository ppa:eugenesan/ppa --yes # mas actualizado
# Actualizando e instalando
sudo apt-get update && sudo apt-get 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:
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: El usuario o root. Este punto es crucial para evitar el Error: Unable to initialize GTK+, is DISPLAY set properly?. Lo normal es que ejecute la tarea como usuario (y no como root), ya que como root es altamente probable que salga este error. También puede deberse a otras causas, por tanto verifique la salida (echo $DISPLAY y en caso de que sea 0:0 export DISPLAY=:0.0)
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 está 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.
Ojo. El crontab del usuario (no de root)
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.
### END INIT INFO
function freefilesync(){
 killall -9 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
Maravento, Actualizado en: 21:52
Escrito por: Maravento Studio
 
© 2017 Maravento. All Rights Reserved | Powered by Maravento
Design by Novatoz and Maravento | Bloggerized By LawnyDesignz
# https://github.com/google/code-prettify