Seguramente todos nos encontramos con el problema de querer sincronizar directorios de varios ordenadores, y además que las modificaciones en uno de ellos se propague automáticamente a los demás. Si te has dado cuenta de la restricción principal del rsync (hay un «maestro» y la sincronziación es unidireccional), lo tuyo es el unison.
Unison permite mantener actualizados árboles completos en el mismo ordenador (diferentes directorios) o en ordenadores remotos (usando ssh u otros métodos). Además propaga las modificaciones en ambos sentidos. Así es posible mantener sincronizados casi los ordenadores que querramos. Si no hay conflictos (i.e. el mismo fichero modificado en ordenadores distintos y que es imposible hacerles un «merge»), todos tendrán las mismas copias.
Sincronización remota
El unison me soluciona perfectamente mi problema de tener sincronizado mi ordenador de escritorio de casa con portátil (minime) y con el de mi despacho (pcgallir). En los ejemplo sinzcronizo el directorio «Proyectos» y «Presentacions». La solución es muy sencilla, directorio a directorio y usando el ssh desde mi $HOME:
unison Proyectos ssh://minime/Proyectos
Es es equivalente a:
unison /home/gallir/Proyectos ssh://minime//home/gallir/Proyectos
Si no queremos que nos pregunte por cada opción, podemos hacer por ejemplo:
unison -auto -batch Proyectos ssh://minime/Proyectos
IMPORTANTE: El unison borra los ficheros eliminados en uno de los ordenadores que sincroniza, si queréis mantener copia de los borrados, mirad la opción -backup en la documentación.
Perfiles
Con lo anterior es suficiente para sincronizar entre varios ordenadores, pero tiene algo aún más potente, los perfiles. Con ello es posible crear un perfil para cada ordenador con el queramos sincronizar. Los perfiles se crean en $HOME/.unison/nombre_perfil.prf. Por ejemplo, para sincronizar con minime tengo definido los siguiente:
$ cat ~/.unison/minime.prf
auto = true
batch = true
root = /home/gallir
root = ssh://minime
path = Proyectos
path = Presentacions
ignore = Path */.directory
ignore = Path */Olds
ignore = Name {olds,*~}
Ahora sólo hay que ejecutar:
unison minime
Supongo que véis claramente que se especifica dos veces root para indicar el origen y destino, y luego path las veces que queráis. Los ignore ya os imagináis, es para no copiar ficheros o directorios completos. El unison trabaja con expresiones regulares, permite especificar «Name» donde se toma en cuante sólo el nombre del fichero, Path para especificar el nombre completo, o directamente regexp para especificar la expresión regular.
Abajo es muestro la salida de un sincronziación con el perfil anterior justo después de agregar un fichero (novembre.sxw).
$ unison minime
Contacting server…
Looking for changes
Presentacions
Presentacions/PReina
…
Proyectos/Campos2004
Waiting for changes from server
Reconciling changes
local minime
new file —-> Proyectos/SaNostra/novembre.sxw
Propagating updates
UNISON started propagating changes at 17:59:51 on 11 Nov 2004
[BGN] Copying Proyectos/SaNostra/novembre.sxw
from /home/gallir
to //minime//home/gallir
[END] Copying Proyectos/SaNostra/novembre.sxw
UNISON finished propagating changes at 17:59:51 on 11 Nov 2004
Saving synchronizer state
Synchronization complete
Si os hacéis la pregunta ¿se pueden mantener sincronizados varios ordenadores en cadena? La respuesta es sí, sin problemas, es «transitivo». Y seguramente también os preguntáis si usa un algoritmo como el rsync para minimizar las transferencias de datos, pues sí.
Backups
Este es el caso más sencillo el unison, y muy útil para hacer esos backups tan habituales entre discos o particiones. Por ejemplo:
unison /home/gallir /disk2/home/gallir
Seguramente no queréis que se hagan copias de algunos ficheros, o asegurar que siempre «manda» la versión del original, también podéis crear perfiles para ello, por ejemplo:
$ cat ~/.unison/backup.prf
auto = true
batch = true
root = /home/gallir/
root = /disk2/home/gallir/
prefer = /home/gallir/
ignore = Path */.directory
ignore = Path */Olds
ignore = Name {olds,*~,tmp,temp,.*}
Automatizar en el crontab
Ahora sólo queda automatizarlo llamándolo desde el crontab. Por ejemplo:
31 6 * * * unison backup
0 7 * * * unison minime
En el caso del backup está claro que casi no hay mejora posible (además de redireccionar toda la salida a /dev/null, o indicar la opción -silent del unison, pero es que todavía estoy controlando que funcione correctamente), pero en el caso de sincronizar con el portátil… ¿qué pasa si no está conectado o está apagado? Pues muy fácil, para eso ya somos unos manitas con los script en shell:
0 7 * * * if ping -c 1 minime; then unison minime; fi
Et voilà… y nunca más preguntes como se puede hacer para recuperar ficheros borrados en ext3 🙂
Este post ha sido traido de forma automatica desde https://web.archive.org/web/20140625063149/http:/bulma.net/body.phtml?nIdNoticia=2113 por un robot nigromante, si crees que puede mejorarse, por favor, contactanos.