Académique Documents
Professionnel Documents
Culture Documents
com/blog/2008/01/13/backups-con-rsync/
fichero1
$ ll fichero?
Pero si el comando lo ejecutamos desde otro usuario (en el ejemplo root), vemos que no se
est manteniendo el usuario, aunque s los permisos, y que incluso la hora es diferente:
# rsync fichero1 fichero3
# ll fichero?
Por eso, para propsitos de backup, el rsync en la mayora de los casos se utiliza con la
opcin -a:
-a, --archive archive mode; same as -rlptgoD (no -H, -A)
Esta opcin combina el parmetro -r para que el recorra toda la estructura de directorios
que le indiquemos, el -l para que copie enlaces simblicos como enlaces simblicos, la -
ppara que mantenga los permisos, la -t para que se mantenga la hora del fichero, la -
g para que se mantenga el grupo, la -o para que se mantenga el propietario, la -D para que
se mantengan los ficheros de dispositivo (slo para root). Ni se mantienen los hard links (-
H) ni las ACLs (-A) por defecto. En definitiva, con la opcin -a obtenemos una copia exacta
de una jerarqua de ficheros y directorios.
Veamos un ejemplo de sincronizacin de un directorio llamado dirA que contiene otros
directorios y ficheros en otro llamado dirB que, de momento, an no existe:
$ rsync -av dirA/ dirB/
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4
Si ahora modificamos un poco slo uno de los ficheros y volvemos a ejecutar exactamente el
mismo comando, veremos que esta vez slo se copia el fichero modificado:
fichero1
Sin embargo, vemos que aunque el fichero sea slo ligeramente distinto, rsync copia todo
el fichero completo cada vez:
$ rm fichero2
fichero1
Si contrarrestamos la -W con --no-whole-file veremos que que ahora s que slo copia el
bloque donde ha encontrado el cambio:
$ echo prueba >> fichero1
fichero1
fichero1
Respecto a cmo pasarle los nombres de los directorios, hay que tener una especial atencin
respecto a si ponemos una barra al final del nombre del directorio o no, ya que significan
cosas distintas:
You can think of a trailing / on a source as meaning copy the contents of this directory as
opposed to copy the directory by name, but in both cases the attributes of the containing
directory are transferred to the containing directory on the destination. In other words, each
of the following commands copies the files in the same way, including their setting of the
attributes of /dest/foo:
rsync -av /src/foo /dest
./
fichero1
fichero2
dirA1/
dirA1/fichero3
dirA2/
dirA2/fichero4
$ ll dirB
total 164
En cambio, si lo que queremos es que que copie dirA dentro de dirB, tenemos que poner
rsync -av dirA dirB/ o rsync -av dirA dirB:
$ rm -rf dirB
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4
$ ll dirB
total 12
La diferencia entre poner la barra al final y no ponerla es una de las cosas que tenemos que
tener en todo momento ms claras a la hora de pensar en qu parmetros le vamos a pasar
al comando para hacer un backup con rsync con xito.
$ touch dirB/ficheroextrao
./
deleting ficheroextrao
./
fichero1
Y en este punto, ya tenemos varias forma de usar el comando perfectamente vlidas para
hacer backups en funcin de nuestras necesidades:
Backups incrementales
Si queremos tener un archivo con los ficheros que vamos modificando, un backup
incremental, las opciones -b/--backup y --backup-dir=DIR (y tambin --suffix=SUF)
son de mucha utilidad para nosotros.
Supongamos que tenemos dos directorios dirA y dirB perfectamente sincronizados y
actualizamos un fichero en el directorio origen:
$ rsync -a dirA/ dirB/
backup_dir is /home/vicente/rsync/backup_0801131917/
done
deleting in .
fichero2 is uptodate
dirA1/fichero3 is uptodate
dirA2/fichero4 is uptodate
$ ll
total 20
$ ll backup_0801131917/
total 80
$ ll
total 28
$ ll backup_0801131921/
total 84
La mayora de las veces no querremos hacer backup de un nico directorio y ya est, sino
que querremos hacer backup de una lista determinada de directorios. En esos casos, o
especificamos uno por uno en la lnea de comandos o, mucho mejor, los especificamos en
una lista. Si especificamos los ficheros en una lista, nos podemos permitir tener un script de
backup que lance rsync con las opciones deseadas y que no modificaremos nunca y el
fichero con la lista de directorios de los que hay que hacer backup que ser lo que
modificaremos. Las opciones son:
--exclude=PATTERN exclude files matching PATTERN
Los patrones que usa rsync no son muy intuitivos, as que lo mejor es leer detenidamente
la seccin que los explica (INCLUDE/EXCLUDE PATTERN RULES) en la pgina de man de
rsync, pero podemos ver un ejemplo que nos aclarar un poco este tema.
Imaginemos que queremos hacer un backup de los directorios /var/log/ y /var/www/.
Podramos usar un comando como:
rsync -av --delete --prune-empty-dirs --include-
from=lista_dirs_backup.txt / /mnt/disco/Backup/
+ /var/www/**
+ /var/log/**
- *
+ /var/www/
+ /var/log/
+ /var/www/**
+ /var/log/**
- *
Pero es evidente que en el caso de tener muchos directorios y con mucha profundidad, esta
forma se puede complicar mucho y es claramente ms sencilla la anterior (aunque tambin
es ms lenta por tener que recorrer todos los directorios del origen).
En versiones de rsync >=2.6.7 tambin existe la posibilidad de poner tres asteriscos (***)
para especificar que el propio directorio especificado tambin pasa el filtro, facilitndonos
nuestra labor en el caso de que queramos hacerlo sin + */ y sin --prune-empty-dirs:
+ /var/
+ /var/www/***
+ /var/log/***
- *
total 16
+ log
+ www/**
+ log/**
- *
total 16
Pero como regla fcil que siempre funciona, tenemos lo primero que hemos comentado. Un
comando como este:
+ /directorio1/**
+ /directorio2/directorio2A/**
+ /directorio2/directorio2B/**
- *
rsync remoto
Hasta ahora hemos hecho todos los ejemplos en local. Sin embargo, la mxima utilidad
de rsync llega cuando se usa para hacer backups en una mquina remota, de forma que el
backup cumpla mejor su funcin al estar fsicamente en otro sistema.
En la mquina destino es posible usar el propio proceso rsync funcionando como demonio y
escuchando por defecto en el puerto 873 para recibir estas conexiones, pero es mucho ms
cmodo y fcil hacerlo por SSH, algo para lo que rsync ya est preparado por defecto.
Para esto es conveniente configurar el cliente y el servidor de SSH involucrados para entrar
de forma transparente usando autentificacin por clave pblica (Autentificacin
trasparente por clave pblica/privada con OpenSSH) para evitar tener que introducir la
contrasea cada vez, aunque no es estrictamente necesario. Una vez que lo tengamos as (o
si optamos por introducir la contrasea manualmente) y verifiquemos que podemos entrar
en la otra mquina sin introducir usuario ni contrasea, podemos usarrsync exactamente
igual que si trabajramos con la mquina local, solo que tenemos que especificar el prefijo
usuario@maquina: en el origen o en el destino (no en ambos):
$ rsync -av --delete dirA vicente@remoto:/backup/
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4
./
fichero1
fichero2
dirA1/
dirA1/fichero3
dirA2/
dirA2/fichero4