Unison File Synchronizer

Cuando se tienes más de una estación de trabajo, como es mi caso, sobremesa y portátil, mantener la información actualizada consistia hasta hace poco en copiar el contenido del portátil al sobremesa , y viceversa. Por suerte para nosotros eso se terminó.

Unison me permite sincronizar directorios, de manera local o remota y mantener la información actualizada, añadiendo las diferencias, o cambios producidos en el directorio, como bien puede ser, la modificación de un archivo o su eliminación. Lo bueno que tiene Unison frente aplicaciones como rsync, es que la sincronización se realiza de forma bilateral, y al contrario que rsync , el cual lo realizaba en un solo sentido. Es decir, lo que yo modifique en una maquina se modificara en la otra también cuando haga la sincronización. En este documento hare referencia a Selkis como mi portáltil y Osiris como mi equipo de sobremesa.

  1. Instalación y configuración

    La instalación en sistemas Debian y derivados, bastará con hacer un :

    #aptitude install unison

    Unison se puede configurar de varias maneras, yo he elegido trabajar sobre SSH aunque también se pueden emplear Sockets. Lo primero es crear un archivo diciendole que directorios nos interesa sincronizar asi, como el servidor con el cual queremos sincronizar. Para Selkis he creado el siguiente archivo :

    $ emacs -nw ~/.unison/osiris.prf
    La estructura de este archivo es la siguiente:
    osiris.prf

    auto = true
    batch = true
    root = /home/nephyer
    root = ssh://osiris
    path = Programacion
    path = Facultad
    ignore = Path */.directory
    ignore = Path */Olds
    ignore = Name {olds,*~}
    log = false


    Estas son las opciones que tengo puestas, y las cuales paso a describir a continuación:

    auto Con valor a true no pide confirmación para modificaciones no conflictivas.
    batch El valor a true indica que no haga ninguna pregunta, elimina el modo interactivo, un tanto molesto para mi propósito.

    Estas opciones las he escogido con estos valores porque me interesa que este todo automatizado mediante un script que describiremos más adelante, y al que posteriormente añadiremos a una entrada al “crontab”.
    root Hay rutas relatitvas, que son aquellas que hacen referencia a esa ruta dependiendo donde se ejectue el comando ,es decir buscará esa ruta desde donde se llame a unison, con las rutas absolutas se parte del raiz del sistema de archivos, y dará igual donde ejecute el comando, con lo cual yo veo más conveniente usar rutas absolutas, así no se depende desde donde se llame a unison. El otro “root” que se le pasa es el sitio remoto, o local con el cual sincronizar.

    path Como su nombre indica, son los directorios , o carpetas que se desean sincronizar.
    ignore Se le pasa una expresión regular, la cual unison procesará e ignorará lo que coincida con dicha expresión, en mi caso que omita los directorios ocultos – ignore = Path */.directory – o los que terminan en algo.extension~.

    log Desactivado no crea log de las modificaciones.

    Ahora cada vez que realicemos una modificación en Selkis simplemente ejecutare :

    $ unison osisris

    Resulta que al trabajar sobre SSH, nos pedirá la contraseña cada vez que queramos sincronizar, lo cual es molesto si se pretende automatizar la sincronización. Por ello el siguiente paso explica como configurar SSH para que no nos pida la contraseña:

  2. Evitando el password en SSH

    Primero que todo debemos crear una clave pública y otra privada para ssh, en el cliente, en nuestro caso Selkis el portátil. Para ello ejecutaremos el comando que se indica a continuación:


    nephyer@selkis:~$ ssh-keygen -t dsa


    Generating public/private dsa key pair.
    Enter file in which to save the key (/home/nephyer/.ssh/id_dsa):
    Created directory '/home/nephyer/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/nephyer/.ssh/id_dsa.
    Your public key has been saved in /home/nephyer/.ssh/id_dsa.pub.
    The key fingerprint is:
    2d:b3:67:9a:5b:72:9c:c8:c4:68:fc:42:c9:f6:0c:13

    La frase que pide de entrada dejarla en blanco.Una vez hemos realizado este paso, sólo hemos de copiar la clave pública a nuestro servidor, o equipo remoto, y añadirlo archivo .ssh/authorized_keys, para ello bastaria con hacer un simple

    cat id_dsa.pub >> authorized_keys

    Donde id_dsa.pub es nuestra clave pública creada con el comando anterior, la cual se encuentra ubicada en /home/usuario/.ssh/. Yo he escogido un modo más elegante, y del cual disponemos:

    ssh-copy-id -i .ssh/id_pub.keys nephyer@osiris

    Con esto conseguimos el mismo efecto y no necesitamos llevar la clave pública a cada máquina con la que queramos sincronizar.

  3. Automatizando la sincronización

    Ahora simplemente ejecutando desde el terminal

    $ unison osiris

    obtendriamos la sincronización de los directorios , un ejemplo de la salida producida en el portátil es:


    nephyer@selkis:~$ unison osiris
    Contacting server...
    Looking for changes
    Facultad/2005-2006/ARS/Practicas ARS
    Facultad/2005-2006/LP/workspace/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml
    Programacion/hathor/C++/Problemas Examenes/dni.cpp
    Waiting for changes from server
    Reconciling changes
    local osiris
    deleted chgd dir Facultad/2005-2006/ARS/Simulador Routers
    No updates to propagate

    Ahora sólo nos queda automatizar todo este proceso, simplemente me he creado un script el cual ejecuta el comando anterior , y me informa de si su ejecución tuvo exito. Para ello es importante conocer los valores de salida de unison, los cuales se nos facilita en la página de la apliacción.

    Exit Codes

    * 0: successful synchronization; everything is up-to-date now.
    * 1: some files were skipped, but all file transfers were successful.
    * 2: non-fatal failures occurred during file transfer.
    * 3: a fatal error occurred, or the execution was interrupted.

    A partir de esta información ya podemos realizar el script :


    # unison.sh
    #
    #!/bin/bash
    unison osis 2>&/dev/null


    case "$?" in
    0|1)
    kdialog --msgbox "Sicronizacion de archivos correcta."
    ;;
    *)
    kdialog --error "Fallo en la sincronizacion tipo: $? "
    exit 1
    ;;
    esac


    exit 0

    El script se puede modificar y tratar los otros codigos de salida, no han de ser estos necesariamente. Ahora ya solo nos queda introducir una entrada en el cron, para que se ejecute. Como pasao gran parte de mi tiempo en fuera de casa, me interesa ponerlo a una hora que este , sino no servira ;) , así que la mejor hora es la de cenar, por ello cuando ejectuemos :

    $crontab -u usuario -e

    y añadimos la linea:


    # Ejectua el Script de sincronizacion todos los dias de la semana, de todos los meses, a las 21:30.
    30 21 * * * /home/nephyer/Scripts/unison.sh
    No me he parado a explicar el script ni el uso de cron, por qué sino esta entrada sería demasiado larga, asi que Googleando un poco se encuentra todo. Bueno, hasta la próxima.


Manual de Unison

3 comentarios para “Unison File Synchronizer”

  1. Santi Dice:

    Solo decir que he llegado a esta página buscando una solución a un problemilla que tenia y he quedado sorprendido por lo bien planteados que estan los post, utiles, tocando cosas de interes y todo con Debian. Ademas la foto del fronton la encuentra bastante bonita y evocadora. Veo que desde el año pasado que no piblicas. Ten pondré en mis lista de feeds con la esperanza de ver alguna anotación nueva.
    Saludos.

  2. bsanpi Dice:

    Hola

    Estoy intentando poner como sistema de sincronización entre servidores remotos, unison. Hasta ahora me parece que es bastante bueno, por lo rápido de instalar, configurar y muy facil, pero no consigo que me transfiera los ficheros comprimidos con un tamaño superior a 2 GB, no se si debo indicarle en alguno de sus parámetros algo para que me omita esto y los transfiera, o no se puede hacer.

    Ah¡ me ha parecido muy buena tu forma de explicarlo, clara y concisa.

    Saludos

  3. Athorrante Dice:

    Loco, muy bueno, has simplificado todo el laburo q me lleva sincronizar unas 15 carpetas distintas, Saludos!!

Escribe un comentario