Porque todo el mundo cree que tienes sus datos seguros… hasta que los pierde. Y yo los he perdido. 1TB ¬¬
Lo irónico, es que yo SÍ era consciente de la situación, y estaba a punto de configurar el sistema para dejar un disco duro de 500gb como almacén para los backups… Además, ya había recibido varias alarmas (en el pasado) de que podía perder fácilmente muchos datos, y entre exámenes y falta de tiempo he ido diciendo… “ya lo configuraré cuando terminé los exámenes” y cosas por el estilo.
Bien. Pues si se tienen datos que se consideren importantes (porque las series, pelis, música, siempre se pueden bajar de nuevo, pero cosas propias… no), sería cuestión de valorar si necesitamos copias de seguridad o no.
Lo más fácil es ir guardando cada X tiempo cosas en un DvD, pero si lo queremos organizar un poco mejor… podemos utilizar rsync, un comando estándar en unix que sirve perfectamente para esto.
Solución rápida:
rsync -au --delete /directorio/de/origen /directorio/de/destino/ |
Con esto conseguimos hacer una copia de seguridad incremental del directorio de origen al de destino. Podemos ejecutarlo las veces que queramos, que solo se copiarán los archivos nuevos, borrando del directorio de destino los que se hayan borrado del origen siempre que no sean más nuevos.
Mete eso en un crontab para que se ejecute todas las noches, y listo.
Solución detallada:
Con el parámetro -a, es como si pusiésemos -rlptgoD. Una manera rápida de decir que se aplique recursión en directorios y que se preserve prácticamente todo (permisos, fecha de modificación, grupo, propietario, etc).
Con --delete estamos diciendo que también se sincronicen los archivos borrados. Es decir, si borramos un archivo en el directorio de origen, también se borrará en el de destino si existía de un backup anterior. Es muy útil porque lo que hacemos es crear una copia exacta, sin dejar archivos residuales.
Con el parámetro -u indicamos que no queremos borrar los ficheros del directorio de destino que sean más nuevos que los del de origen que hayan sido borrados. Por si trabajamos sobre el directorio de destino (sobre el backup) y luego borramos ese fichero en el de origen.
Con esto tenemos ya un comando bastante decente, que podemos hacer que cron lo ejecute, por ejemplo, cada día a las 5 de la mañana (para que nos pille durmiendo y no moleste), simplemente añadiendo la siguiente linea en el crontab (ejecutando crontab -e editamos el fichero de crontab):
0 5 * * * rsync -au --delete /directorio/de/origen /directorio/de/destino/ |
Por supuesto, intentad tener el directorio de destino en otro lugar distinto al de origen, como por ejemplo un disco duro que solo uséis para hacer backups y nada más (vamos, que no se menee mucho y se pueda romper fácilmente).
Luego también tenemos muchas opciones más, como por ejempo, que los ficheros que se borren con el --delete no se borren de verdad en la copia de seguridad, sino que sean movidos a otro directorio de backup. Esto lo conseguimos añadiendo -b y --backup-dir=$PWD/backup_$(date +%y%m%d)
Así especificamos que el directorio de backup sea un directorio dentro de cada directorio con el prefijo backup_ y la fecha. Por ejemplo backup_091003.
Con esto conseguiríamos tener todas las versiones de cada fichero antes de ser borrado, y que se puedan consultar. Ocuparía más espacio, pero también podemos recuperar archivos de otros días si nos arrepentimos de haberlos borrado
Aquí vemos un ejemplo de todo lo explicado:
Tenemos un directorio (llamado original) del que queremos hacer la copia de seguridad:
$ ll original/
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 15:32 f1
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 01:42 f2 |
Así que la hacemos:
$ rsync -avb --delete --backup-dir=$PWD/backup_$(date +%y%m%d) original/ backup
sending incremental file list
./
f1
f2
sent 154 bytes received 53 bytes 414.00 bytes/sec
total size is 0 speedup is 0.00
$ ll backup/
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 15:32 f1
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 01:42 f2 |
Ahora, borramos el fichero f1 del directorio original… y volvemos a hacer una copia de seguridad.
$ rm original/f1
$ rsync -avb --delete --backup-dir=$PWD/backup_$(date +%y%m%d) original/ backup
sending incremental file list
./
deleting f1
sent 65 bytes received 15 bytes 160.00 bytes/sec
total size is 0 speedup is 0.00 |
Y podemos comprobar, que también se ha borrado de backup, pero se ha creado un directorio llamado backup_091003 donde se ha guardado este fichero borrado:
$ ll backup
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 01:42 f2
$ ll backup_091003/
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 15:32 f1 |
Modificando el funcionamiento por defecto de rsync:
Por defecto, rsync considera nuevo los ficheros para ser copiados comparando la fecha y el tamaño, aunque podemos modificar este comportamiendo, haciendo que haga un checksum con la opción -c
A la hora de copiar un archivo, aunque el cambio sea muy pequeño (p.e. un archivo contenía “12345678″ y le añadimos un 9 para que valga “123456789″), rsync lo copia entero (en este caso 9 bytes) ya que funciona por defecto con la opcíon -W (–copy-whole-file). Podemos hacer que copie la parte diferente solamente (1 byte) con la opción –no-whole-file (que no copie el fichero entero vaya xD). Aunque generalmente el cálculo de la diferencia supone una carga mayor que la copia del archivo completo
También podemos hacer que se compriman los ficheros antes de copiarlos con la opción -z, lo que conlleva en un mayor uso de CPU aunque se tarde menos la copia. Puede ser útil a la hora de pasar archivos entre máquinas remotas.
Copiando archivos entre máquinas remotas:
¿Y si queremos mandar o traernos las copias de seguridad desde otro ordenador, o algún servidor que tengamos por ahí?
Pues exáctamente igual, solo que la ruta la especificamos de la siguiente manera:
usuario@host:/ruta/del/directorio |
Como por defecto se usa ssh (ergo scp), conviene tener configurado ssh de manera que podamos hacer login de forma transparente. Esto es, dejando configurado los archivos ~/.ssh/config y las claves públicas y privadas para que no tengamos que escribir la contraseña.
Esto último no tengo ganas de explicarlo, que no tiene que ver con rsync, pero podéis consultar esos dos links del párrafo anterior, que viene todo muy clarito
Recent Comments