Linux :: script para crear backups y almacenarlos en la nube con Dropbox Imprimir
Tutoriales

articulo_backup

El objetivo de este tutorial es hacer una copia de seguridad (backup) de nuestros archivos y carpetas más importantes, comprimirlo y cifrarlo y colocarlo en la nube, y ello sin que se requiera más intervencion por nuestra parte que lanzar el script.

Este tutorial está basado en el artículo escrito por Mark Strawser (Ottermaton) en la wiki de bodhi linux (en inglés) con algunas aportaciones propias.

El ejemplo, a grandes rasgos, va a ser la creación de un backup de la configuración del usuario en mi sistema bodhi linux utilizando tar, comprimirlo y cifrarlo con p7zip y colocarlo en la carpeta de Dropbox.

Con carácter previo, necesitamos tener instalados dos programas:

- p7zip: es la versión para Linux y en línea de comandos del popular compresor 7-Zip, disponible solamente en Windows. Con p7zip podrás crear archivos comprimidos, añadir y quitar ficheros a un paquete ya comprimido, descomprimirlo, ver su contenido o comprobar si funciona correctamente, entre otras funciones.

Para instalarlo busca p7zip-full en synaptic o en una terminal escribe:

sudo apt-get install p7zip-full

- Dropbox: Es seguramente el sistema de almacenamiento en la nube más popular. Dropbox ofrece, de forma gratuita, 2Gb de almacenamiento en la nube y necesitarás registrarte en su web para crear tu cuenta. Una vez hecho esto, puedes instalar Dropbox. Si utilizas bodhi linux, escribe en una terminal:

sudo apt-get install bodhi-dropbox

Cuando la instalación haya terminado, escribe en la terminal

dropbox

Esto hará que se descargue el resto del software de Dropbox y te guiará por el proceso de configuración. También se creará la carpeta Dropbox en tu directorio de usuario, que es donde deberás guardar los archivos que quieras tener en la nube.

En el caso de que tu distro de Linux sea otra, por ejemplo ubuntu, busca con google "instalación de dropbox en ubuntu" y sigue las instrucciones. Hay un montón de páginas con información al respecto.

También debemos tener dos carpetas: una que se llame backup_tmp y otra dentro de Dropbox que se llame backups. Las podemos crear con un navegador de archivos o escribiendo en una terminal:

mkdir backup_tmp Dropbox/backups

Si te interesa, abre un editor de texto (yo uso gedit), copia el texto del script que aparece más abajo y pégalo en gedit.

El script completo:

#!/bin/sh
filename="backup-$(date +%Y%m%d).tar"
username="$(whoami)"
tar -cf /home/$username/backup_tmp/$filename -C /home/$username/ docs bin .e .local .config .mozilla --exclude "Cache" --exclude "Trash"
7z a /home/$username/Dropbox/backups/$filename.7z -mhe=on -pclavesecreta /home/$username/backup_tmp/$filename 
rm /home/$username/backup_tmp/$filename 
find /home/$username/Dropbox/backups/ -type f -mtime +2 -name 'backup-*' -delete

Desglose del script y explicación de cada línea:

Línea 1: #!/bin/sh

Es la cabecera necesaria para los scripts.

Línea 2: filename="backup-$(date +%Y%m%d).tar"

Crea la variable filename que contendrá el nombre que le daremos al archivo. Este nombre será en parte fijo y en parte autogenerado:
- La parte fija será el comienzo (backup- ) y el final (.tar).
- La parte generada será la fecha de creación en números: $(date +%Y%m%d). El formato de la fecha será año, mes y día.

Las ventajas de este sistema de una parte fija y otra generada son:
- Que los backups de diferentes días tendrán automáticamente nombres distintos y no se sobreescribirán.
- Puedes nombrar diferentes backups si modificas el script o si lo utilizas en varios ordenadores. Por ejemplo cambiando la parte fija del comienzo (backup-) por otra (backup-netbook-) en el script que tengas en un portatil y por (backup-computer-) en el script que tengas en el ordenador de sobremesa podrás tener ambos en la misma carpeta de Dropbox sin correr el peligro de que se sobreescriba nada. En el caso de que optes por esta variante, lee lo referido en el comentario a la línea 7.

Línea 3: username="$(whoami)"

Creamos la variable que contendrá el nombre del usuario que ejecutará el script. Así hacemos que el script sea portable y utilizable por cualquiera.

Línea 4: tar -cf /home/$username/backup_tmp/$filename -C /home/$username/ docs bin .e .local .config .mozilla --exclude "Cache" --exclude "Trash"

Aquí creamos un archivo sin comprimir en formato .tar que empaqueta las carpetas que queremos incluir en el backup. Es la pieza central del script ya que aquí definimos qué queremos incluir y qué excluir del backup.

