sábado, 22 de agosto de 2009

Sincronizando datos: rsync (1)

Hace bien poco he conseguido algo que tenía ganas de hacer desde hace bastante tiempo: sincronizar fácilmente mi ordenador de trabajo con un servidor que monté en el curro para diversas cosas (página web, bases de datos varias, archivo de bibliografía). ¿El secreto? Un pequeño programa llamado rsync.

Un requisito era que el sistema tenía que ser sencillo, no comercial, libre e incluido en los sistemas UNIX con los que trabajo: MacOS X y Linux (Ubuntu). Rsync está también disponible para Windows, por supuesto.

La situación es ésta: la máquina con Linux es el servidor del que hablaba. Tiene un directorio llamado biblioteca con varios subdirectorios, donde mantengo una selección de documentos (casi todos PDF) a disposición del grupo de investigación: Congresos y simposios (copias de proceedings, abstracts sueltos, etc.), Libros y Tesis (eso mismo), Separatas (artículos científicos procedentes de revistas, casi todas peer-reviewed) y Otros (patentes, legislación y miscelánea). A propósito, directorio es más conocido como carpeta, así que utilizaré esa denominación.

Hasta ahora, mantenía todo esto organizado a mi gusto en mi ordenador personal, pero la necesidad de compartirlo con el resto del grupo me llevó a tener que resolver un problema: ¿cómo actualizar la copia del servidor cada vez que actualizaba mi copia personal? Desde luego, replicar los cambios era imposible (son más de 7 GB, con más de 20000 PDF y otros tantos ítems diversos). Copiar los 7 GB completos, posible con un disco duro portátil, demasiado lento por red. Obviamente, conociendo las posibilidades de hacer una sincronización que transmitiese sólo aquellos elementos nuevos o modificados, me puse a buscar la manera. Tardé poco, ya que ya había hecho algo similar en el pasado para realizar copias de seguridad de otro servidor (aunque esa vez, a un disco duro externo conectado por USB). Rsync sería mi elección.

Hay varias páginas donde se puede obtener información sobre rsync (ejemplo), posiblemente mucho mejor explicado que aquí. Yo voy a describir cómo lo hice, por si alguien quiere hacer algo similar.

En primer lugar, rsync en su modo más básico simplemente compara un grupo de archivos con otro, y copia sólo aquello que ha cambiado. Haciendo una comparación con el "arrastrar para copiar" entre ventanas, es básicamente lo que ocurre cuando arrastramos un grupo de archivos de una carpeta a otra y el sistema copia aquellos que no existen en el destino, preguntando si debe sobreescribir aquellos que tienen el mismo nombre. En esa situación, nosotros miraríamos si la fecha de modificación de los archivos y su tamaño son distintos, y, sólo en ese caso, aceptaríamos la copia. Eso es lo que hace Rsync, sólo que automáticamente, si escribimos algo como:

rsync /myuser/mydata/ /myuser/mydata_copy

Rsyinc compara los archivos de la carpeta mydata con los de mydata_copy y copia los archivos de mydata que no existen en mydata_copy, y aquellos que sí existen pero que tienen distinta fecha de modificación o distinto tamaño. Aquellos archivos que no cumplan esas condiciones no se tocan, por lo que el proceso es muchísimo más rápido que una simple copia, especialmente si hay muchos archivos y se modifican raramente.

Sin embargo, rsync tal cual es muy limitado. Por ejemplo, si un archivo ha sido borrado de mydata, no desaparece de mydata_copy (se supone que quiero sincronizar, es decir, al final ambas capetas deben tener la misma información). Si hay subcarpetas, resulta que sus contenidos no se tienen en cuenta (si creo una subcarpeta en mydata y la lleno con archivos, en mydata_copy aparecerá esa subcarpeta... vacía). Además, las fechas y horas de modificación de los archivos sincronizados cambian a la hora en la que se realizó esa sincronización (igual que otros parámetros del archivo). Obviamente, rsync "tal cual" no me vale para mi propósito, hay que darle algunas órdenes, pero lo dejo para otra entrada.

Os dejo algunos enlaces por si queréis irlo descubriendo vosotros mismos:
rsync web pages
Página de manual de rsync
rsync en la Wikipedia
Algunos ejemplos del uso de rsync

No hay comentarios: