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.
- Instalación y configuración
La instalación en sistemas Debian y derivados, bastará con hacer un :
#aptitude install unisonUnison 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 osisrisResulta 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:
- 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_keysDonde 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@osirisCon esto conseguimos el mismo efecto y no necesitamos llevar la clave pública a cada máquina con la que queramos sincronizar.
- Automatizando la sincronización
Ahora simplemente ejecutando desde el terminal
$ unison osirisobtendriamos 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 -ey añadimos la linea:
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.
# 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
Escrito por nephyer
Escrito por nephyer
Escrito por nephyer