Sincronización bidireccional entre directorios en Ubuntu, Android, etc

Una de las operaciones mas habituales que suelo realizar o que tengo programada es la sincronización que hago con rsync. Lo que habitualmente suelo hacer es una copia exacta de lo que tengo en mi equipo con el NAS. De esta forma, si mi portátil se pierde, o le sucede algo, siempre tengo la opción de recuperarlo. El problema es cuando lo que quieres es que el NAS no sea simplemente una copia de seguridad, sino sea el centro de las operaciones. De esta manera tus diferentes equipos se sincronizarán con el NAS. En estos casos rsync se queda corto, puesto que necesitas una sincronización bidireccional.

El funcionamiento de rsync dependiendo de como lo hayas configurado, puede obviar sobrescribir archivos nuevos en el repositorio remoto. Pero, en ningún caso, copiará esos archivos en el repositorio de origen. El siguiente problema, es a la hora de borrar archivos, no sabrá exactamente que archivos borrar. Puedes correr el riesgo de borrar lo que no quieres.

Una interesante solución para realizar la sincronización bidireccional es osync. Se trata de un script implementado precisamente para realizar sincronización bidireccional con tolerancia a fallos, reanudación, copia de seguridad de elementos borrados y copia de seguridad en caso de conflictos. Para realizar la sincronización utiliza rsync y puede ser ejecutada tanto de forma manual, como utilizando cron, o programada para ser realizada en el caso de que se produzca un cambio.

Sincronización bidireccional entre directorios

Sincronización bidireccional

Osync utiliza un sistema de sincronización del tipo maestroesclavo. Puede sincronizar de directorio local a directorio local, o de directorio local a directorio remoto. Por definición, la copia maestra está siempre en el directorio local donde se ejecuta osync. Utiliza un sistema de control de archivos pid para evitar problemas de sincronización concurrente, asegurándonos de que un proceso a terminado antes de que comience otro. Esto no impide que realicemos varias sincronizaciones simultáneas, pero evita hacerlas sobre el mismo directorio.

Uso y funcionamiento

Osync dispone de tres modos de funcionamiento, rápido, con archivo de configuración y en modo demonio. La ventaja de la sincronización con archivo de configuración es que te da mas posibilidades. Es importante utilizar dobles comillas (“) a la hora de definir los directorios a sincronizar.

Un ejemplo de uso en modo rápido sería el siguiente,

osync.sh --initiator="/path/to/dir1" --target="/path/to/remote dir2"

Un problema con el que te puedes encontrar es con que el directorio .osync_workdir no se pueda modificar porque no pertenece al usuario que hace la sincronización. Modifícalo y haz que éste sea el propietario, y de esta manera obviarás esta situación. En principio, esto no te debe suponer ningún problema, porque este directorio solo es para uso de osync.

Archivo de configuración

El modo con archivo de configuración es brutal en el sentido de que te permite definir hasta al mas mínimo detalle del proceso de sincronización bidireccional. Evidentemente se definen los directorios como en el caso de la sincronización rápida, pero además te permite definir muchos parámetros adicionales como,

  • crear directorios en el caso de que no existan
  • confirmar el espacio mínimo libre que debe existir tanto en el directorio origen como en el directorio destino.
  • si la sincronización en el directorio remoto es como administrador.
  • un listado de directorios a incluir o excluir
  • un listado de archivos a incluir o excluir
  • si se tienen que preservar los permisos
  • si se copian enlaces simbólicos o se transforman

Monitorizando directorios con sincronización bidireccional

Osync puede funcionar en modo de monitorización de archivos. En este modo, osync está vigilando lo que sucede en el directorio de origne, de forma que si se produce cualquier cambio, se realiza una sincronización automática con la réplica destino. De esta forma, evidentemente, no es necesario programar cron.

Para funcionar en el modo de monitorización hace uso de la utilidad inotifywait, por lo que tendrás que instalar el paquete inotify-tools. Puedes instalarlo haciendo clic en inotify-tools o bien, ejecutando el siguiente comando en un terminal,

sudo apt install inotify-tools

Una vez hecho esto, solo tienes que ejecutar el siguiente comando,

osync.sh osync.conf --on-changes

Evidentemente, tendrás que tener el archivo osync.conf convenientemente configurado, para que monitorice el directorio de origen, y sincronice con el de destino.

Una de las ventajas del uso de la monitorización de directorios para la sincronización bidireccional, es el tiempo de espera. Y es que, cada vez que realizas una modificación no se sincroniza inmediatamente, si no que espera un tiempo, que es configurable, desde que realizas la modificación hasta que se sincroniza. De esta manera, si durante este tiempo tu realizas mas cambios, estos quedarán recogidos en esta sincronización. Evidentemente esto tiene el problema de que si durante este tiempo no estarán sincronizados ambos directorios, pero, como he comentado, esto es configurable.

Sincronización bidireccional en modo demonio

Si vas a utilizar osync para realizar la monitorización de algún directorio de forma habitual, deberías pensar en instalarlo como un servicio del sistema.

