jueves, 27 de agosto de 2009

Sincronizando datos: rsync (2)

En el post anterior lo dejamos con lo básico, pudiendo transferir los archivos nuevos, pero sin sincronizar realmente. Veamos algo de lo que puede hacer rsync.

Lo primero es comentar una curiosidad que resulta crucial a la hora de decirle a rsync lo que tiene que copiar. Recordemos la forma básica del comando:

rsync /myuser/mydata/ /myuser/mydata_copy

Si os fijáis, puse una barra al final del nombre de la carpeta origen (/). Por si no lo sabéis, en Unix se utiliza la barra inclinada (/) para separar los nombres de las carpetas, mientras que en Windows se utiliza la barra invertida (\). Pues bien, el poner la barra final le dice a rsync que copie el contenido de la primera carpeta en la segunda. ¿Y si no ponemos la barra? Pues rsync copiará la carpeta misma. Es decir, en este caso, nos aparecerá la carpeta mydata dentro de mydata_copy, tal que así: /myuser/mydata_copy/mydata

Continuemos con la historia. Recordad que quiero sincronizar mi biblioteca personal con la de un servidor, de manera que la copia del servidor sea idéntica a la de mi ordenador. Entonces, lo primero será indicar a rsync que debe sincronizar con otra máquina. Veamos:

rsync /myuser/biblioteca/ myserver.address.com:/users/biblioteca

Como veis, lo único que he hecho es preceder la ruta de la carpeta de destino con la dirección del servidor (puede ser el nombre DNS o la IP), separándolos con dos puntos. Los dos puntos le dicen a rsync que debe establecer conexión con esa máquina. Y ya está. Bueno, no todo. En realidad, lo que hace rsync es utilizar SSH (secure shell), así que en la máquina de destino tendrá que estar funcionando un servidor SSH (si es Linux, OpenSSH se instala rápido y sin problemas). No voy a entrar en detalles, sólo decir que SSH permite acceder a otra máquina de forma "segura", y que es lo que utiliza rsync para identificarse y poder así transferir los archivos. Excepto por el hecho de que los archivos se transmiten por red, no hay más complicación para nosotros. Lo que sí tendremos que hacer es entrar nuestra contraseña de usuario cada vez que usemos rsync para transferir archivos de o hacia otra máquina (sí, podemos hacer rsync miservidor.com:/carpeta_origen/ /mi_ordenador/carpeta_destino). Ojo, la contraseña que usemos en la otra máquina. Tengamos en cuenta que rsync manda automáticamente el nombre de usuario que estemos usando en el momento de ejecutar la orden. ¿Y si tenemos un usuario distinto en el otro sistema? Pues nada más sencillo que esto:

rsync /myuser/biblioteca/ myusername@myserver.address.com:/users/biblioteca

Donde myusername es un nombre de usuario de una cuenta activa en la máquina remota. Entramos su contraseña y ya está (en otro post os comentaré cómo evitar tener que estar introduciendo la contraseña cada vez).

Hay otra opción, que es tener a rsync corriendo como servidor en la máquina destino. En ese caso, tendríamos que separar el nombre de la máquina de la ruta de la carpeta destino por :: en vez de usar :, pero esto es otra historia en la que no nos meteremos (más información en los enlaces que os pasé en el post anterior).

Y por hoy ya es suficiente. La próxima entrada: cómo hacer una sincronización de verdad.

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