Header Ads

Sincronización Espejo

Ríos 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 es un software de sincronización multiplataforma (cross-platform file synchronization software) compatible con  Linux, MAC y Windows y tal vez una de las pocas herramientas 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.
Instalando FreeFileSync en Ubuntu y derivados desde PPA (descontinuados)
Desde Repositorio PPA
add-apt-repository ppa:freefilesync/ffs --yes
o
add-apt-repository ppa:eugenesan/ppa --yes
Actualizando e instalando
apt-get update && apt-get -y install 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)
Puede programarlo en el crontab pero siempre debe ser en su cuenta (no-root no-sudo). 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
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.
Configuración
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/user/backup.ffs_batch
Sin embargo generará error. Esto se debe a que *.ffs_batch es un texto xml asociado a la aplicación FreeFileSync. Hay dos formas correctas de programarlo en el cron (crontab -e) (tambien puede hacerlo por webmin):
export DISPLAY=:0; /path_to/FreeFileSync /path_to/backup.ffs_batch
o
/path_to/FreeFileSync /path_to/backup.ffs_batch --display=:0.0
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; /path_to/FreeFileSync /path_to/tarea1.ffs_batch
1 2 * * * export DISPLAY=:0; /path_to/FreeFileSync /path_to/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 (donde ffs es el directorio en HOME donde se almacenan los scripts:
#!/bin/bash
export DISPLAY=:0; /path_to/FreeFileSync /path_to/task1.ffs_batch &
wait
export DISPLAY=:0; /path_to/FreeFileSync /path_to/task2.ffs_batch
echo done
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 si quiere puede manda un mensaje de ejecución a syslog. agregando al script:
date=`date +%d/%m/%Y" "%H:%M:%S`
echo "FreeFileSync Start $date" >> /var/log/syslog
No olvide correrlo como 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 /path_to/freefilesync.sh

Actualización 2020 (Ubuntu 18.04/20.04):
A la fecha todos los repositorios PPA están desactualizados (el  Oficial FFS y los alternativos  EugeneSan y  GetDeb), la descarga no está disponible en  SourceForge y hay una alternativa  Flatpak (solo para los que les guste trabajar con este tipo de instaladores).
Por lo anterior lo más recomendable para obtener la última versión de FFS es descargarla del  sitio oficial, descomprimirla y ejecutarla.
(vea el procedimiento en  How to Install FreeFileSync on Ubuntu 16.04/14.04/15.10 y  FreeFileSync – Compare and Synchronize Files in Ubuntu).
La mayoría de los portales recomiendan guardar FreeFileSync en el directorio /opt sin embargo, puede salir el error:
Cannot write file "/opt/FreeFileSync/GlobalSettings.xml".Error Code 13: Permission denied
Una alternativa es ir a Herramienta/Opciones y marcar la casilla "Copiar Permisos de Acceso al Archivo" y luego crear el lanzador en /usr/share/applications/ y ejecutar el comando en el terminal:
sudo sed -i 's/Exec=\//Exec=sudo \//' /usr/share/applications/FreeFileSync.desktop
Otros portales sugieren distribuir los archivos en las rutas originales de instalación desde PPA, pero tal vez esto no sea una buena idea:
/home/user/.FreeFileSync (GlobalSettings.xml  LastError.log  LastRun.ffs_gui  LastSyncs.log)
/usr/share/doc/FreeFileSync
/usr/share/man/man1/FreeFileSync.1.gz
/usr/bin/FreeFileSync
/usr/share/FreeFileSync (ding.wav  gong.wav  harp.wav  Help  Languages  Resources.zip)
Sin embargo nosotros sugerimos algo mucho más sencillo:
Ubicar a FFS en una ruta más amigable ( /home /.local etc). Para automatizar el proceso, hemos preparado el siguiente bash para Ubuntu 18.04 / 20.04, que descarga la versión más reciente, la descomprime en /.local/share y crea el lanzador directamente en el escritorio. Puede ajustar los parámetros del script a sus necesidades y no olvide reemplazar el contenido de la variable ffsuser="your_user" por el nombre de su usuario real. Guárdelo en $HOME/ffs como  ffsupdate.sh dele permisos de ejecución (chmod +x $HOME/ffs/ffsupdate.sh) y ejecútelo en el terminal, sin privilegios (sin sudo - sin root):
# user account
MYUSER="user"

# PATH
ffspath=/home/$MYUSER/.local/share
ffsdir=$ffspath/FreeFileSync
ffsdesktop=$(xdg-user-dir DESKTOP)
ffsfile=/home/$MYUSER/ffs/FreeFileSync.tar.gz
if [ ! -d /home/$MYUSER/ffs ]; then mkdir -p /home/$MYUSER/ffs; fi
# DEL OLD FFSDIR
if [ -d $ffsdir ]; then rm -rf $ffsdir; fi
# DEL OLD FFSFILE
if [ -f $ffsfile ]; then rm -f $ffsfile; fi

# DOWNLOAD
echo "Start FreeFileync..."
url="https://www.freefilesync.org/download.php"
link=$(wget -q $url -O - | grep -Pio '/download/[^"]+Linux[^"]+gz')
version=$(echo $link | sed -r 's:.*FreeFileSync_([0-9]+\.[0-9]+)_.*:\1:')
echo "link: $link"
echo "version: $version"
echo "Download FreeFileync..."
$(wget -q -O $ffsfile https://www.freefilesync.org$link -U "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/63.0.3239.84 Chrome/63.0.3239.84 Safari/537.36")
tar xvf $ffsfile -C $ffspath >/dev/null 2>&1
unzip $ffsdir/Resources.zip -d $ffsdir/Resources/ >/dev/null 2>&1

# DESKTOP LAUNCHER
echo "Create Desktop Launcher..."
cat << EOF | tee $ffsdesktop/FreeFileSync.desktop >/dev/null 2>&1
[Desktop Entry]
Name=FreeFileSync
Type=Application
Terminal=false
Exec=/home/$MYUSER/.local/share/FreeFileSync/FreeFileSync %f
Icon=/home/$MYUSER/.local/share/FreeFileSync/Resources/FreeFileSync.png
Comment=FreeFileSync – Compare and Synchronize Files in Ubuntu
EOF
chmod +x $ffsdesktop/FreeFileSync.desktop

# LAUNCHER PLANK (Optional)
echo "Create Plank Launcher..."
echo "[PlankDockItemPreferences]
Launcher=file:///usr/share/applications/FreeFileSync.desktop" > ~/.config/plank/dock1/launchers/FreeFileSync.dockitem
cat << EOF | sudo tee /usr/share/applications/FreeFileSync.desktop >/dev/null 2>&1
[Desktop Entry]
Name=FreeFileSync
Type=Application
Terminal=false
Exec=/home/$MYUSER/.local/share/FreeFileSync/FreeFileSync %f
Icon=/home/$MYUSER/.local/share/FreeFileSync/Resources/FreeFileSync.png
Comment=FreeFileSync – Compare and Synchronize Files in Ubuntu
EOF
sudo chmod +x /usr/share/applications/FreeFileSync.desktop

echo "Done"
Nota: Para cambiar el sistema sistema operativo (por Debian u otra versión de Ubuntu) modifique línea "grep".
Tenga presente que estas nuevas versiones "portables" (no PPA) presentan algunos problemas en su aplicativo (no tienen disponibles algunas opciones del menú, tales como "close the results dialog after sync" o "on completion close progress dialog", etc. etc.), pero esto no impide que se pueda configurar correctamente.
En estos casos es mejor crear un archivo batch programado para acceder a estas funciones.
Recuerde que ahora debe especificar el nuevo path en el cron (no olvides cambiar "user" por tu usuario del sistema):
crontab -l
# m h  dom mon dow   command
* 2 * * 0,3 export DISPLAY=:0; $HOME/.local/share/FreeFileSync/FreeFileSync /path_to/backup.ffs_batch
Otra de las grandes ventajas a este estupendo programa es la sincronización en la nube.
Autenticando FreeFileSync con Google Drive

FreeFileSync sincronizando con nuestra cuenta en GDrive
Por el momento solo incluyen FTP/SFTP y Google Drive. Esperemos que en un futuro no lejano incluyan otros servicios en la nube.

Para mayor información sobre visite en el foro oficial:
Problem with menu "Run a command after synchronization
Option "close the results dialog after sync" not appears

Actualización 2022
A partir de la versión 11.6 FreeFileSync cambió el instalador a un archivo  .run, por tanto el script anterior no es funcional. Solo hay que descargar el programa, descomprimirlo y ejecutarlo con doble click y seguir las instrucciones en pantalla. 
O puede usar el siguiente script y ejecutarlo en terminal con privilegios sudo:
sudo /path_to/ffsupdate.sh
Nota: modificaciones sin previo aviso.
#!/bin/bash
echo "Starting FreeFileSync Update..."

# checking script execution (optional)
if pidof -x $(basename $0) > /dev/null; then
  for p in $(pidof -x $(basename $0)); do
    if [ "$p" -ne $$ ]; then
      echo "Script $0 is already running..."
      exit
    fi
  done
fi

# checking dependencies (optional)
pkg='expect tcl-expect libnotify-bin'
if apt-get -qq install $pkg; then
    echo "OK"
else
    echo "Error installing $pkg. Abort"
    exit
fi

# ffs update
ffsfile=FreeFileSync.tar.gz
url="https://www.freefilesync.org/download.php"
link=$(wget -q $url -O - | grep -Pio '/download/[^"]+Linux[^"]+gz')
version=$(echo $link | sed -r 's:.*FreeFileSync_([0-9]+\.[0-9]+)_.*:\1:')

echo "link: $link"
echo "version: $version"
echo "Download FreeFileync..."
$(wget -q -O $ffsfile https://www.freefilesync.org$link -U "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/63.0.3239.84 Chrome/63.0.3239.84 Safari/537.36")
tar xvf $ffsfile >/dev/null 2>&1
mv FreeFileSync*.run FreeFileSync.run >/dev/null 2>&1
chmod +x FreeFileSync.run
echo OK

echo "Run Update..."
/usr/bin/expect << EOF
set timeout -1
log_user 0
spawn ./FreeFileSync.run --accept-license
log_user 1
expect -exact "to begin installation:"
send -- "y\r"
expect -exact "https://freefilesync.org/donate\r
\r"
EOF

# Deleting downloaded files (optional)
rm -fv FreeFileSync*
echo "FreeFileSync Update Done: $(date)"
notify-send "FreeFileSync Update Done" "$(date)" -i checkbox
FreeFileSync es un excelente programa que permite hacer un montó de cosas, incluso sincronizar carpetas al estilo nube, similar a como lo harían los clientes gdrive, mega, etc (obviamente solo con gdrive por el momento), usando RealSync.
Done 1 USD al proyecto Freefilesync y obtendrá la versión completa de este magnífico programa y ayudará a mantenerlo.
Con la tecnología de Blogger.