Si te decides a ello, debes ejecutar el script install.sh que se encuentra en el directorio que descargarte, y habilitar el servicio.

Podrás monitorizar tantos directorios origen como archivos de configuración tengas en /etc/osync. De esta manera cada archivo de configuración se controlará como un servicio separado.

Para activar una monitorización, correspondiente a un archivo de configuracion concreto, por ejemplo miconfiguracion.conf ejecutaremos la siguiente orden,

systemctl start osync-src@miconfiguracion.conf

Si queremos detener el servicio, ejecutaremos,

systemctl stop osync-src@miconfiguracion.conf

Si además queremos que esté disponible en el arranque, ejecutaremos esta otra orden,

systemctl enable osync-src@miconfiguracion.conf

Por último, si queremos deshabilitar el servicio, para que no se inicie con el arranque del sistema, tan solo tendremos que ejecutar la orden,

systemctl disable osync-src@miconfiguracion.conf

Instalación

osync es un script realizado en bash, y que funcionará correctamente para la versión de bash 3.2 o versiones superiores. Además del propio script, necesitarás algunas dependencias para que funcione correctamente. Lo cierto es posiblemente no las necesitas todas, pero para evitarte problemas lo mejor es su instalación. Por ejemplo, si no vas a realizar monitorización de directorios, el paquete inotify-tools, no lo necesitarás.

En cualquier caso, para instalar las dependencias necesarias, ejecuta la siguiente orden,

sudo apt install rsync openssh-client sshpass inotify-tools

En Android, si utilizas Termux, un increible y potente terminal para Android, sobre el que escribí hace algún tiempo, ejecuta el siguiente comando,

apt install rsync inotify-tools

Comentar que Termux no permite la conexión vía ssh con contraseña, sino que la tienes que hacer con clave.

Descargando osync

Una vez ya tenemos nuestras dependencias instaladas, toca descargar, instalar y configurar osync. PAra ello, tenemos dos opciones, o bien descargamos utilizando wget o utilizando git. En el primer caso, ejecutaremos las siguientes órdenes,

wget http://netpower.fr/projects/osync/osync.v1.2.tar.gz
tar xvf osync.v1.2.tar.gz

En el segundo caso,

git clone -b "stable" https://github.com/deajan/osync

Una vez descargado, ejecutaremos la orden,

bash ./install.sh

Este script de instalación copia osync a /usr/local/bin/ y crea /etc/osync con algunos archivos de configuración de ejemplo, que podrás utilizar para tus crear tus propios archivos, en el caso de que quieras utilizar osync como servicio. Además copiará los archivos que necesita el demonio* a /etc/init.d/o a /usr/lib/systemd/system/ y /etc/systemd/user/, dependiendo de tu distribución.

Desistalar osync

Para desistalar osync ejecuta la siguiente orden,

bash ./install.sh --remove

Y por supuesto, borrar todos los archivos que descargaste para realizar la instalación. Además de las dependencias. Aunque en este segundo caso, debes tener cuidado por si hay algún otro paquete que depende de ellas.

Conclusiones

Solo tengo palabras de agradecimiento y de admiración hacia Orsiris de Jong, desarrollador de este proyecto. La idea es brillante, y el funcionamiento impecable.

Así por ejemplo, ahora que estoy preparando una actualización de esta página, y desarrollando un nuevo proyecto, lo hago en local, y lo voy sincronizando a los repositorios remotos, donde voy viendo el resultado y el desempeño de todo esto. Con el uso de la monitorización, me tengo que despreocupar completamente de que todo esté actualizado, puesto que osync se encarga de ello.

En estos últimos años, he utilizado diferentes soluciones para sincronizar mis diferentes equipos. Aplicaciones con Syncthing, Resilio, etc. El problema, es que son servicios que te consumen recursos, y solo los utilizas puntualmente. Así que terminaba por activarlos puntualmente cuando los utilizaba. O bien, los iba sustituyendo por rsync que en estos últimos tiempos, se ha convertido en mi aliado fiel para la realización de copias de seguridad.

Osync, permitiendo la sincronización bidireccional, me permite olvidarme definitivamente de estos servicios, y dejarlo todo en manos de esta solución.

Si estás habituado al uso de la terminal, y utilizas alguno de los servicios que te he comentado, te recomiendo encarecidamente que le des una oportunidad a osync. Pruébalo y dame tu opinión. Sinceramente, creo que es una excelente herramienta para tener nuestros equipos sincronizados, y despreocuparnos de copias de seguridad, porque estamos ante una solución sencilla y robusta.


Más información,

  • inclusa

    Muchas gracias por la explicación.

    Sin duda muy intresante, parece que se trata de una arquitectura cliente-servidor.

    Está por ver cómo gestionará las decisiones de direccionalidad en la sincronización. Algunos servicios (Syncthing) dejan varias copias del mismo archivo con diferentes versiones para después resolver a mano.

    Parece que la sincronización se realiza mediente un túnel ssh.

    Veremos si tiene alguna ventaja respecto a **Unison** un servicio ya veterano que te pregunta la direción en la que sincronizar un archivo en caso de conflicto.