Lo hice y lo entendí

El blog de Vicente Navarro
13 ene

Backups con rsync

En ¿Piensas en si un día te roban el portátil? mencioné que me gusta hacer los backups con rsync. Me gusta usarlo para backups tanto locales (copiar ficheros de un directorio a otro del mismo sistema) como remotos (copiar ficheros de un sistema a otro), y tanto en en Linux como en Windows usando Cygwin sin ningún problema de interoperabilidad para hacer backups remotos usando uno u otro como destino de las copias de seguridad.

rsync es una herramienta para sincronizar los ficheros y directorios que tenemos almacenados en un sitio en otro diferente minimizando la transferencia de datos (Wikipedia: rsync). En realidad, rsync son dos cosas: un algoritmo de delta compression para sincronizar dos ficheros similares y una utilidad que usa dicho algoritmo junto con otras técnicas para hacer mirroring de ficheros y directorios en otro sitio transfiriendo la mínima cantidad de datos posible.

A nivel de un árbol de directorios con sus ficheros, la idea es sencilla. rsync nos copiará esos ficheros y directorios tal y como estaban en el nuevo sitio pero sin copiar todo, sino sólo lo que ha cambiado en el origen respecto al destino. Hacer lo mismo copiando los ficheros y directorios, incluso en remoto usando una carpeta compartida, sería equivalente si nos fijamos únicamente en el resultado, pero tenemos que transferir mucha más información.

A nivel de ficheros individuales, podemos imaginar un fichero muy grande (p.e. de varios GiB) de una base de datos. Si quisiéramos hacer backup de él sin tener herramientas como rsync, tendríamos que copiarlo cada vez, cuando en realidad en muchos casos la inmensa mayoría de bloques del fichero no habrá cambiado. rsync, en cambio, analiza el fichero en origen y en destino y sólo transmite (de forma comprimida, además) las partes que realmente hayan cambiado.

Debian, por ejemplo, pone a nuestra disposición servidores de rsync para descargar sus imágenes de CDs, aunque hay un debate sobre si el descenso en el uso de ancho de banda de los servidores compensa el aumento en el uso de CPU y memoria a causa del propio algoritmo de rsync (About integration of rsync and Debian). Y es que rsync consume la CPU necesaria para su algoritmo y además mantiene en memoria una lista con todos los ficheros a ser sincronizados (unos 100 bytes por cada uno), por lo que necesita bastante memoria. También se debate el problema de que el rsync no es muy eficiente con ficheros comprimidos con gzip y con bzip2 porque un pequeño cambio en el contenido modifica en cadena todo el archivo creando una especie de efecto mariposa que causa que dos archivos parecidos no guarden ninguna semejanza aprovechable por rsync tras la compresión.

En cualquier caso, si las anteriores pequeñas pegas no nos detienen, veremos que rsync es, en definitiva, una excelente utilidad de línea de comandos para hacer copias de seguridad locales y remotas.

El listado de características especiales que nos da la página de man de rsync es:

  • Soporte para copiar enlaces, ficheros de dispositivo, propietarios, grupos y permisos
  • Opciones de exclusión (exclude y exclude-from) similares a las del GNU tar
  • Modo CVS para ignorar los fichero que CVS ignoraría
  • Se puede usar cualquier shell remota transparente, como ssh o rsh
  • No es necesario ser root para usarlo
  • pipelining de los ficheros transferidos para minimizar la latencia
  • Soporte para usuarios anónimos o autentificados usando el demonio de rsync (ideal para hacer mirroring)

En su forma más sencilla de uso, es similar a un cp. Si queremos sincronizar un fichero en otro podemos, simplemente, hacer (el -v es para que nos muestre información más detallada sobre lo que hace):

$ ll fichero1
-rw-r----- 1 vicente users 7625431 2008-01-13 11:40 fichero1
$ rsync -v fichero1 fichero2
fichero1

sent 7626448 bytes  received 42 bytes  15252980.00 bytes/sec
total size is 7625431  speedup is 1.00

$ ll fichero?
-rw-r----- 1 vicente users 7625431 2008-01-13 11:40 fichero1
-rw-r----- 1 vicente users 7625431 2008-01-13 11:41 fichero2

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?
-rw-r----- 1 vicente users 7625431 2008-01-13 11:40 fichero1
-rw-r----- 1 vicente users 7625431 2008-01-13 11:41 fichero2
-rw-r----- 1 root    root  7625431 2008-01-13 11:44 fichero3

Y tampoco es capaz de hacer nada con directorios:

$ rsync dirA dirB
skipping directory dirA

Por eso, para propósitos de backup, el rsync en la mayoría de los casos se utiliza con la opción -a:

-a, --archive               archive mode; same as -rlptgoD (no -H, -A)

Esta opción combina el parámetro -r para que el recorra toda la estructura de directorios que le indiquemos, el -l para que copie enlaces simbólicos como enlaces simbólicos, la -p para 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 (sólo para root). Ni se mantienen los hard links (-H) ni las ACLs (-A) por defecto. En definitiva, con la opción -a obtenemos una copia exacta de una jerarquía de ficheros y directorios.

Veamos un ejemplo de sincronización de un directorio llamado dirA que contiene otros directorios y ficheros en otro llamado dirB que, de momento, aún no existe:

$ rsync -av dirA/ dirB/
building file list ... done
created directory dirB
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4

sent 6540542 bytes  received 126 bytes  13081336.00 bytes/sec
total size is 6539349  speedup is 1.00

Si ahora modificamos un poco sólo uno de los ficheros y volvemos a ejecutar exactamente el mismo comando, veremos que esta vez sólo se copia el fichero modificado:

$ echo prueba >> dirA/fichero1
$ rsync -av dirA dirB
building file list ... done
fichero1

sent 65884 bytes  received 42 bytes  131852.00 bytes/sec
total size is 6539356  speedup is 99.19

Sin embargo, vemos que aunque el fichero sea sólo ligeramente distinto, rsync copia todo el fichero completo cada vez:

$ rm fichero2
$ rsync -av fichero1 fichero2
fichero1

sent 7626462 bytes  received 42 bytes  15253008.00 bytes/sec
total size is 7625445  speedup is 1.00

$ echo prueba >> fichero1
$ rsync -av fichero1 fichero2
fichero1

sent 7626469 bytes  received 42 bytes  15253022.00 bytes/sec
total size is 7625452  speedup is 1.00

No es que haya ningún defecto en su algoritmo, es que para un uso en local, rsync usa la opción -W por defecto, ya que considera que el esfuerzo en calcular la diferencia entre los ficheros es mayor que copiar directamente todo el fichero:

-W, --whole-file            copy files whole (without rsync algorithm)

Si contrarrestamos la -W con --no-whole-file veremos que que ahora sí que sólo copia el bloque donde ha encontrado el cambio:

$ echo prueba >> fichero1
$ rsync -av --no-whole-file fichero1 fichero2
building file list ... done
fichero1

sent 13514 bytes  received 16620 bytes  20089.33 bytes/sec
total size is 7625459  speedup is 253.05

Y si encima usamos la opción -z, comprimirá el bloque antes de pasarlo:

$ echo prueba >> fichero1
$ rsync -avz --no-whole-file fichero1 fichero2
building file list ... done
fichero1

sent 843 bytes  received 16620 bytes  34926.00 bytes/sec
total size is 7625466  speedup is 436.66

El uso de la opción -z puede ser beneficioso o perjudicial, ya que la menor transferencia de datos redunda en un mayor consumo de CPU.

Por cierto, ¿en qué se basa rsync para decidir que un fichero ha cambiado? Normalmente sólo mira la fecha del fichero y su tamaño, por lo que si ninguna de las dos cosas cambia, por defecto el rsync no copiará el fichero. Es muy raro que dos ficheros con la misma fecha y tamaño sean diferentes, pero puede ocurrir. Si en nuestro entorno se puede dar ese caso, tendremos que usar la opción -c para que se determine por CRC si realmente los ficheros son iguales:

-c, --checksum              skip based on checksum, not mod-time & size

Pero claro, esto también aumentará sensiblemente el uso de CPU.

La barra al final de los nombres de directorio

Respecto a cómo pasarle los nombres de los directorios, hay que tener una especial atención 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
              rsync -av /src/foo/ /dest/foo

Efectivamente, /path/foo significa “el directorio foo“, mientras que /path/foo/ significa “lo que hay dentro de foo“. Pongamos algunos ejemplos para entenderlo.

