Skitergia

Parametrizando el mundo



BackUps a disco con Rsync (Windows y Linux)

by Skiter on 6 mayo, 2011

Hace un par de semanas perdí­ un disco duro USB de 2.5″ que llevaba a todas partes conmigo y contenia un archivo encriptado con TrueCrypt con todos los datos de clientes y proyectos. El disco salió vol ando, chocó contra el suelo y adiós datos. Por fortuna solia hacer copia de seguridad  del archivo encriptado de 100GB cada mes aproximadamente. Aparentemente suficiente pero, después de casi un mes de locura y recuperación del trabajo perdido, he aprendido que no es suficiente.

La solución era montar un sistema de copias de seguridad automatizado, que realizase las copias en lapsos de tiempo mucho mas pequeños. El problema es que copiar cada hora 100 GB de datos es imposible. La solución vino dada por Rsync, un programita nativo de Linux que, gracias a las librerias de CygWin, dispone de una versión compilada para Windows. Hay multitud de tutoriales por ahí­ que explican como usarlo, instalarlo y configurarlo. Yo no voy a reinventar la rueda. Sólo a explicar la solución que he planteado, principalmente para acordarme más adelante, pero también por si a alguien le sirve de utilidad

Nota Previa Importante : Rsync permite realizar sincronizaciones incrementales de archivos entre directorios locales y remotos. Aqui sólo voy a plantear la sincronización local entre dos unidades encriptadas con Truecrypt en dispositivos diferentes (portatil y USB).

