Unison: Sincronización y backups en Linux

Por norma general cuando quiero realizar copias de seguridad o simplemente sincronizar carpetas o ficheros, suele utilizar rsync además de ssh si existe otro servidor destino u origen. Unison, la herramienta de que vamos a hablar en este artículo, nos promete realizar sincronizaciones entre dos puntos, de forma eficaz.

Primero de todo veamos en que consiste Unison: Se trata de una herramienta de sincronización de archivos bidireccional que se ejecuta en sistemas operativos tipo Unix (incluidos Linux, macOS y Solaris), además de Microsoft Windows. Permite que dos réplicas de una colección de archivos y directorios se almacenen en diferentes hosts (o diferentes discos en el mismo host), se modifiquen por separado y luego se actualicen propagando los cambios en cada réplica a la otra.

Lo cierto que para esta entrada he tenido que investigar un poco, ya que, por lo menos en Centos 7 y en Debian 10, no incluye página de man una vez instalada la herramienta. Al final de la entrada listaré las fuentes consultadas.

Instalación de Unison en GNU/Linux

Por defecto esta herramienta no viene preinstalada, por lo que debemos realizar la instalación. Por suerte el paquete viene incluido en la mayoría de los repositorios. La herramienta también tiene una versión de escritorio (utiliza GTK), pero esa no la instalaremos, solo la de línea de comandos.

Instalación de Unison en RHEL y Centos

  1. sudo yum -y install Unison240

Instalación en Debian 10

  1. sudo apt install unison

Instalación en Ubuntu

  1. sudo apt install unison

Instalación en Arch y derivadas

  1. sudo pacman -S unison

Una vez instalada la herramienta ya podemos empezar a trabajar con ella.

Ejemplos básicos de uso de Unison

Su forma básica es la siguiente:

  1. unison origen/ destino/

En la imagen podemos ver un ejemplo de su uso:

El mensaje de advertencia indica que está ejecutando una sincronización por primera vez o que los archivos de almacenamiento no existen.

A continuación veamos el resultado una vez he añadido unos ficheros al origen:

Muestra de sincronización

Por defecto la sincronización es interactiva con el usuario, esto es, nos hará una serie de preguntas. Debemos confirmar cada uno de los cambios propuestos. Para evitarlo podemos utilizar los parámetros «-auto» o «-batch» En cualquier caso debemos añadir «yes» al finalizar.

También se muestra un resumen de las operaciones: las flechas muestran que se está transfiriendo un archivo. Al final de todas las operaciones, se muestra un resumen.

Modificar ficheros de preferencias

Los archivos de preferencias son la forma más segura de usar unison. Las preferencias se almacenan en el fichero .unison en el directorio de inicio, con nombres que terminan con una extensión .prf. Por normal general, tendríamos un default.prf que se usa cuando no se especifica una preferencia con el comando.

En mi caso:

  1. david@servdebian10-1:~$ ls -la .unison/default.prf
  2. -rw------- 1 david david 25 ago 19 11:14 .unison/default.prf

Para crear un perfil a nuestro gusto, debemos eguir estos cuatro pasos básicos utilizando líneas comentadas para ayudar a realizar un seguimiento de las secciones:

Podemos empezar con la etiqueta «label=» en esta podemos añadir una descripción con información sobre que vamos a sincronizar.

Listamos el primer directorio raíz. Por ejemplo, para el usuario david:

  1. #Root (source)
  2. root= /home/david

Indicamos el segundo directorio raíz al que se sincronizarán los archivos. En una línea separada, también podemos agregar cualquier argumento ssh, como el puerto a usar y la opción de ejecutar en modo silencioso. Siempre utilizando «sshargs=» Por ejemplo:

  1. #Target Directory
  2. root=ssh://otro-servidor /home/david/destino
  3. sshargs=-p22
  4. sshargs=-q

Listamos, los subdirectorios y archivos del directorio raíz o la fuente para incluir en la operación. Por ejemplo:

  1. #Directories and Files to include
  2. path=Descargas
  3. path=Imagenes

Listamos los archivos a ignorar. Aquí pueden ser muy útiles las expresiones regulares:

  1. #Files to Ignore
  2. ignore=*.tmp

Como los archivos se sincronizan en el segundo directorio raíz, estos se sobreescribirán. Como precaución, podemos hacer una copia de seguridad de los archivos originales en el segundo directorio raíz en otra ubicación, utilizando los siguientes campos. Si la ubicación de respaldo se especifica como local, los archivos de respaldo se almacenan en el segundo directorio raíz. En cambio, si la especificación es central, los archivos de respaldo se almacenan en otro directorio que se especifica en el directorio de backup.

Los ficheros de backup utilizan la extensión «.bak.VERSION.FILENAME» La versión comienza con 1 para la más reciente y puede limitarse en número usando el campo «maxbackups=«. El nombre del archivo es el nombre del archivo original, incluida cualquier extensión. Esta convención se puede anular utilizando los campos «backupprefix=» y «backupsuffix=«, uno de los cuales debe contener la versión. Por ejemplo:

  1. #Backups
  2. backuplocation=central
  3. backupdir=/home/david/backups
  4. backup= Name *
  5. backupprefix=$VERSION.
  6. backupsuffix=
  7. maxbackups=10

Unison puede también utilizar comandos externos como «diff» o «merge»

Podemos habilitar el registros de actividad de la herramienta, añadiendo:

  1. #Log
  2. log=true

Laboratorio de pruebas

Para probar la herramienta con algo en «producción» he probado de sincronizar los ficheros que tengo en un servidor remoto, que da servicio de Minecraft, para mis hijos y sus amigos.

Con la siguiente configuración:

  1. # Unison preferences file
  2. label=Pruebas de Unison
  3.  
  4. #Root (source)
  5.  
  6. root=ssh://minecraft@servubuntu01.bitsandlinux.com//home/minecraft
  7. sshargs=-p22
  8. sshargs=-q
  9.  
  10. #Directorio objetivo
  11. root=/home/davidochobits/backup/minecraft/
  12.  
  13. #Directorios y ficheros a incluir
  14. path=world
  15. path=server.properties
  16. path=logs
  17. path=run.sh
  18. path=server1
  19.  
  20. #Ficheros a ignorar
  21.  
  22. #Backups
  23. backuplocation = central
  24. backupdir = /home/davidochobits/backup/minecraft
  25. backup = Name *
  26. backupprefix = $VERSION.
  27. backupsuffix=
  28. maxbackups=10
  29.  
  30. #Log
  31. log=true

Previamente he realizado intercambio de llaves entre mi portátil y el servidor.

Programar la sincronización

Lo ideal, en un entorno productivo es realizar la programación de la sincronización de ficheros y carpetas, para ello programaremos un trabajo con Cron

De la siguiente manera:

  1. #Primero escribimos:
  2. crontab -e
  3. #Y añadimos la programación:
  4. * 5 * * * /usr/bin/unison &> /dev/null

Esto es, todos los días, a las cinco de la mañana se realizará un backup de los ficheros del servidor (en el caso que donde se guarde el backup este encendido a esa hora, claro)

Nos ha quedado pendiente hablar de la interfaz gráfica de la aplicación, pero eso será otro día 🙂

Y esto es todo, espero que la información os sea de utilidad en algún momento.

Fuentes consultadas

Web de Philip J. Guo – Unison File Synchronizer: Liberation through Data Replication
ArchWiki – Unison
Twiki.org – Replication Using Unison
Superuser.com – How to make unison ignore all files with .swp extension