Este es el uso más estándar en el que sincronizamos dos directorios (dirA y dirB) para que sean exactamente iguales (“rsync -av dirA/ dirB/” o “rsync -av dirA/ dirB“):

$ rm -rf dirB
$ rsync -av dirA/ dirB/
building file list ... done
created directory dirB
./
fichero1
fichero2
dirA1/
dirA1/fichero3
dirA2/
dirA2/fichero4

sent 6540550 bytes  received 126 bytes  13081352.00 bytes/sec
total size is 6539363  speedup is 1.00

$ ll dirB
total 164
drwxr-xr-x 4 vicente users  4096 2008-01-13 11:48 ./
drwxr-xr-x 4 vicente users  4096 2008-01-13 14:00 ../
drwxr-xr-x 2 vicente users  4096 2008-01-13 11:48 dirA1/
drwxr-xr-x 2 vicente users  4096 2008-01-13 11:59 dirA2/
-rwxr-xr-x 1 vicente users 65638 2008-01-13 13:59 fichero1*
-rw-r--r-- 1 vicente users 71033 2008-01-13 11:39 fichero2

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
$ rsync -av dirA dirB
building file list ... done
created directory dirB
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4

sent 6540549 bytes  received 126 bytes  13081350.00 bytes/sec
total size is 6539356  speedup is 1.00

$ ll dirB
total 12
drwxr-xr-x 3 vicente users 4096 2008-01-13 13:35 ./
drwxr-xr-x 4 vicente users 4096 2008-01-13 13:35 ../
drwxr-xr-x 4 vicente users 4096 2008-01-13 11:48 dirA/

La diferencia entre poner la barra al final y no ponerla es una de las cosas que tenemos que tener en todo momento más claras a la hora de pensar en qué parámetros le vamos a pasar al comando para hacer un backup con rsync con éxito.

Eliminando ficheros del destino de backups anteriores

En muchos casos, es posible que hayamos borrados ficheros de origen que ya no queremos que aparezcan en el destino, pero por defecto rsync no los elimina. Para que lo haga, debemos usar la opción --delete:

$ rm -rf dirB/
$ rsync -a dirA/ dirB/
$ touch dirB/ficheroextraño
$ rsync -av dirA/ dirB/
building file list ... done
./

sent 199 bytes  received 26 bytes  450.00 bytes/sec
total size is 6539363  speedup is 29063.84

$ rsync -av --delete dirA/ dirB/
building file list ... done
deleting ficheroextraño
./

sent 199 bytes  received 26 bytes  450.00 bytes/sec
total size is 6539363  speedup is 29063.84

Cuando se hagan pruebas con el --delete hay que llevar mucho cuidado, porque si elegimos erróneamente el directorio de destino podemos borrar en cascada muchísimos ficheros que no queríamos borrar. Es por eso que se aconseja que se use en las pruebas la opción -n/--dry-run para que el comando no haga nada en realidad y así podamos depurar el comando antes de ponerlo en funcionamiento definitivamente.

Otra opción que puede ser interesante en algunos entorno es la -u, para que no se sobreescriban los ficheros del destino que son más recientes que los del origen. Esta opción es útil si es posible que en un momento dado se trabaje sobre los ficheros del backup, de modo que en ningún caso reemplacemos los archivos que se puedan haber modificado en destino:

$ touch dirB/fichero1
$ rsync -av --delete dirA/ dirB/
building file list ... done
fichero1

sent 65885 bytes  received 42 bytes  131854.00 bytes/sec
total size is 6539363  speedup is 99.19

$ touch dirB/fichero1
$ rsync -av --delete -u dirA/ dirB/
building file list ... done

sent 193 bytes  received 20 bytes  426.00 bytes/sec
total size is 6539363  speedup is 30701.23

Y en este punto, ya tenemos varias forma de usar el comando perfectamente válidas para hacer backups en función de nuestras necesidades:

$ rsync -av --delete directorioorigen/ directoriodestino/
$ rsync -av --delete directorioorigen directoriodestino
$ rsync -av --delete -u directorioorigen/ directoriodestino/
$ rsync -av --delete -u directorioorigen directoriodestino

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 también --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/
$ echo prueba >> dirA/fichero1

Si volvemos a sincronizar, el rsync borraría el dichero dirA/fichero1 que teníamos almacenado del backup anterior en dirB. Para que no nos lo elimine completamente, vamos a usar la opción -b y le vamos a decir que almacene la versión previa en el directorio “backup_fechahoradehoy” (ponemos dos opciones -v para que nos informe sobre el backup):

$ rsync -avvb --delete --backup-dir=$PWD/rsync/backup_$(date +%y%m%d%H%M) dirA/ dirB/
backup_dir is /home/vicente/rsync/backup_0801131917/
building file list ...
done
deleting in .
delta-transmission disabled for local transfer or --whole-file
fichero1
fichero2 is uptodate
dirA1/fichero3 is uptodate
dirA2/fichero4 is uptodate
backed up fichero1 to /home/vicente/rsync/backup_0801131917/fichero1
total: matches=0  hash_hits=0  false_alarms=0 data=65708

sent 65991 bytes  received 78 bytes  132138.00 bytes/sec
total size is 6539433  speedup is 98.98

Y vemos que ya tenemos un directorio de backup que sólo contiene los fichero que han sido reemplazados esta vez:

$ ll
total 20
drwxr-xr-x  5 vicente users 4096 2008-01-13 19:18 ./
drwxr-x--- 56 vicente users 4096 2008-01-13 18:43 ../
drwxr-xr-x  2 vicente users 4096 2008-01-13 19:17 backup_0801131917/
drwxr-xr-x  4 vicente users 4096 2008-01-13 11:48 dirA/
drwxr-xr-x  5 vicente users 4096 2008-01-13 11:48 dirB/

$ ll backup_0801131917/
total 80
drwxr-xr-x 2 vicente users  4096 2008-01-13 19:17 ./
drwxr-xr-x 5 vicente users  4096 2008-01-13 19:18 ../
-rwxr-xr-x 1 vicente users 65701 2008-01-13 19:17 fichero1*

Si ahora modificamos otro fichero, veremos que antes de reemplazarse, se almacenará en un nuevo directorio de backup:

$ echo prueba >> dirA/fichero2
$ rsync -ab --delete --backup-dir=$PWD/backup_$(date +%y%m%d%H%M) dirA/ dirB/
$ ll
total 28
drwxr-xr-x  7 vicente users 4096 2008-01-13 19:21 ./
drwxr-x--- 56 vicente users 4096 2008-01-13 18:43 ../
drwxr-xr-x  2 vicente users 4096 2008-01-13 19:17 backup_0801131917/
drwxr-xr-x  2 vicente users 4096 2008-01-13 19:21 backup_0801131921/
drwxr-xr-x  4 vicente users 4096 2008-01-13 11:48 dirA/
drwxr-xr-x  4 vicente users 4096 2008-01-13 11:48 dirB/
$ ll backup_0801131921/
total 84
drwxr-xr-x 2 vicente users  4096 2008-01-13 19:21 ./
drwxr-xr-x 7 vicente users  4096 2008-01-13 19:21 ../
-rw-r--r-- 1 vicente users 71040 2008-01-13 19:20 fichero2/

Es importante no usar paths relativos en el parámetro --backup-dir, porque son relativos al directorio destino. En los ejemplos anteriores, si hubiéramos hecho “--backup-dir=backup_$(date +%y%m%d%H%M)“, el directorio “backup_0801131917” de turno se hubiera creado dentro del dirB y sería eliminado en el siguiente rsync con --delete.

Actualización 15/1/07 (inspirada por los comentarios de MetalAgent):

También podemos hacer backups incrementales con las opciones:

--compare-dest=DIR      also compare received files relative to DIR
--copy-dest=DIR         ... and include copies of unchanged files
--link-dest=DIR         hardlink to files in DIR when unchanged

La opción --compare-dest=DIR hace casi lo mismo que la -b/--backup / --backup-dir=DIR, pero al revés. En lugar de guardar los ficheros viejos en DIR, como hace la -b, la --compare-dest lo que hace es guardar en el directorio destino sólo los ficheros que han cambiado respecto a DIR. Es como un backup incremental pero mientras que con la -b tienes todos los ficheros de la última versión en el directorio destino, con la --compare-dest sólo tienes en el directorio destino los ficheros que han cambiado desde el último backup.

Como variación de la --compare-dest, está la --copy-dest=DIR, que hace lo mismo que la anterior pero además copia los ficheros que no hayan cambiado. ¡Pero ojo!, la ventaja de esta opción es que la copia de los ficheros que no han cambiado es local, de forma que en un rsync remoto, todos los ficheros que ya estaban en DIR no se tienen que transferir. La desventaja es que necesita mucho espacio en disco.