Para utilizar Rsync de forma local no hace falta instalarlo como servidor en las maquinas destino. Si bien esto restringe el uso de determinadas funciones (como las rutas rsync://), la mayorí­a de funcionalidades se mantienen y la operatividad es plena. Para una utilización local en Windows únicamente hacen falta el ejecutable (rsync.exe) y las librerias cygwin1.dll y cyggcc_s-1.dll disponibles en el paquete de CygWin (hay multitud de fuentes en internet. Yo dejo aquí­ colgado el paquete mí­nimo utilizado en este tutorial).

Al ser un com ando nativo de Linux, las rutas locales plantean son un problema, ya que en linux se utiliza una notacion similar al est andar POSIX (el “\” de windows es “/” en linux). Esto se soluciona con la libreria cygwin1.dll que simula una instalacion de cygwin y utiliza las referencias de linux (“/”) para trabajar, pero enlaza con las rutas locales de windows referenciadas con “\”. Además, la implementación de Rsync incluye un parseador que traduce las rutas de “\” a “/” (me ha dado algunos problemas con rutas complejas y nombres de archivo).

Las unidades de disco, en Windows se representan con la letra y los dos puntos (C:\, D:\, etc). La libreria de Cygwin nos ayuda con esto tambien traduciendo cada unidad como una ruta de linux (C:\ se convierte en /cygwin/c/, por ejemplo).

Con todo esto, la utilización de Rsync queda configurable en ambos sistemas exactamente de la misma forma, por lo que para hacer cualquier otra configuración sólo hay que ir a la documentación o a los múltiples tutoriales existentes. En el com ando de arriba:

COMANDO BíSICO:

rsync “origen” “destino

(las comillas no son obligatorias, pero si utiles en windows para las rutas con espacio)

OPCIONES:

-a: modo archivo. Compara y copia archivos con archivos, no directorios entre si.

-u: actualizar. Si en el destino hay un archivo con una fecha de edición posterio al que queremos copiar, no lo sobreescribe. Esto puede dar problemas de actualización si se utiliza y sincroniza el dispositico con más de una fuente.

-b: BackUp. Si actualiza un archivo con una nueva versión posterior, hace copia de seguridad del mismo y le añade un sufijo (~por defecto, pero también configurable). Si en el origen se elimina un archivo, en el destino se elimina también, pero se deja una copia con sufijo, como backup. Es muy util para tener las dos ultimas versiones de un archivo y para prevenir borrados accidentales.

–sufix: sufijo definible para sustituir a la ~ para los archivos de copia de seguridad. Es altamente recomendable de utilizar en sistemas Windows, ya que es muy complicado hacer busquedas de archivos que contengan ~ para localizar los archivos de backup.

-r: recursivo. Actualiza todo, desde el directorio principal que le damos, por todos sus subdirectorios hacia abajo.

-p: mantiene los atributos de permisos del archivo copiado. Si se va a utilizar tambien en sistemas Linux es conveniente añadir tambien las opciones -o (de owner) y -g (de group), para mantener los atributos completos de los archivos.

-t: mantiene los atributos de tiempo de modificación del archivo copiado.

-P: progreso. Con cada archivo que copia o actualiza, muestra una barra de porcentaje durante el proceso. Es más util para transferencias por red.

-h: escribe los datos por pantalla más amigables (en Kbs, Mb, etc…). Combiar siempre con más opciones porque suelto muestra la ayuda.

–logfile: ruta al archivo de log donde se escribirán las acciones que se vayan realiz ando.

–delete: borrado. Es la opción que permite eliminar un archivo en el origen y que al actualizar la copia de seguridad, se actualice la eliminación también. Si se combina con la opcion de -b (de backup), actualiza elimin ando, pero guarda una copia, por si acaso.

–stats: estadisticas. Al terminar la actualización presenta un pequeño resumen de actividad (archivos copiados, tiempos empleados, tamaño total de arcvhvos actualizados, etc…)

–fake-super: opción MUY IMPORTANTE en Windows. Rsync utiliza archivos temporales para realizar las sincronizaciones (que luego elimina). Junto con el cambio de las fechas de acceso de archvos, en los sitemas Windows son tareas que requieren privilegios de administrador. Si no se utiliza esta opción la actualización se realiza correctamente, pero se obtienen mensajes de error con cada transferencia realizada. Muy incomodos y feos de leer. Mejor usarla.

–exclude: opción muy recomendable en  Windows para las papeleras, si se van a utilizar sincronizaciones de unidades completas (como en este ejemplo, que sincronizamos unidades virtuales de TrueCrypt entre si). Windows guarda en un directorio oculto ($RECYCLE.bin) las copias de los archivos que eliminamos parcialmente, con referencias aleatorias suyas, hasta que vaciamos la papelera. Rsync al eliminar archivos en las sincronizaciones los m anda a estas papeleras por lo que, si no las excluimos, se sincronizarán entre si, aument ando su tamaño exponencialmente y reduciendo el espacio disponible en las unidades, además de ir tard ando cada vez más en completarse, al haber más archivos.

Un detalle importante es la barra final del path “/” que SI aparece en la ruta de origen, pero que NO debe aparecer en la ruta de destino. Si la dejamos en origen y en destino, rsync sincronizará todo el directorio de origen en el directorio de destino, haciendo una copia del directorio dentro del destino . Si no hacemos esto, las dos unidades TrueCrypt no serán iguales, ya que en la copia de backup abrá un nivel de directorios más que en el original. En Windows esto puede llegar a ser un problema, ya que hay un limite máximo de profundidad (subdirectorios) que, si se supera durante la copia, puede dejarnos una copia de seguridad estropeada e incompleta

“/cygdrive/origen/”   “cygdrive/destino/” NO!!
“/cygdrive/origen/”   “cygdrive/destino”  SI!!

 

Para terminar dejo el código de un archivo .bat que me he hecho para el caso, donde sólamente hay que configurar las rutas al principio y queda todo hecho. Sólamente hay que configurar una tarea en el Programador de Tareas de Windows para que se ejecute con la recurrencia que creais conveniente.

Dejo aqui también un paquete BackUps-Rsync.zip con los archivos y librerí­as necesarias para este tutorial, así­ como dos versiones de archivo .bat: BackUp.Inicio.bat (genera un archivo de log por cada ejecución, con la fecha de la ejecución) y BackUp.Recurrente.bat (genera un archivo de log diario, donde se guardan los logs de todas las copias de backup ejecutadas en un mismo dia).

 

 

 

@echo off

REM ###########BackUps a disco con Rsync (para Windows y Linux)####################
REM
REM Por Skiter el 6/5/2011
REM http://www.skitergia.com/2011/05/05/backups-a-disco-con-rsync/
REM
REM ###############################################################################

REM #################### RUTA DE INSTALACION ######################################
REM # Rutas y nombres de archivo. Todo en formato WINDOWS
REM ###############################################################################

REM Ruta donde está copiado el Rsync
set RSYNC_INSTALATION_PATH="C:\Program Files (x86)\BackUps (Rsync)\"

REM Nombre (sin extensión) para el archivo de logs
set LOGFILE_NAME="BackUpSesion."

REM Ruta donde se alojarán los archivos de log.
set LOGFILE_WIN_PATH="G:\BackUpsLogs\"

REM Directorio (o unidad TrueCrypt) de la que queREMos hacer copias de seguridad
set FILES_TO_BACKUP_WIN_PATH="R:\"

REM Directorio (o unidad TrueCrypt) donde queREMos que se hagan las copias
set BACKUP_DESTINATION_WIN_PATH=”S:\”

REM ##############################################################################

REM ######################## SCRIPT ##############################

REM Guardamos Fecha y hora actuales (en formato YYYY.MM.DD_hhmmss)
set NOW=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%

REM creamos el nombre del archivo de log, con la fecha al final.
REM al valor configurado arriba, le quitamos la ultima comilla (“),
REM le añadimos la fecha, la extensión de archivo y volvemos a cerrar las comillas.
set BACKUP_LOGFILE=%LOGFILE_NAME:~,-1%%NOW%.txt”

REM escribimos en el archivo de log una linea para definir el comienzo del log
echo —- Started First Backup at %NOW% >> “%LOGFILE_WIN_PATH:”=%%BACKUP_LOGFILE:”=%”

REM quitamos todas las comillas (ya no nos van a hacer falta).
set BACKUP_LOGFILE=%BACKUP_LOGFILE:”=%

REM nos movemos al directorio donde está el Rsync
C:
chdir %RSYNC_INSTALATION_PATH%

REM eliminamos y sustituimos algunos caracteres de las rutas configuradas arriba
REM para hacerlas Linux y pasarselas al com ando correctamente.

REM al nombre de archivo de log le quitamos las comillas
set LOGFILE_NAME=%LOGFILE_NAME:”=%

REM cambiamos las barras “\” por barras “/”
REM eliminamos todos los “:” (ya no hacen falta)
REM eliminamos todas las comillas de las rutas (las pondremos en el com ando)
set LOGFILE_WIN_PATH=%LOGFILE_WIN_PATH:\=/%
set LOGFILE_WIN_PATH=%LOGFILE_WIN_PATH::=%
set LOGFILE_WIN_PATH=%LOGFILE_WIN_PATH:”=%

REM cambiamos las barras “\” por barras “/”
REM eliminamos todos los “:” (ya no hacen falta)
REM eliminamos todas las comillas de las rutas (las pondremos en el com ando)
set FILES_TO_BACKUP_WIN_PATH=%FILES_TO_BACKUP_WIN_PATH:\=/%
set FILES_TO_BACKUP_WIN_PATH=%FILES_TO_BACKUP_WIN_PATH::=%
set FILES_TO_BACKUP_WIN_PATH=%FILES_TO_BACKUP_WIN_PATH:”=%

REM cambiamos las barras “\” por barras “/”
REM eliminamos todos los “:” (ya no hacen falta)
REM eliminamos todas las comillas de las rutas (las pondremos en el com ando)
REM eliminamos la última barra “/” de la ruta del destino
set BACKUP_DESTINATION_WIN_PATH=%BACKUP_DESTINATION_WIN_PATH:\=/%
set BACKUP_DESTINATION_WIN_PATH=%BACKUP_DESTINATION_WIN_PATH::=%
set BACKUP_DESTINATION_WIN_PATH=%BACKUP_DESTINATION_WIN_PATH:”=%
set BACKUP_DESTINATION_WIN_PATH=%BACKUP_DESTINATION_WIN_PATH:~,-1%

REM escribimos el com ando con las variables correspondientes ya formateadas
rsync -aubrpt –suffix=”_backUp” -Ph –delete –stats –fake-super –exclude=”$RECYCLE.BIN” –log-file=”/cygdrive/%LOGFILE_WIN_PATH%%BACKUP_LOGFILE%” “/cygdrive/%FILES_TO_BACKUP_WIN_PATH%” “/cygdrive/%BACKUP_DESTINATION_WIN_PATH%”

REM #########################################################

 

 

 

 

 

 

 

Algunas referencias que he utilizado para documentarme:

Los comienzos de la epopeya: www.itefix.no

Primera pista sobre los paths: panoolvidar.wordpress.com

Aunque no es una solucion, da pistas: www.eslomas.com

Una posible solucion completa: optics.ph.unimelb.edu.au

Fundamental para el problema de los archivos temporales: digitaldj.net