Escrito el 2 mayo 2013 por Luis Ignacio Díaz Martínez
Tabla de contenidos
Normalmente en nuestro día a día no imaginamos que por medio de algún tipo de desastre que desconozcamos podamos llegar a perder toda la información que con tanto cariño hemos conseguido recopilar en nuestros discos duros, como por ejemplo nuestras fotografías o nuestros proyectos.
Tenemos que ser conscientes de que los soportes de almacenamiento digital no son 100% fiables y que por lo tanto pueden fallar. Así que es recomendable tener una unidad de soporte y realizar copias de seguridad programadas y de forma automática evitando así descuidos.
En GNU/Linux tenemos múltiples utilidades que nos ayudan a realizar este tipo de tareas, la más extendida y conocida se llama RSync que nos permitirá sincronizar dos directorios de forma automática y con una serie de opciones que nos facilitará alguna que otra tarea.
Voy a realizar todo esto bajo una distribución GNU/Linux ( Debian 6 ) y con dos discos duros de 1TB cada uno conectados por medio de los puertos USB.
Como nota complementaria, esta máquina realiza tareas de servidor tales como: web, compartición de ficheros, descarga de torrents…
Esto tiene que quedar claro! RSync sincronizará un directorio (en nuestro caso la raíz del disco duro) con otro directorio… y gracias a la automatización de procesos (cron) conseguimos que cada «X» tiempo ejecute esta sincronización.
Si queremos que los discos estén sincronizados de forma automática e instantánea no necesitamos una sincronización de directorios lo que necesitaríamos en este caso es un Raid1 (modo espejo).
En un entorno empresarial se recomienda tener las dos opciones implementadas, la explicación es sencilla.
Si tenemos dos discos de 1Tb en funcionamiento y uno de ellos se cae el otro seguirá funcionando de forma continuada sin afectar al sistema ya que al estar en Raid1 el disco dañado se desconecta y el bueno sigue funcionando… a esto se le denomina sistemas de alta disponibilidad ya que la máquina cuenta con un sistema de no parada y funcionamiento tras un error cíclico (disco duro).
No obstante, si nosotros como usuarios eliminamos un documento con el raid1 no podremos recuperarlo ya que al ser un espejo el también lo habrá eliminado. Por ello utilizamos copias de seguridad incrementales permitiendo así tener los archivos eliminados temporalmente en nuestra copia.
Existen muchas formas de realizar copias de seguridad, normalmente se utilizan varios tipos de sistemas mezclados como el caso de utilizar un incremental cada dos horas y un total cada semana. El problema de esto es que necesitamos una gran cantidad de almacenamiento para albergar dicha información.
No obstante si la empresa tiene información delicada no le importará gastarse el dinero en unos cuantos discos duros que puedan contener de forma eficiente las copias de seguridad necesarias para su infraestructura.
Aquí podríamos extendernos más y más… pero vamos a ir directamente a lo más básico! a sincronizar dos directorios de forma sencilla y rápida… podemos realizar dos tipos de sincronización… incremental o en modo mirror… que vamos a ver a continuación.
Este método es el más básico… sencillamente copiaremos ( sincronizaremos ) los archivos de un directorio a otro. En mi caso los dos directorios hacen referencia al punto de montaje raíz de los dos discos duros. Este tipo de sincronización es incremental ya que en ningún momento eliminaremos ningún dato del destino.
1 |
rsync -avz --progress /media/HDD1/ /media/HDD3/ |
Explicaré la sintaxis del domando:
Este tipo de copia será incremental… quiere decir que los datos del destino que no están en el origen no serán eliminados, y que por lo tanto tendríamos acceso a los archivos que ya están borrados en el origen.
Quizás lo nombrado anteriormente nos servirá perfectamente si no queremos tener una copia exacta… conservando así en la copia de seguridad los archivos que hemos eliminado… renombrado… si tenemos espacio suficiente en el disco duro podemos incluso tener el sistema anterior más el sistema a continuación descrito combinados… consiguiendo así por ejemplo que cada día se realice una copia sin la eliminación en el destino y una vez por semana elimine los archivos que no se encuentran en el origen… es una buena práctica por si somos muy despistados y tardamos en ver la que hemos liado…
A continuación vemos como eliminar los archivos del destino que no se encuentran en el origen:
1 |
rsync -avz --progress --delete /media/HDD1/ /media/HDD3/ |
Sencillamente hemos introducido el parámetro «–delete«.
Si no queremos perder los permisos que tienen asignados los archivos… podemos utilizar los siguiente parámetros de RSYNC:
1 |
<b>sudo rsync -va -H -A -X /mnt/VIEJO/ /mnt/NUEVO</b> |
Con ello mantendremos los permisos de usuarios asignados a los ficheros.
Ahora vamos a intentar automatizar todo este proceso… para ello como realizaremos varias copias de seguridad de distintos tipos creamos un script que englobe todas estas acciones… donde lo llamaremos «local_backup.sh».
Por lo tanto primero crearemos un script básico con el siguiente contenido:
1 2 3 |
mkdir /etc/bashtools cd /etc/bashtools nano local_backup.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash hdd1="sdd1"; #Local disk HDD1 hdd2="sdc1"; #Local disk HDD3 www_dir="/home/web"; #Directory web server date_log=`date +"%y/%m/%d_%H-%M-%S"`; hdd1_out=`cat /proc/mounts | grep $hdd1 | cut -d" " -f2`; hdd2_out=`cat /proc/mounts | grep $hdd2 | cut -d" " -f2`; if `test ! -z "$hdd1_out" -a ! -z "$hdd2_out"` then tar -zcvf $hdd1_out/__backup/Local/www_`date +"%y%m%d-%H%M%S"`.tar.gz $www_dir rsync -avz --progress --delete-after $hdd1_out/ $hdd2_out/ echo "[local_backup:$date_log:Success] Copias realizadas" >> /var/log/bashtools else echo "[local_backup:$date_log:Error] HDD no montados" >> /var/log/bashtools fi |
Primero de todo vamos a definir las unidades de almacenamiento. La primera, será el origen y la segunda será el destino. Después comprobamos que estas unidades están montadas en el sistema y por lo tanto operativas. Si no es así, creará un log donde se almacenará el error correspondiente.
Después empaquetaremos el directorio donde almaceno mis proyectos (directorio web). A continuación lo copio a una ruta del disco origen.
Ahora toca la parte importante… nuestro script se ejecutará de forma automática gracias a la ayuda de cron. Cron es un pequeño programa que automatiza procesos por nosotros, definiendo así en su sintaxis de ejecución cuando y que se tiene que ejecutar. Para nuestro caso particular vamos a realizar lo siguiente:
1 |
crontab -e |
Y añadimos lo siguiente al final del documento
1 |
0 10 * * * bash /etc/bashtools/local_backup.sh |
Y guardamos el documento como si estuviéramos editando con nano ( control + o ).
Sencillamente hemos indicado que:
Seamos conscientes de la hora que introducimos en el cron, que sea una hora en la cual el sistema esté iniciado!
Estas son las referencias que he utilizado para redactar este artículo…