Finalmente, la variante más interesante es la --link-dest=DIR, que hace lo mismo que la --copy-dest pero sin consumir más espacio en disco porque usa hard links a los ficheros que ya existen. ¡Una opción realmente útil!

Incluyendo y excluyendo ficheros del backup

La mayoría 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 línea 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
--exclude-from=FILE     read exclude patterns from FILE
--include=PATTERN       don't exclude files matching PATTERN
--include-from=FILE     read include patterns from FILE
--files-from=FILE       read list of source-file names from FILE

Los patrones que usa rsync no son muy intuitivos, así que lo mejor es leer detenidamente la sección que los explica (INCLUDE/EXCLUDE PATTERN RULES) en la página 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/“. Podríamos usar un comando como:

rsync -av --delete --prune-empty-dirs --include-from=lista_dirs_backup.txt / /mnt/disco/Backup/

en el que el fichero lista_dirs_backup.txt contiene:

+ */
+ /var/www/**
+ /var/log/**
- *

El “+ */” de la primera línea especifica que todos los directorios pasan el filtro y es necesario porque aunque especifiquemos los directorios que nos interesan en las siguientes líneas, el propio directorio /var/ y los /var/log/ y /var/www/ no pasaría el filtro. Además, como esta opción nos permite pasar todos los directorios pero sin los ficheros y directorios que contienen, tenemos que usar la opción --prune-empty-dirs para que no copie directorios vacíos.

En la última línea le especificamos con “- *” que todo lo que en ese punto ya no ha pasado el filtro, que sea descartado. Los dos asteriscos (**) indican que todos los ficheros y directorios que hay debajo pasarán el filtro.

Una alternativa sin --prune-empty-dirs sería incluir específicamente todos los directorios involucrados:

+ /var/
+ /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 más sencilla la anterior (aunque también es más lenta por tener que recorrer todos los directorios del origen).

En versiones de rsync >=2.6.7 también existe la posibilidad de poner tres asteriscos (***) para especificar que el propio directorio especificado también pasa el filtro, facilitándonos nuestra labor en el caso de que queramos hacerlo sin “+ */” y sin --prune-empty-dirs:

+ /var/
+ /var/www/***
+ /var/log/***
- *

Y también es importante tener en cuenta si los directorios especificados son relativos o absolutos. En los ejemplos anteriores, el directorio origen era el raíz (/) y por ello, los directorios se guardaban con todo el path (/var/log/ y /var/www/) y así los especificábamos en el fichero de include:

$ ll /mnt/disco/Backup/var/
total 16
drwxr-xr-x  4 root root 4096 2007-10-31 21:10 ./
drwxr-xr-x  3 root root 4096 2007-12-09 18:19 ../
drwxr-xr-x 14 root root 4096 2008-01-13 18:43 log/
drwxr-xr-x  3 root root 4096 2007-06-27 20:19 www/

pero también podríamos haber decidido hacerlo con referencia a /var/:

rsync -av --delete --prune-empty-dirs --include-from=lista_dirs_backup.txt /var/ /mnt/disco/Backup/

Con lo que en el fichero lista_dirs_backup.txt tendríamos que poner (suponemos versión <2.6.7):

+ www
+ log
+ www/**
+ log/**
- *

Y el resultado sería un backup sin la parte del directorio /var/:

$ ll /mnt/disco/Backup/
total 16
drwxr-xr-x  4 root root 4096 2007-10-31 21:10 ./
drwxrwxrwt 18 root root 4096 2008-01-13 20:07 ../
drwxr-xr-x 14 root root 4096 2008-01-13 18:43 log/
drwxr-xr-x  3 root root 4096 2007-06-27 20:19 www/

Pero como regla fácil que siempre funciona, tenemos lo primero que hemos comentado. Un comando como este:

rsync -av --delete --prune-empty-dirs --include-from=lista_dirs_backup.txt / /mnt/disco/Backup/

con un lista_dirs_backup.txt como este:

+ */
+ /directorio1/**
+ /directorio2/directorio2A/**
+ /directorio2/directorio2B/**
- *

rsync remoto

Hasta ahora hemos hecho todos los ejemplos en local. Sin embargo, la máxima utilidad de rsync llega cuando se usa para hacer backups en una máquina remota, de forma que el backup cumpla mejor su función al estar físicamente en otro sistema.

En la máquina 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 más cómodo y fácil 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 autentificación por clave pública (Autentificación trasparente por clave pública/privada con OpenSSH) para evitar tener que introducir la contraseña cada vez, aunque no es estrictamente necesario. Una vez que lo tengamos así (o si optamos por introducir la contraseña manualmente) y verifiquemos que podemos entrar en la otra máquina sin introducir usuario ni contraseña, podemos usar rsync exactamente igual que si trabajáramos con la máquina 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/
building file list ... done
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4

sent 6540658 bytes  received 126 bytes  2616313.60 bytes/sec
total size is 6539461  speedup is 1.00
# rsync -av --delete vicente@remoto:/backup/dirA/ dirC/
receiving file list ... done
created directory dirC
./
fichero1
fichero2
dirA1/
dirA1/fichero3
dirA2/
dirA2/fichero4

sent 126 bytes  received 6540665 bytes  2616316.40 bytes/sec
total size is 6539461  speedup is 1.00

Enlaces

:wq

Entradas relacionadas

90 Comentarios a “Backups con rsync”

  • MetalAgent dice:

    ¡Excelente tutorial!, hace unos días me estuve peleando con rsync y me hubiera venido muy bien XD.

    Una cosa que yo he hecho en mi script para los backups incrementales es crear un directorio nuevo cada dia /backup/año/mes/dia/ para hacer la copia y con –link-dest hacer que tome como referencia el día anterior y haga enlaces físicos (hard links) y así poder tener una copia del día que quiero simplemente copiando el directorio (al ser enlaces no ocupa más espacio de lo que se ponga nuevo). No sé si será lo más óptimo pero sí sé que soy muy vago y para recuperar un día concreto y borrar copias antiguas que sé que no me sirven es la solución que más cómoda que he encontrado.

  • Lucas Perez dice:

    Excelente tutot… Quiero decir, tus tutoriales son la polla, gracias por tu trabajo. Saludos.

  • Ringmaster dice:

    Completísimo y ultra buen tutorial. Hace un par de años me hubiera venido de perlas. Marcador al canto…

  • Iván dice:

    Jeje, ojalá hubiera pillado este tutorial cuando estuve creando los scripts de backup, aunque en su momento ya me echaste una mano en los comentarios de mi post.

    Saludos, Iván.

  • José Luis dice:

    Saludos. Tu blog es de lo mejor que hay en la red. Una joya.

    Lo que me parece maravilloso de tu forma de postear es que explicas el porqué de las cosas, cosa que a mí me gusta mucho: no sólo saber cómo, sino también por qué. Manías de filósofos.

    Te sugiero que de vez en cuando nos aconsejes libros de informática que se parezcan a tu forma de postear.

    Muchas gracias.

  • @MetalAgent, @Lucas Perez, @Ringmaster, @Iván, @José Luis Muchísimas gracias a todos por vuestros comentarios. No os podéis imaginar lo satisfactorio que resulta que las horas invertidas en hacer una entrada como esta encuentren su recompensa en tantos comentarios como los vuestros.

    @MetalAgent ¡Muchas gracias! Es muy, muy interesante lo que comentas, pero entiendo que si en un momento dado modificas el fichero de origen, el del backup también quedará afectado. ¿Es ese el comportamiento que buscas? ¿No te importa perder los backups a versiones previas de los ficheros?

    @José Luis Me alegro mucho de que te guste mi forma de escribir las entradas. Sobre libros, desde la masificación de Internet, apenas leo libros técnicos en papel, y todo lo consulto en la red, así que me temo que no puedo aconsejarte en ese aspecto. Lo que sí que hago es intentar consultar las fuentes más primarias posibles. Por ejemplo, en este caso, la documentación original de rsync y no otros tutoriales y páginas de rsync.

  • Bytecoders dice:

    Muy buena Super Coco, otra más que te has apuntado.
    Ya me he tenido que crear una cuenta en delicious para guardar tus posts porque los marcadores de iceweasel eran ya un cacao.

    Además ya se sabe, esto siempre viene bien tenerlo a mano.

  • Dani dice:

    joder Super Coco muchas gracias por todos tus tutoriales, que a la vez de útiles e interesantes, los explicas como decían más arriba de una manera muy clara.

  • @Bytecoders, @Dani ¡Muchísimas gracias!, me alegro de que os haya gustado :P

  • MetalAgent dice:

    Hola SuperCoco: En mi caso hago copias día a día, que descargan lo que se ha hecho nuevo y que hacen hard links al resto de ficheros, teniendo día tras día un directorio de backup completo. Esas copias no las modifico directamente, sino que hago una copia del último día, al ser hard links en la copia ya sí me duplica localmente todos los ficheros, pero dentro del histórico del día a día tengo todos los cambios en un sitio (todo con esto empequetadito en un script, que sino menudo coñazo). Realmente lo uso como si fuera un repositorio, con un histórico del día a día por si acaso y copias locales; el tema es que pensé hacerlo con un repositorio de verdad pero como era sobre todo para imágenes y otros documentos, me asustaba un poco que empezara a crecer y crecer de mala manera. La verdad es que me explico muy mal… espero no haber liado a nadie.

    De todas formas, lo dicho, este post viene genial.

  • nachopro dice:

    realmente sos un groso… súper te queda chico, sos mega coco para mí!

    si bien, no tengo la necesidad de implementarlo por el momento… siempre quise saber cómo usar rsync

    gracias por los temas que tocás y tu calidad para ello.

  • rafa_piltrafa dice:

    muchas gracias por estos artículos Vic !!

    te sigo siempore aunque no comente. un abrazo !!

  • @MetalAgent ¡Ya te he entendido! Disculpa porque no había entendido bien lo que hacía el --link-dest=DIR.

    Podemos partir del --compare-dest=DIR, que hace algo parecido al -b/--backup pero al revés. En lugar de guardar los ficheros viejos en otros directorios como hemos visto en la entrada, el --compare-dest lo que hace es guardar en el nuevo directorio sólo los ficheros que han cambiado respecto a DIR. Es como un backup incremental pero mientras que con la -b tienes todos los ficheros de la última versión en el directorio destino, con el --compare-dest sólo tienes en el directorio destino los ficheros de los últimos cambios.

    Sobre el --compare-dest está el --copy-dest=DIR, que hace lo mismo que lo anterior pero además copia los ficheros que no hayan cambiado. Pero ojo, la ventaja de este comando es que la copia es LOCAL, de forma que en un rsync remoto, todos los ficheros que ya estaban en DIR no se tranferirían.

    Finalmente, la variante más interesante, que es la que nos comentas, la --link-dest=DIR, lo que hace es lo mismo que la --copy-dest pero sin consumir más espacio en disco por usar hard links. ¡Una opción realmente útil!

    ¡Gracias por hablarme de esta característica tan interesante que se me había escapado! Intentaré actualizar la entrada con estas opciones.

    @nachopro, @rafa_piltrafa ¡Muchas gracias a vosotros por vuestras visitas!

  • Rene Vielma dice:

    excelente artículo!

    solo una consulta:

    he respaldado mi disco con rsync hacia un equipo remoto, con el fin de arreglar unos problemas que tenía en la tabla de particiones, luego cuando cuando traigo de vuelta los datos, casí se ha doblado el tamaño de la información.

    —ANTES—
    (source)
    /dev/sda2
    tamaño de la partición: 12gb
    utilizado: 7 gb
    fs: reiserfs
    opciones de montaje: defaults,notail,noatime 0 1

    (target(remoto))
    /dev/sda1
    fs: ext3

    —DESPUES—
    (source)
    /dev/sda2
    tamaño de la partición: 12gb
    utilizado: 12 gb
    fs: reiserfs
    opciones de montaje: defaults,notail,noatime 0 1

    de hecho, me faltó espacio.

    tendrá que ver rsync con esto o sería por las diferencias en los sistemas de archivos o las opciones que tenía como punto de montaje ?

    gracias desde ya!.

  • @Rene Vielma Una cosa que se me ocurre es que como por defecto el rsync no guarda hard link:

    Ni se mantienen los hard links (-H) ni las ACLs (-A) por defecto.

    es posible que los diferentes hard links a un mismo inodo, al copiarlos de vuelta estén siendo escritos como ficheros independientes y, por tanto, ocupando mucho más espacio que antes.

  • vic dice:

    Enhorabuena!! Eres un auténtico crack!! No sabes todo lo que aprendo leyendo tus entradas, da gusto, no sólo por el contenido, sino por la forma de escribir y por la filosofía, ese amor al software libre, esas ganas de aprender y de difundir, y todo GPL ;) Ya paro, que parezco tu abuela :P

    Por cierto, un gran tutorial.

  • @vic ¡Muchas gracias! ¡Me sacas los colores! :oops:

  • edo dice:

    Genial, Buen tuto sobre rsync, muy bien explicado y todo.

    Solo una pregunta, es posible dejar corriendo el rsync para que inmediamente se efectue un cambio en alguno de los archivos se respalde automaticamente?

  • @edo Yo no conozco ninguna forma de hacer tal cosa, lo cual no quiere decir que no exista. De todas formas, algo así sería extremadamente poco eficiente, ya que rsync no está bien pensado para esto.

    Para tal efecto son mejores las soluciones de mirroring a través de la red. He hecho una búsqueda rápida y he encontrado soluciones como esta:

    This is a quick and dirty howto on setting up a networked RAID filesystem

    Seguramente haya alguna buena solución de mirroring de un filesystem local en la red. Por cierto, si la buscas y la encuentras, no dejes de comentárnosla aquí.

  • edo dice:

    Muchas Gracias por tu ayuda @Super Coco, y por supuesto cualquier información que encuentre al respecto la estaré comunicando aquí

  • Julio Tomas dice:

    Pues que puedo decir, me acabo de topar con este blog buscando sobre como encryptar particiones de un disco duro y quiero felicitarte por tu trabajo, he leido 3 artículos y los 3 me han enseñado bastante.

    Ojalá y algún día tuviera la oportunidad de conocer a un tipo como tú que, seguramente yo aprendería montones de toneladas de información y nuevos conocimientos.

    Felicidades y muchas gracias por compartir este tipo de conocimientos con todo el mundo y, un saludo desde la ciudad de Querétaro, México.

  • @Julio Tomas Me alegro mucho de que te haya gustado visitar el blog :-)

  • edo dice:

    Hola @Super Coco, he encontrado algo interesante se trata de un software de monitoreo de sistema de archivos que notifica de cambios en este en tiempo real, Puedes encontrar mayor información al respecto en:

    http://www.linuxfocus.org/English/March2001/article199.shtml#lfindex0
    http://oss.sgi.com/projects/fam/faq.html#what_is_fam

    Cualquier información adicional que encuentre te estaré informando.

    Saludos

  • @edo Pues puede ser una idea. Tan pronto como un fichero se modifica, se replica… Pero rsync no es muy rápido… ¿no cargará mucho el sistema si el fichero se está modificando continuamente?

  • Welton dice:

    Hola, me parece un tutorial acojonante, me estaba documentando para el uso de rsync y me he encontrado con el material tuyo y sólo me queda darte las gracias, ya os contaré mis movidas cuando lo implante con las BD.

    Saludos.

  • gau dice:

    Simplemente genial! :D

    Me gustaría lanzar una pregunta: ¿soy un bicho raro? Me explico: me gustaría poder sincronizar un árbol de directorios entre dos PCs remotos (por ejemplo, el ordenador de mi casa y el del trabajo), pero sin hacerlo por red (ya que la sincronización en ocasiones puede ser de varios GiB) y sin tener que mantener una sincronización completa intermedia (como por ejemplo un disco duro externo). A mi entender, lo ideal sería sincronizar en ese disco duro externo sólo los cambios que se hubiesen producido en un extremo desde la última sincronización y que, al sincronizar con el equipo remoto, desapareciesen del disco externo. Con esto tendría copias exactas en ambos equipos y en el disco externo sólo viajarían los cambios.

    Digo lo de “bicho raro” porque hace tiempo que estoy buscando alguna aplicación que satisfaga mis necesidades, pero no la encuentro… He llegado incluso a proponerme el crearla, pero no ha pasado de eso, una proposición…

    ¿Alguien conoce si existe esta aplicación, o cómo puedo hacerlo utilizando herramientas tipo rsync? Es por el tema de no reinventar la rueda…

    Saludos.

  • @gau Gracias. Hay una utilidad, llamada rdiff parte del proyecto librsync (proyecto independiente del de rsync pero basado en su código) que viene con las distribuciones que se supone que hace (página de rsync de la WikiPedia):

    A utility called rdiff uses the rsync algorithm to generate delta files with the difference from file A to file B (like the utility diff, but in a different delta format). The delta file can then be applied to file A, turning it into file B (similar to the patch utility).

    Yo no la he probado, pero yo diría que tiene mucho que ver con lo que tú quieres hacer. También existe el rdiff-backup, aunque esto ya no es exactamente lo que tú necesitas.

  • Sergio dice:

    ¡ Excelente Artículo !

    Debo decir que necesito realizar respaldos de varias sucursales, cada una de ellas conformadas por varios PCs (LAN), a un servidor de respaldos único.

    Originalmente había pensado usar “Backuppc”, pero al final desistí debido a que los clientes de las LANs debían estar ubicables desde internet y, como estaban en una LAN con IPs privadas detrás de un router, era engorroso.

    Finalmente me he decidido por usar “rsync” directamente a través de “ssh”.

    En general los clientes serán “Windows” y les instalaré “cwRsync” (una adapción de rsync a Windows usando Cygwin) más putty-plink (cliente ssh Windows. Quizás pudiera usar ssh directamente también con Cygwin, no sé, tengo que hacer algunas pruebas.

    El cliente gatillará automáticamente un archivo bat, mediante el “administrador de tareas” y opcionalmente, se podrá forzar el respaldo haciendo clic en un “acceso directo” en el escritorio. Presumo que para esto sólo debo tener la IP pública y fija del servidor.

    En el cliente crearé un par de claves para ssh (key-gen) y copiaré la pública al servidor, para que la conexión sea autónoma sin petición de clave.

    El servidor, está con Debian Lenny y ssh como demonio.

    He aquí mis inquietudes :

    ¿ Será necesario que levante el rsync en modo demonio en el servidor?
    (pienso que no, pero …)

    ¿ Alguien ha realizado algo similar, como para que me dé algunos “tips” (especialmente del uso del ssh desde Windows) ?

    Ahh, se me olvidaba, el servidor podrá ser accesado vía web y podremos ver la carpeta “respaldos” donde estarán individualizados cada uno de todos los PCs de la empresa.

    Eso no más …

    ¡ Cualquier sugerencia, será bien recibida !

    ¡ SALUDOS !

  • @Sergio No necesitas levantar rsync como demonio si tienes un servidor de SSH al otro lado. Yo, con el SSH de Cygwin no he tenido problemas hasta el momento. En:

    Servicios en Cygwin (syslogd, sshd, telnetd, ftpd, nfsd, etc.)

    hablé un poco de SSH en Cygwin.

    Eso sí, tal vez tengas algún problema con los juegos de caracteres. Eso me pasó a mí y lo detallé en:

    El paso a UTF-8 con Ubuntu Hardy Heron: rsync entre sistemas con distinto juego de caracteres

  • Humberto dice:

    Muy buen tutorial son estos manuales que a veces se hechan de menos

  • Leto dice:

    Hola, muy interesante y práctico el manual, sobre todo práctico, los ejemplos siempre son una buena idea.

    El caso es que tengo un problema con el rsync y ando un poco perdido. Intento hacer una copia remota. La información a copiar es considerable, hablamos de varios cientos de gigas, cerca de 800, y no hay versión inicial, es decir, el rsync lo va a copiar todo. Aquí me surge otra pregunta, que la haré más adelante.

    La situación es la siguiente, en la máquina A tengo toda esa información que quiero pasar a la máquina B, pero dado que rsync consume tantos recursos, no quierno lanzarlo en A, ya que su rendimiento cae en picado y es una máquina importante. Entonces decido lanzar desde B, pero no puedo usar la versión demonio, ya que sigue siendo A quien haría el trabajo, no obstante configuro un rsyncd.conf de prueba y funcina sin problemas. ¿Que o pción me queda?, lanzarlo desde B en modo shell, y quí es donde me viene el problema.

    rsync -vv –stats –progress -l -Razo –numeric-ids usuario@servidor:/RUTA .

    Funciona perfectamente, solo que el usuario no tiene permisos para accedes a todos los subdirectorios y si el usuario es root, una vez le pongo la clave ( no uso claves compartidas), se queda esperando por tiempo indefinido. Root tienes acceso a la máquina remota opr ssh, y cuando lo intento veo que efectivamente se ha logado corectamente, pero de ahí no pasa. ¿A alguien se le ocurre que puede pasar?, no se donde está el log de rsync así que he mirado en el syslog y messages pero no aparece nada.

    Mi otra pregutna es, si dado el gran volumen de información a sincronizar, el rsync sigue siendo viable, la primera vez tardará horas en calcular los ficheros a sincronizar, c¿ada vez que lo lance será igual?

    Muchas gracias por la ayuda.

  • Leto dice:

    Acabo de ver quee s un problema que tengo con el usuario root, tampoco me deja hacer un scp, sin embargo puedo logarme sin problemas. Bueno, dejo el tema que esto es un problema que no tiene nada que ver con rsync y no quiero ensuciarl el hilo.

    Lo dicho, muy buen manual.

  • @Leto ¡Gracias! Espero que puedas resolver fácilmente tu problema con el usuario root.

  • @ndy dice:

    Hola! m agrado tu tutorial y m ayudo a entender muchas cosas… solo tengo una pregunta… como consigo obtener un reporte detallado de lo respaldado…. a q me refiero con esto, es q tengo algunas computadoras en red, y deseo respaldar con esto, mas no sé cómo obtener, los detalles, del QUE c respaldo, CUANDO y DE QUE MAQUINA…. :S he leido que poniendo el MAILTO n el crontab, mas no hace nada…. :(

    No sé si mi pregunta sea tonta, pero es que no sé nada d linux… :$

  • tor dice:

    Excelente tutorial, muy completo.

    Salu2

  • Luis dice:

    ¡Eres un maestro!
    Super claro todo, pocas veces he visto un tutorial tan bien organizado, pensado, completo y a la vez práctico.

    Muchas gracias por hacerlo.

  • @tor, @Luis ¡Muchas gracias! :-)

  • Laura Sandoval dice:

    Super coco,

    Te escribo porque llevo dias tratando de usar rsync y no me funciona. Por fin encontre tu tutorial, donde viene bastante bien explicado, pero necesito que veas la salida de mi terminal porque no me crea el directorio backup.

    root@sunka:/home/lsandova# rsync -avz /home/lsandova/eprints/ /home/lsandova/eprints2/
    building file list … done
    created directory /home/lsandova/eprints2
    ./
    Surff.wmv
    configuracion.doc
    prueba1
    prueba2
    prueba3

    root@sunka:/home/lsandova# echo LAURA >> eprints/archivolaura
    root@sunka:/home/lsandova# rsync -avvb –delete –backup-dir=/home/respaldos/Respaldo_$(date +%y%m%d%H%M) /home/lsandova/eprints/ /home/lsandova/eprints2/
    backup_dir is /home/respaldos/Respaldo_0809241014/
    building file list …
    done
    deleting in .
    delta-transmission disabled for local transfer or –whole-file
    ./
    Surff.wmv is uptodate
    archivolaura
    configuracion.doc is uptodate
    prueba1 is uptodate
    prueba2 is uptodate
    prueba3 is uptodate
    total: matches=0 hash_hits=0 false_alarms=0 data=6

    sent 307 bytes received 78 bytes 770.00 bytes/sec
    total size is 872186 speedup is 2265.42

    root@sunka:/home/lsandova# ls ../respaldos/
    root@sunka:/home/lsandova#

    No me crea el directorio!!!! no se porque, podrias ayudarme un poco??

    Saludos! Lau

  • @Laura Sandoval Si no me equivoco, el problema es que archivolaura no existía antes. La opción de backup lo que hace es guardar los archivos que van a ser reemplazados en el directorio de backup. archivolaura en este caso no va a ser reemplazado porque no existía antes.

    Partiendo de la situación final que comentas, modifica eprints/archivolaura y vuelve a ejecutar el segundo rsync y verás cómo ahora la versión vieja sí que se guarda en el directorio de backup.

  • Laura Sandoval dice:

    Si! efectivamente si! muchas gracias por responder tan rapido!!

    Solo quiero comentarte mi situacion, yo necesito respaldar cada viernes 32 servidores, lo hacia con tar, pero obvio que mis discos de 300 gigas no estan dando abasto, por eso busque la opcion de respaldos incrementales, el punto es que los respaldos si son de archivos existentes pero tambien se van agregando nuevos archivos, porque estamos hablando de una universidad donde tenemos cursos en linea y hay maestros y alumnos subiendo tareas etc etc. Es por eso que busco que mi respaldo se haga incremental pero que tambien me guarde los archivos que son agregados. Como se haria asi?

    Aqui sigo pendiente!!

  • @Laura Sandoval Creo que no tiene mucho sentido lo que pides. Corrígeme si me equivoco. Fíjate en que tal y como está descrita la función de backup, siempre tendrás en el directorio destino la última versión de todos los ficheros. En los backups de días previos tendrás las versiones viejas que han sido modificada o los ficheros eliminados.

    Usando los directorios de tu ejemplo:

    - En /home/lsandova/eprints2/ siempre tendrás la última versión de todos los ficheros.

    - En /home/respaldos/Respaldo_0809241014/ tendrás los ficheros que habían sido modificados o borrados ese día a esa hora.

    ¿Por qué quieres que archivolaura se guarde en Respaldo_0809241014? ¡Es la última versión del archivo! Tú quieres que ese fichero se guarde como una versión previa sólo cuando alguien lo haya modificado.

  • Laura Sandoval dice:

    Mmm creo que soy mala para explicarme.

    Tratare de explicarme mejor para ver si puedes ayudarme. Necesito respaldar informacion de muchisimos directorios, que constantemente estan cambiando, cambian en contenido los archivos, pero tambien cambien en tamaNo los directorios, porque agregan mas archivos y tambien los borran y yo necesito respaldar la informacion que va cambiando cada viernes para NO hacer respaldos totales cada viernes porque se me esta saturando el espacio.

    La idea es tener de inicio un respaldo total de mi directorio, y que cada viernes que se vaya generando el respaldo de ese mismo directorio sean unicamente los cambios que tenga.

    Igual y con rsync no se pueda… igual y ando perdida en el espacio…. :(

    Lau, aqui espero….

  • @Laura Sandoval Creo que te entiendo. Tú sólo quieres lo que ha cambiado respecto a la semana anterior. Pero con la opción -b consigues exactamente lo contrario: lo que ha cambiado se mueve a otro directorio por si te hace falta.

    En tal caso, me temo que no te has estudiado la entrada bien en profundidad ;-)

    Si te fijas, las opciones:

    --compare-dest=DIR
    --copy-dest=DIR
    --link-dest=DIR

    que aparecen como actualización en la sección de “Backups incrementales”, ¡creo que son justo lo que necesitas!

    Sin embargo, ya que usas rsync, creo que tiene más lógica una política de backups en la que siempre tienes la última versión de todos los ficheros completa, y lo que vas guardando de forma separada son las versiones anteriores que es más probable que no sean necesarias. Es más fácil que los usuarios te pidan la última versión de un fichero que una vieja, y así la tendrás más a mano.

  • Laura Sandoval dice:

    Ouch! si… creo que no lei esa parte bien…
    Muchas gracias por tu ayuda, tarde un poco en responder por que tuve que moverme de aqui, pero quiero agradecerte por tomarte el tiempo de responder.

    Si me salen algunas dudas, puedo volver a preguntarte? :-/

    Saludos y que estes bien!!!

    Lau

  • Laura Sandoval dice:

    Hola

    De nuevo yo…. estoy haciendo pruebas pero no me funcionan…

    Lo que estoy viendo es que si el usuario agrega archivos al directorio, no funciona. :S

    Te detallare mi problema, apelo a tu paciencia…

    Tengo un directorio moodledata/ que mide ahorita 8 gigas y tiene a su vez directorios 1/ 2/ 3/ 4/ etc etc.. que son los cursos que tienen , cada uno de esos directorios cambia casi todos los dias, porque ahi agregan archivos o los borran. Yo tengo que respaldar ese directorio moodledata/ cada viernes, pero no solo los archvos que cambian si no tambienrespaldar los nuevos archivos que agregan.

    Hice:
    rsync -avvb –compare-dest=/home/lsandova/eprints/ /tmp/eprints/backup_$(date +%y%m%d%H%M) (es un ejemplo, no estoy en el servidor de produccion)

    En /home/lsandova/eprints/ agregue un archivo e intento que al hacer el rsync se guarde unicamente ese archivo, que claro que no lo hizo.

    Claro que ya si nos pasamos al servidor de produccion, tendria que tener una liga o no se como hacer que se relacione la copia incremental con el original… ouch! no se si me explique bien! Si no, como le haria al momento de restaurar… cual archivo es de cual directorio… :( !!!

    Helpme!!!

    Lau

  • @Laura Sandoval De verdad que no entiendo cuál es tu problema. Lo que me planteas ahora se puede solucionar muy fácilmente con -b –backup-dir, tal y como ya hemos comentábamos la primera vez.

    A ver, tú tienes un directorio llamado moodledata del que tienes que hacer backup todos los viernes y además, tienes que guardar los ficheros que han cambiado esa semana.

    Bien, pues tú el primer viernes (supongamos día 1/1/09) haces:

    rsync -avv –delete /moodledata/ /backup_de_moodledata/

    y ya tienes una copia exacta de tu directorio en /backup_de_moodledata/.

    El segundo viernes (supongamos día 7/1/09) haces:

    rsync -avvb –delete –backup-dir=/archivos_cambiados_del_090101_al_090107/ /moodledata/ /backup_de_moodledata/

    Y en /backup_de_moodledata/ tendrás como siempre una copia exacta de /moodledata/ y en /archivos_cambiados_del_090101_al_090107 los archivos modificados esa semana.

    El tercer viernes (supongamos día 14/1/09) haces:

    rsync -avvb –delete –backup-dir=/archivos_cambiados_del_090107_al_090114/ /moodledata/ /backup_de_moodledata/

    y tendrás cuatro directorios:

    /moodledata/
    /backup_de_moodledata/
    /archivos_cambiados_del_090101_al_090107/
    /archivos_cambiados_del_090107_al_090114/

    dos de ellos exactamente iguales (/moodledata/ y /backup_de_moodledata/) y los diferenciales de cada semana. Creo que es muy sencillo.

  • Laura Sandoval dice:

    Hola Super coco!

    Si, bueno… mas bien lo que yo intentaba explicar es que cuando hago esas pruebas que me enviaste si me genera esos backups de archivos cambiados, cuando cambio algun archivo, pero no sucede cuando agrego un archivo el directorio, esa era mi pregunta en el mensaje anterior.

    Si en mi directorio /moodledata tengo 1 archivo llamado prueba y le hago cambios, al hacer el rsync si se guardan los cambios, pero si a ese directorio le agrego un archivo llamado prueba2 no se guarda ese archivo en el siguiente backup, porque solo guarda o respalda los archivos que son modificados , no los nuevos, que agrego al directorio. :(

    Gracias de todas maneras! esto aun asi lo voy a usar, ya vere como le hago para que los nuevos archivos se vayan respaldando!

    Saludos desde Mexico!!!
    Lau

  • @Laura Sandoval Por qué quieres que ese fichero prueba2 que no estaba la semana anterior se copie en, siguiendo con mi ejemplo, /archivos_cambiados_del_090101_al_090107/ si ya está en /backup_moodledata/. No tendría sentido. Tú quieres y obtienes una copia exacta del original y adicionalmente, en el backup-dir pones lo que de otra forma se hubiera borrado. Sólo para que no se pierda…

  • Laura Sandoval dice:

    No no no…

    Mmmm… Los directorios /moodledata se van incrementando por nuevos ficheros, esos nuevos ficheros son los que quiero respaldar. No solo los ficheros que cambian, si no que cada dia se van agregando mas ficheros al directorio. No son los cambios que se hagan en un fichero si no los NUEVOS ficheros que agreguen.

    Que cada nuevo respaldo contenga los ficheros que han cambiado pero que tambien contenga los ficheros que han agregado en esa semana.

    Esos nuevos ficheros no estan en /backup_moodledata/ , son completamente nuevos, el dueNo de ese directorio agrego ese fichero esa semana y lo que quiero es que cada nuevo fichero o imagen o lo que sea que agreguen esa semana se respalde.

  • @Laura Sandoval Si usas -b, guardarás la versión antigua del fichero modificado y los ficheros borrados. No creo que quieras guardar la versión antigua de los ficheros modificados, los borrados y además los añadidos. No tendría sentido. Me imagino que querrás guardar la versión más nueva del fichero modificado. Para eso tendrás que usar –compare-dest, que te permitirá guardar la versión nueva de los ficheros modificados y los añadidos, perdiendo los borrados.

  • Laura Sandoval dice:

    Hola!

    Ok, este es mi ejemplo prueba:

    En /home/lsandova/eprints tengo:
    total 124
    -rw-r–r– 1 root root 101 2008-09-29 11:02 prueba3
    -rw-r–r– 1 root root 43 2008-09-26 11:42 brissa
    -rw-r–r– 1 root root 32 2008-09-18 10:17 prueba2
    -rw-r–r– 1 root root 29 2008-09-18 10:17 prueba1
    -rw-r–r– 1 lsandova usuario 104960 2008-09-08 12:06 configuracion.doc

    En /home/lsandova/eprints2:

    NO TENGO NADA Ese sera el directorio que contendra mi copia exacta, lo hago:

    #rsync -avv –delete /home/lsandova/eprints/ /home/lsandova/eprints2/

    building file list …
    done
    deleting in .
    delta-transmission disabled for local transfer or –whole-file
    ./
    brissa is uptodate
    configuracion.doc
    prueba1 is uptodate
    prueba2 is uptodate
    prueba3 is uptodate
    total: matches=0 hash_hits=0 false_alarms=0 data=104960

    sent 105242 bytes received 72 bytes 210628.00 bytes/sec
    total size is 105165 speedup is 1.00

    OK! si lo hizo bien….
    root@sunka:/home# ls -ls lsandova/eprints
    total 124
    4 -rw-r–r– 1 root root 43 2008-09-26 11:42 brissa
    108 -rw-r–r– 1 lsandova usuario 104960 2008-09-08 12:06 configuracion.doc
    4 -rw-r–r– 1 root root 29 2008-09-18 10:17 prueba1
    4 -rw-r–r– 1 root root 32 2008-09-18 10:17 prueba2
    4 -rw-r–r– 1 root root 101 2008-09-29 11:02 prueba3
    root@sunka:/home# ls -ls lsandova/eprints2
    total 124
    4 -rw-r–r– 1 root root 43 2008-09-26 11:42 brissa
    108 -rw-r–r– 1 lsandova usuario 104960 2008-09-08 12:06 configuracion.doc
    4 -rw-r–r– 1 root root 29 2008-09-18 10:17 prueba1
    4 -rw-r–r– 1 root root 32 2008-09-18 10:17 prueba2
    4 -rw-r–r– 1 root root 101 2008-09-29 11:02 prueba3

    Ok…. ahora agregare un archivo (fichero) a /home/lsandova/eprints

    root@sunka:/home# cp lsandova/instalacion_blade.txt lsandova/eprints

    Se copio, ahora quiero que ese nuevo archivo “instalacion_blade.txt” , al hacer el rsync con el –compare-dest se guarde en otro directorio que seria el respaldo incremental, solo los cambios sufridos en /home/lsandova/eprints/ se vayan almancenando diariamente en otro lugar.

    Hice esto, lo cual no funciona bien:

    rsync -avv –compare-dest=/home/respaldos/backup_$(date +%y%m%d%H%M) /home/lsandova/eprints/ /home/lsandova/eprints2

    Y claro que me hizo una copia exacta de todo otra vez en /home/lsandova/eprints2/ solo agrego ese archivo “instalacion_blade.txt” que copie en /home/lsandova/eprints/

    Bien, hare una MODIFICACION A UN ARCHIVO YA EXISTENTE

    root@sunka:/home# vi lsandova/eprints/prueba1

    Lo guardo, me salgo y hago de nuevo el rsync anterior a ver si me guarda ese archivo que modifique en el directorio /home/respaldos/backup_$(date +%y%m%d%H%M)

    root@sunka:/home# rsync -avv –compare-dest=/home/respaldos/backup_$(date +%y%m%d%H%M) /home/lsandova/eprints/ /home/lsandova/eprints2/
    building file list …
    done
    delta-transmission disabled for local transfer or –whole-file
    ./
    brissa is uptodate
    configuracion.doc is uptodate
    instalacion_blade.txt
    prueba1
    prueba2 is uptodate
    prueba3 is uptodate
    total: matches=0 hash_hits=0 false_alarms=0 data=2389

    sent 2736 bytes received 94 bytes 5660.00 bytes/sec
    total size is 107525 speedup is 37.99

    root@sunka:/home# ls -ls respaldos/
    total 0

    Y NO TENGO NADA… NI CUANDO MODIFICO UN ARCHIVO, NI CUANDO AGREGO UN ARCHIVO, LO QUE HIZO FUE GUARDAR ESE NUEVO ARCHIVO instalacion_blade.txt, en /home/lsandova/eprints2/ Y NECESITO HACER RESPALDOS INCREMENTALES DE LOS CAMBIOS QUE SUFRA UN DIRECTORIO, YA SEA CAMBIOS EN UN ARCHIVO O CAMBIOS DE AGREGAR O BORRAR ARCHIVOS EN EL DIRECTORIO, PERO NO SOBRE EL MISMO DIRECTORIO eprints2, PORQUE ME ESTA RESPALDANDO TODO DE NUEVO Y LO QUE REQUIERO ES QUE SEA INCREMENTAL.

    ESCRIBO EN MAYUSCULAS PARA QUE NO SE PIERDA LO QUE YO ESCRIBO CON LO QUE DESPLIEGAN LOS COMANDOS.

    Gracias!

  • @Laura Sandoval Tienes un error de concepto con el –compare-dest. Tienes que usar ese directorio como referencia, no como destino.

    Primer viernes 1/1/09, creamos una copia de referencia:

    rsync -avv /moodledata/ /moodledata_090101/

    Segundo viernes 7/1/09, guardamos los cambios respecto a la copia de referencia en otro directorio:

    rsync -avv –compare-dest=/moodledata_090101/ /moodledata/ /novedades_090101_090107/

  • Laura Sandoval dice:

    Ooooooooooooooohh!!!!! yes!!!

    Eso Eso! es precisamente lo que yo queria!!!

    Tan sencillo, y batalle tanto para darme a entender contigo! Muchas gracias Super Coco!

    Y tambien te ofrezco mil disculpas por entretenerte tanto con este problema!

    Gracias y estamos a la orden para lo que se te ofrezca a ti, en el correo que deje.

    Salu2!

  • @Laura Sandoval Me alegro de que hayamos podido aclarar el tema :-)

  • Laura Sandoval dice:

    Super Coco!

    De nuevo yo… solo una consulta. Hice perfectamente mi backup remoto, que por cierto duro bastante.
    Ahora ya tengo mi respaldo, solo que hoy quiero ejecutar de nuevo el rsync para ver los cambios de ayer a hoy pero como es remoto me vino la duda de
    – compare-dest=AQUI TENDRIA MI BACKUP REMOTO

    Asi lo tengo:

    rsync -avvz –compare-dest=root@148.229.0.111:/discoduro/septiembre08/pan_moodledata/moodledata_3009081056/ /home/moodledata/ /home/respaldos/novedades_011008/

    en 148.229.0.111:/discoduro/septiembre08/pan_moodledata/moodledata_3009081056/ tengo el respaldo que hice ayer, pero creo que algo me esta faltando porque no va a buscar al servidor remoto para comparar. Lo puse entre comillas –compare-dest=”root@….” pero tampoco funciono…

    Tu sabes como se hace en caso de que necesitemos comparar con una copia de referencia remota?

    Lau

  • @Laura Sandoval Lo pone en su página de man, que deberías de consultar:

    --compare-dest=DIR
           This  option  instructs  rsync  to  use DIR on the destination machine as an
           additional hierarchy to compare destination files  against  doing  transfers
           (if the files are missing in the destination directory). 

    El compare-dest estará siempre en la misma máquina que el destino de la copia. Si el destino es local, en local. Si el destino es remoto, en remoto. Por eso no te deja especificar la máquina.

  • klondike dice:

    Gracias a tu artículo yo también lo he hecho y lo he entendido, y he montado un sistema de backups en uno de mis servidores.

    Gracias :)

  • @klondike Me alegro de que te haya resultado útil :-)

  • rafa dice:

    Quien me puede ayudar con rsync. Lo configuro con el fichero que viene rsync.sh y no hay forma de que funcione.

  • Ramón dice:

    En “Linux in a Nutshell” de O’Reilly, 5ª edición, pg 391, dicen lo siguiente al explicar el comando rsync:

    If a source directory is listed with a trailing slash, the whole directory is transferred and will appear under the destination directory; if the directory is listed without the slash, its files and subdirectories will appear directly under the destination directory.

    O yo ya no entiendo el inglés, o es justo al revés. Menos mal que di con tu página. Tu explicación, que coincide y extiende la de la man, es mucho más exacta.

  • @Ramón Sí, es justo al revés. Me alegro de que esta entrada te haya ayudado a aclararlo.

  • Sergio dice:

    Vicente (¿súper coco¿)

    Después de un buen tiempo, te vuelvo a contactar (correo inicial).

    Pues bien, había dejado de lado este tema del respaldo pero, finalmente ahora en Enero, lo he vuelto a retomar.

    Antes que todo, se me había olvidado FELICITARTE por TAN EXCELENTE EXPLICACIÓN del tema.

    Finalmente hice lo siguiente:
    ——————————–

    1) En los clientes Windows, ubicados local y remotamente, “rsync” usando una combinación de “DeltaCopy” y “Cygwin”.

    2) Conexión a través de “ssh” usando el “openssh” y “ssh-keygen” que trae el “Cygwin”.

    3) TODO SÚPER BIEN. Respaldos incrementales diarios y mensuales.

    Sólo una duda … Para exportar este sistema, se hace un poco engorroso explicarle a los clientes la instalación del “DeltaCopy” y el “Cygwin”, entonces se me ocurrió en los clientes:

    - Instalar sólo el DeltaCopy.
    - Sobreescribir, en la carpeta de instalación, el directorio original con las actualizaciones de librerías que hice desde el Cygwin. Esta incluye un subdirectorio “ssh”, donde almacené el archivo de clave privada. He aquí el detalle: Al ejecutar el “rsync”, NO ME ENCUENTRA ese archivo. Sólo si uso el path que por omisión generó el Cygwin ($home/.ssh) funciona. Estoy tratando de encontrar la forma de decirle a “rsync” como encontrar dicho archivo, bajo ambiente Windows.

    Ejemplos:

    FUNCIONA (pero con el “Cygwin instalado)
    -e “ssh”

    NO FUNCIONAN
    -e “ssh -i miclave”
    -e “ssh -i c:\data\ssh\miclave”
    -e “ssh -i /cygdrive/C/Archivos\ de\ programa/Synametrics\ Technologies/DeltaCopy/ssh/id_rsa”

    ¿ Existe alguna forma que conozcan ?

    ¿ Algún tips o ayuda ?

    ¡ Muchas Gracias, de antemano !

    Sergio A. Carrasco L.

    • ¡Gracias!

      Acabo de probar a hacer desde un Windows:

      mv .ssh sshtest
      rsync -e "ssh -i sshtest/id_dsa" archivo usuario@destino:/tmp/

      y me ha funcionado sin problemas.

      No me ha quedado claro de tu explicación si estás haciendo una instalación de Cygwin convencional o si sólo estás copiando varios de sus ficheros. En el segundo caso, ten en cuenta que él trata de buscar su directorio root leyendo esta rama del registro, que se crea durante la instalación:

      HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2

      en caso contrario, el directorio raíz será C:\ y el $HOME el directorio del usuario en Windows. Pero sobre todo, la variable de entorno PATH no será efectiva, porque no encontrará /bin, por lo que tal vez tengas que poner todo el directorio en la opción -e:

      rsync -e "/cygdrive/c/cygwin/bin/ssh -i sshtest/id_dsa"
      • Sergio dice:

        ¡ Gracias MAESTRO !

        Precisamente, era eso:
        rsync -e “/cygdrive/c/cygwin/bin/ssh -i miclave”

        ¡ FUNCIONA !

        La verdad, me encuentro incómodo mezclando el “Cygwin” (Linux) con Windows. Eso de los paths “\” y luego “/”, me desorienta un poco. Como estoy en Windows, empecé asumiendo los paths “/”. Ahora, según tu ejemplo, debo agregar el estilo linux “/”. Asumo que los nombres que incluyan espacios en blanco se colocarán así “Archivos\ de\ programa”. Voy a probar de todas formas.

        Lo raro es que instalé el Cygwin ayer y NO tuve problemas con los paths, pero hoy empezó el drama, aparte que NO hallaba como darle el path para las claves al ssh.

        Probaré haciendo ahora el transplante a otro PC SIN INSTALAR el Cygwin y … veré si funciona.

        Nuevamente, muchas gracias por tu ayuda, ¡ Un abrazo !

        Atte.

        Sergio A. Carrasco L.

  • Lutero dice:

    Hola, ante todo felicitar por este pedazo de blog con su guía sobre rsync, tremenda.

    Veras, tengo un problema y es que en el curro me han pedido que traspase todo los documentos de un servidor a otro, me han aconsejado usar rsync a modo de hacer un backup en el servidor original y digamos que restaurar ese backup en el servidor destino.

    Mis dudas son muchas ya que apenas he usado nunca rsync y no se casi como va, por lo que al ver algunos de los parámetros descritos en la guía, me suenan a chino jejejejeje.

    Entonces me gustaría que me guiaras, si puedes claro, sobre como debería de hacer un traspaso de datos de un servidor a otro, están conectados por red, y pasar el backup de un equipo a otro no sería problema, creo, pero el hacer un backup de muchas carpetas con sus respectivas subcarpetas y pasarlo a otro equipo me desconcierta.

    A ver si es posible y me podéis dar unos primeros pasos de como crear un backup de varios directorios desde la / y como hacer que guarden sus, creo que se llaman vínculos, a otros archivos o scripts.

    Muchísimas gracias ante todo.
    Un saludo.

  • Xavi dice:

    Fantástico tutorial!

    A ver si alguien me quita de la cabeza que lo que necesito se puede hacer con rsync.

    Un equipo remoto con un espacio de almacenamiento limitado genera diariamente cierta información que quiero, periódicamente, ir copiando a un servidor con mayor capacidad. Para ser exactos, no quiero copiar si no mover os datos.
    rsync tiene la opción –remove-source-files que, como dice el propio man, no borra directorios.
    Ahí está el problema…¿no podré borrar directorios (incluso vacíos!) con rsync?
    ¿Tendría que utilizar algo como “find $ORIGEN -exec mv {} $DESTINO \;”?
    ¿No es más eficiente el algoritmo del rsync para borrar un fichero ya copiado que con el comando mv?

    Gracias por responder y saludos

    Xavi desde Gràcia

    • Yo personalmente no le veo mucho sentido a usar rsync para lo que comentas. Si no me equivoco, la idea de rsync es tener ficheros y directorios sincronizados en dos sitios distintos, no moverlos de un sitio a otro.

      Para hacer lo que tú quieres hacer, yo montaría el sistema remoto con Samba o con NFS y haría simplemente un mv.

      Si aún así quieres hacer un rsync, hazlo y después borrar el directorio que contiene los ficheros y directorios en origen con rm -rf. ¿No te sirve eso?

  • Xavi dice:

    Tienes razón en cuanto que la idea del rsync es sincronizar remotamente dos sistemeas de ficheros.
    Entrar a discutir el funcionamiento del find y del mv quizás no sea el tema de este post, pero puede ser un ejercicio interesante para muchos.
    Lo que ocurre con la expresión “find $ORIGEN -mtime -15 -exec mv {} $DESTINO \;” (he añadido el modificador -mtime) es que si quiero mover solamente las carpetas que contienen ficheros con una fecha anterior a 15 dias, lo que hace es mover las carpetas con la fecha de último acceso anterior a 15 días (aunque los ficheros tengan una fecha posterior). Es por este motivo que estaba buscando alguna alternativa, como rsync.
    En la página oficial de rsync vi un hilo donde alguien pedía que se incluyera la opción de borrar carpetas en el origen (como hace –remove-source-files pero con carpetas).

    Por cierto, aunque con un día de retraso, felicidades por los 2 añitos!

    • Creo que ya entiendo lo que quieres hacer. Supongo que se podría hacer con un poco de scripting. No creo que se pueda hacer fácilmente con un sólo comando, pero si lo consigues, ya nos contarás. Me temo que ahora mismo no puedo sugerirte nada más.

      ¡Gracias!

  • Mstaaravin dice:

    Te voy a decir una cosa, el dia que vengas a argentina, te voy a llevar a comer un asado en el mejor lugar de Bs. As. o te pago unos dias en una estancia de la provincia de Buenos Aires.

    Te felicito por como publicas, la dedicacion que le das a todos los proyectos, uso rsync intensivamente todos los dias y en clientes mios.

    Mas que nada, felicitarte por el entusiasmo que generas en la gente.

    Cordiales Saludos

  • Skatox dice:

    Excelente artículo, muy bueno.

Trackbacks y pingbacks:

Tema LHYLE09, creado por Vicente Navarro