sábado, 7 de noviembre de 2009

Sincronizando datos: rsync (3)

En el post anterior os conté cómo se hace una sincronización básica con un servidor remoto. Sin embargo, la última orden que os puse no hacía lo que yo deseaba:

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

Recordad que en el primer post os dije que, por defecto, rsync realiza una copia simple, sin borrar archivos que ya no existen en el origen, sin copiar directorios, etc. La orden que me sirvió fue ésta:

rsync -axzuvh --delete --force-delete --exclude='.*' /myuser/biblioteca/ myusername@myserver.address.com:/users/biblioteca

Como veis, hay varios códigos precedidos por guiones. Son opciones de rsync, que me permitieron que funcionase como yo quería. Aunque tenéis su significado en los enlaces del primer post (y no olvidéis que tenéis el manual de rsync escribiendo en consola man rsync), voy a describirlas una a una. Un aviso, estas opciones tienen su forma larga (precedida por --) y su forma abreviada (precedida por -). En la forma abreviada, se pueden concatenar varias opciones. Por ejemplo, -axzuvh equivale a -a -x -z -u -v -h.

-a
Modo de archivo, equivale a escribir -rlptgoD. ¿Y qué significa -rlptgoD? Pues que rsync debe comportarse recursivamente (-r), es decir, que debe copiar directorios y los archivos que contengan (un problema que quería resolver); también debe copiar enlaces simbólicos (-l, no entro en esto); debe preservar los permisos de los archivos, su propietario, su grupo, y, si son archivos de dispositivo o especiales, deben permanecer como tales (-pgoD, tampoco entro, pero es muy importante si queremos que los archivos sincronizados se "comporten" como los originales); y debe preservar la hora de modificación de los archivos (-t) ya que, si no, la hora de modificación se cambiaría a la de copia. Vamos, que con -a rsync nos realiza una sincronización del directorio que le ordenemos, con todos sus contenidos y exactamente tal como estaban esos contenidos, sin que haya modificaciones de sus propiedades de por medio.

-x
Esto evita que si dentro del directorio a sincronizar hay una ruta que lleva a un dispositivo de almacenamiento distinto, evite el salto al otro dispositivo. Esto no les será familiar a los usuarios en general, pero es que, en sistemas Unix, los sistemas de almacenamiento (discos duros, DVD, etc.) aparecen como simples directorios. Es decir, que si en mi ruta hay un directorio llamado Pendrive, donde he "montado" mi pendrive de 4 GB, los contenidos de ese pendrive se sincronizarán, a menos que incluya -x. La verdad es que es un concepto un poco difícil de explicar en poco espacio, y, en mi caso, yo no tendría ese problema. Pero me parece que es útil incluir esta opción como precaución.

-z
Le decimos a rsync que comprima los archivos durante la transferencia. Más uso de CPU y memoria (poco importante con los maquinones que utilizamos estos días), pero se aligerará la transferencia por red. Que sepáis que hay opciones adicionales para evitar, por ejemplo, recomprimir archivos ZIP o JPEG (lo cual no tendría beneficios), o para forzar una compresión más rápida o más intensa.

-u
Imprescindible en toda buena sincronización. Con esta orden, no transferimos al destino los archivos que tienen una fecha y hora de modificación más reciente que en el origen. Imaginemos que he subido al servidor (por otra vía distinta a rsync) el archivo "Informe actualizado.pdf". Cuando rsync revise el destino, verá que "Informe actualizado.pdf" es más reciente que su copia en el origen, y no lo actualizará. Esta opción tampoco es necesaria en mi caso, pero la he incluido "por si acaso".

-v
Con esta opción, rsync nos va informando de lo que va haciendo (archivos transferidos, velocidad, etc.), con lo cual podéis ver si suceden cosas raras.

-h
Modo "legible para humanos". Es decir, el tamaño de los archivos no se muestra en bytes (por defecto, sino en KB, MB o GB. Muy útil para entender la información que se muestra en pantalla.

--delete
Si un archivo existe en el destino, pero no en el origen, se borra. Recordad que me interesa que el destino sea igual al origen. Si borro algo en mi ordenador, quiero que desaparezca del servidor.

--force-delete

En principio, si un directorio en el destino no está vacío, no se borrará aunque uséis --delete. Con --force-delete, si borráis un directorio en el origen, desaparecerá en el destino, aunque contenga archivos.

--exclude='.*'
Esta opción os permite utilizar expresiones para evitar que rsync copie determinados archivos. Por no entrar en ello, en mi caso estoy diciendo a rsync que no considere los archivos que empiezan por un punto (que son archivos ocultos en sistemas UNIX). Yo utilizo Mac OS X, que tiene la costumbre de crear archivos ocultos en determinados directorios para guardar cierta información de sistema. Como no me interesa que esos archivos se copien al servidor, utilizo esta opción.

Y ya está. No tengo más que realizar pequeñas modificaciones para acomodar rsync a mis propósitos. En la siguiente (y última entrada sobre el tema, espero), os contaré cómo simplifiqué este proceso con scripts y cómo evité tener que introducir la contraseña de SSH cada vez que quería sincronizar con el servidor.

1 comentario:

manuelperezf dijo...

muy bueno tio. Con tus consejos he conseguido completar las copias de mi portatil.