Voy a explicar con más detalle cada una de las partes de este comando:

1. tar -cf: Esta orden crea un archivo en formato .tar sin compresión.

2. /home/$username/backup_tmp/$filename: Esta será la ruta y el nombre del archivo que se guarde en formato .tar. Aquí estamos utilizando las variables que hemos creado antes (username y filename) para que el script trabaje automáticamente. Por ejemplo, si tu nombre de usuario es juan y hoy fuese 19/5/2011 el archivo se guardaría en /home/juan/backup_tmp y se llamaría backup-20110519.tar.

3. -C /home/$username/: Así le decimos a tar de qué directorio vamos a elegir las carpetas que vamos a incluir en el backup. En este caso volvemos a usar la variable username que siguiendo con el ejemplo anterior sería /home/juan/.

4. docs bin .e .local .config .mozilla: Esta es la relación de directorios que vamos a incluir en el backup. Sólo hay que poner el nombre de la carpeta que queremos incluir en el backup y separar cada nombre con un espacio.
Deberéis modificar este apartado si queréis que vuestro backup incluya otras carpetas o archivos. En este caso, como estoy haciendo una copia de la configuración, incluyo carpetas ocultas (empiezan por un punto) que contienen la configuración de mi usuario, escritorio y de firefox, ademas de mi carpeta de documentos (docs) y de scripts (bin).

5. --exclude "Cache" --exclude "Trash": Esta es la relación de carpetas que se encuentran dentro de los directorios que he elegido y que quiero excluir. Cada carpeta a excluir debe ponerse de forma individual de este modo --exclude "nombre de carpeta". No hace falta escribir la ruta completa a la carpeta; sólo su nombre. En este ejemplo he excluido la carpeta Caché que se refiere a la caché de firefox y Trash que se refiere a la papelera del sistema, carpetas que no me interesa incluir en el backup.

Línea 5: 7z a /home/$username/Dropbox/backups/$filename.7z -mhe=on -pclavesecreta /home/$username/backup_tmp/$filename

Aquí comprimimos y ciframos el archivo .tar utilizando p7zip y lo colocamos en la carpeta de backups de Dropbox, que se encargará automáticamente de subir el archivo a la nube y, en su caso, sincronizarlo con el resto de los equipos que tengas.

Veamos este comando con más detalle:

1. 7z a: Esta orden crea un archivo comprimido con formato .7z.

2. /home/$username/Dropbox/backups/$filename.7z: Esta será la ruta y el nombre del archivo que se guarde en formato .7z. Volvemos a utilizar las variables username y filename para que el script trabaje automáticamente y le añadimos a filename .7z para que el archivo resultante tenga la extensión .7z. Por ejemplo, si tu nombre de usuario es juan y hoy fuese 19/5/2011 el archivo se guardaría en /home/juan/Dropbox/backups y se llamaría backup-20110519.tar.7z.

3. -mhe=on: Activa la encriptación de encabezados de archivos.

4. -pclavesecreta: Activa la encriptación y protección de los datos con la contraseña que se establece seguido de -p. Por ejemplo, si la contraseña que queremos utilizar fuera 345y@j%f0, en el script pondríamos -p345y@j%f0.

5. /home/$username/backup_tmp/$filename: Es el fichero .tar que vamos a utilizar para crear el .7z.

Línea 6: rm /home/$username/backup_tmp/$filename:

Con esta orden borramos el archivo .tar, ya que nos basta con la versión comprimida con p7zip.

Línea 7: find /home/$username/Dropbox/backups/ -type f -mtime +2 -name 'backup-*' -delete:

La última línea busca en el carpeta backups de Dropbox cualquier archivo que comience por "backup-" y lo borra si tiene una antiguedad mayor a dos días. Una elegante solución de Mark para no congestionar la carpeta y mantenerla lo más vacía y ligera posible.

Ten en cuenta que si has cambiado el nombre del archivo en la primera línea del script como en el ejemplo de tener el script en varios ordenadores (backup-netbook- y backup-computer-), aquí también deberías cambiar esta última línea para mayor seguridad.

En el caso del portátil sería:
find /home/$username/Dropbox/backups/ -type f -mtime +2 -name 'backup-netbook-*' -delete
Y en el caso del sobremesa:
find /home/$username/Dropbox/backups/ -type f -mtime +2 -name 'backup-computer-*' -delete

Pasos finales: guardar el script, convertir en ejecutable y ejecutarlo.

El script lo guardamos en un archivo al que podemos llamar, a tíutlo de ejemplo, "backup.sh".

Para hacer ejecutable el script escribimos este comando en una terminal (estando situados en el directorio donde está el archivo):
chmod 755 backup.sh

Para ejecutar el script (desde el directorio donde está el archivo backup.sh):
./backup.sh

Al ejecutarlo el script automáticamente empaquetará los archivos y carpetas que le hayamos dicho en la línea 4 en un archivo .tar, lo comprimirá y encriptará con la contraseña que le hayamos dado en la línea 5 y esto lo hará en la carpeta de backups de Dropbox, que lo sube a la nube. Luego borrará el archivo .tar que ya no nos sirve y buscará algún backup viejo que deba ser eliminado en la carpeta de Dropbox para limpiarla.

Para recuperar el backup:

Atención, importante: esto restaurará tus archivos del backup y por tanto sobreescribirá los archivos nuevos que tengan el mismo nombre antes de la restauración.

Copiamos el archivo de backup que queremos recuperar a nuestro directorio personal, bien con un administrador de archivos o desde la terminal.
cp Dropbox/backups/backup-20110519.tar.7z ~/

Si no la tenemos abierta, abrimos una terminal y escribimos:
7z x backup-20110519.tar.7z

Nos pedirá la contraseña, la escribimos y pulsamos enter, en el caso del ejemplo 345y@j%f0.

Con esto nos desencriptará y descomprimirá el archivo, dejándonos el archivo .tar como resultado.

Para desempaquetarlo y restaurar así finalmente el backup, escribimos:
tar xf backup-20110519.tar

Y listo.

Algunas aclaraciones sobre las modificaciones que he realizado al script original.

En el tutorial de Mark el archivo de backup se creaba usando tar y gzip, con lo que resultaba un archivo con la extensión tar.gz. Estos archivos tienen un volumen mayor (el formato .7z comprime más) y no admiten encriptación directa (el formato .7z sí la admite).

Comencé intentando una solución que iba por dos caminos, usando en primer lugar un compresor mejor (bzip) que generaba archivos de un tamaño menor y bcrypt para encriptación, pero al utilizar este último el script se tenía que ejecutar en consola ya que bcrypt requiere que el usuario escriba la contraseña dos veces y por eso era necesaria la intervención del usuario en el proceso.

Buscando compresores pensé en utilizar p7zip y leyendo su manual encontré la solución, ya que permite encriptar el archivo y las cabeceras, pudiéndose fijar la contraseña en el mismo script, con lo que ya no necesitaba bcrypt y el proceso volvía a ser automático sin requerir intervención del usuario.

Hice una prueba de compresión entre .bz2 y .7z y los resultados me convencieron: frente a un backup que ocupaba 160 Mb en formato .tar, comprimiéndolo con .bz2 tenía un archivo de 81 Mb mientras que haciéndolo con .7z el tamaño era de 60 Mb. Son 21 Mb que no hay que subir ni bajar de Dropbox.

El backup completo podía haberse realizado con p7zip, en el sentido de evitarnos crear el archivo .tar, pero, como se indica en el manual, el formato .7z no guarda los datos de propietario y grupo de los archivos y no se recomienda su uso en linux para hacer backups. Por eso sigo usando tar para empaquetar todo lo que integra el backup y luego p7zip para comprimirlo y encriptarlo.

Actualmente se habla sobre la falta de privacidad en Dropbox. En realidad, cualquier cosa que tengamos en internet es vulnerable así que ponérselo más difícil a los que quieren la información ajena también es algo corre de nuestra parte (y a veces sólo de la nuestra).

En el tutorial de Mark el archivo .tar.gz se creaba directamente en la carpeta de Dropbox, en mi caso he preferido establecer una carpeta local para crear el backup y una vez creado, comprimido y encriptado, borrar el .tar original. Dado que creamos el archivo .tar en una carpeta temporal en local, descargamos de trabajo innecesario a Dropbox dejando en éste sólo el backup terminado.

En el caso de que vuestro archivo de backup sea muy grande y queráis partirlo en volúmenes más pequeños, cosa que ocurre a veces con los backups, p7zip también permite hacerlo incluyendo el modificador -v{tamaño}[b|k|m|g], de forma que si quisieramos que cada volumen tuviera 700 Mb, lo que escribiríamos sería -v700m. Las letras b,k,m y g corresponden a byte, kilobyte, megabyte y gigabyte.

La línea 5 de nuestro script pasaría de ser:

7z a /home/$username/Dropbox/backups/$filename.7z -mhe=on -pclavesecreta /home/$username/backup_tmp/$filename
A
7z a /home/$username/Dropbox/backups/$filename.7z -mhe=on -pclavesecreta -v700m /home/$username/backup_tmp/$filename

Los archivos así generados tendrán la extensión .tar.7z.001, .tar.7z.002, etc.

Espero que el script os sea útil. Nos vemos.

Comentarios (3)