lunes, 14 de mayo de 2007

Rsync vs BackupPc vs Link-Backup

   Llevo las últimas semanas buscando y probando distintos sistemas de copias de seguridad para poder tener los backups centralizados en casa en una única máquina, hacerlos de una manera eficiente, fiable y organizada. Los requisitos que debe cumplir el sistema son los siguientes:
  • Debe funcionar bajo linux: Voy a reutilizar mi antiguo Duron instalándole la nueva Debian Etch y quiero montar un raid 1 para tener fiabilidad en el backup.
  • Se deben poder hacer backups de máquinas windows y linux: Tengo que hacer backups de mi sobremesa con Ubuntu y del portatil de mi mujer con windows XP.
  • Debe permitir backups totales, parciales e incluso un histórico o versionado de archivos: Realmente lo único imprescindible es hacer un backup completo la primera vez e irlo ampliando con backups incrementales posteriores. Si además puedo tener un versionado de todos los archivos o almacenarlos en directorios distintos según el día, pues mejor que mejor.
  • No debe requerir tener el servidor encendido 24x7: No quiero un sistema de backup que deba tener encendido todo el día puesto que la idea es hacer un backup completo la primera vez y luego, según sea el trabajo diario encenderlo y hacer incrementales de vez en cuando.
  • Posibilidad de utilizar una interfaz gráfica (GUI): Más que para su utilización y/o configuración, para ver los archivos que se han almacenado de una manera fácil y cómoda.

  •    Así, con estas premisas me puse a buscar por internet y a leer foros y me quedé con tres herramientas para hacer pruebas y decidir cual era la mejor para mi: Rsync, BackupPC y Link-Backup.

    Rsync: Es un clásico en sistemas Unix/Linux. Entre las muchas opciones que permite sirve para realizar una copia de toda la información y posteriormente actualizar sólo los fragmentos que se modifican de los archivos. Cuando digo los fragmentos que se modifican de los archivos me refiero a que posteriormente, si de un archivo de 300 MB sólo modificamos una parte, sólo esa parte será enviada en la siguiente copia.
       En aspectos negativos decir que no tiene GUI de consulta de archivos.

    BackupPC: Me ha sorprendido mucho esta herramienta y además según he podido leer hay mucha gente que la utiliza con muy buenos resultados. De todos mis requisitos el único que no cumple es el de no poder apagar el servidor puesto que una vez al día ejecuta tareas de reorganización de índices y además el servidor decide cuando quiere hacer la copia de las máquinas (aunque es cierto que se pueden ejecutar backups bajo demanda). Tiene GUI para su utilización (que no configuración), versiona los archivos, permite backups completos y parciales y permite guardar la información de máquinas windows y linux. La recuperación de los archivos también está muy bien puesto que permite restaurarlos en su localización inicial, en otra máquina e incluso crear un zip con los archivos que queramos.
       Para funcionar utiliza rsync y crea hard links para reducir la utilización de espacio en el servidor. Así, la primera vez que hacemos un backup transfiere el archivo completo pero en posteriores copias, si detecta que el archivo es el mismo lo único que hace es crear un hard link, por lo que no consume más espacio en disco, pero sí inodos. Esto último, en función del sistema de archivos que utilicemos y del número de máquinas a gestionar puede traernos problemas.

    Link-Backup: Es una utilidad muy parecida a BackupPC aunque no tan "vistosa". Se trata de un script escrito en python y que también utiliza rsync para realizar la transferencia de los ficheros. Permite backups completos e incrementales y también utiliza hard links para reducir el espacio ocupado en disco. No tiene interfaz gráfica aunque en la web del autor hay disponible un pequeño cgi que sirve de interfaz gráfica para poder navegar por los distintos backups.

       Como tanto BackupPc como Link-Backup se basan en rsync y además aportan funcionalidad adicional, me centré directamente en estas dos herramientas.

       Comencé por BackupPC. Lo descargué, lo instalé y para la configuración, que fue muy sencilla, seguí este tutorial. Posteriormente cambié la configuración para utilizar rsyncd (el demonio rsync) en lugar de las transferencias cifradas por ssh. Después de un par de pequeñas pruebas transfiriendo unos cuantos archivos configuré todos los directorios a guardar y lancé el backup. En total fueron 21 GB y la copia tardó poco más de 3 horas. Durante este tiempo tuve a la vista el monitor de red de la máquina origen para comprobar la utilización de la red y he de decir que no se aprovechaba todo el ancho de banda ni mucho menos y apenas se llegó a utilizar el 40-50%. Una vez terminado el backup completo lancé el backup incremental para comprobar que se chequeaban todos los archivos y al no tener que transferir ninguno la copia se haría en pocos minutos. Al final, la copia incremental tardó 65 minutos! por lo que pensé que debía tener algo mal configurado. Estuve buscando algo más de información por internet y la conclusión a la que llegué es que BackupPC tiene que reconstruir toda la estructura de directorios, crear los hard links y actualizar su catálogo con la información de los ficheros. Además, debe calcular CRCs de los archivos para decidir si han cambiado y es necesario transferirlos de nuevo.

       El uso y configuración de Link-Backup es más sencillo todavía, sólo hay que tener python instalado para ejecutar el script. La sintaxis es similar a la del comando scp (usuario@maquina:/directorio) y no posee demasiadas opciones de configuración. Como no quería que me pasase lo mismo que con BackupPC, hice una prueba con un directorio de sólo 4 GB y los resultados fueron muchísimo mejores. Durante la transferencia la utilización de la red era de prácticamente el 90-100%, por lo que el tiempo del primer backup se redujo muchísimo. Después volví a ejecutar de nuevo el script y esta vez sí, en 5 segundos terminó indicando que no había nada que copiar.
       Luego instalé el cgi para tener la posibilidad de navegar por los backups y aunque la interfaz gráfica no se puede ni comparar con la de BackupPC, para el uso que yo quiero me sirvía.
       Cuando ya me iba a decidir por esta herramienta me dí cuenta que no era capaz de indicarle que realizara la copia de más de un directorio a la vez y crease un catálogo único, así que después de unas cuentas pruebas intentándolo, la descarté.

       Busqué alguna herramienta más por internet como Bacula pero requiere el servidor encendido y que el origen de los backups sea el servidor, por lo que también la descarté.

       Finalmente, me decidí por la opción de crearme yo mis propios scripts de backup utilizando rsync con la opción de crear hard links para ocupar menos espacio en el disco y crear un snapshot en cada ejecución.

       El script que realiza el backup se llama desde los clientes indicándole el nombre de la máquina origen por medio de ssh:
    ivan@doraemon:~$ ssh rsync@shian /home/rsync/scripts/backup.sh doraemon

       El contenido del script es el que muestro a continuación. Está algo hardcodeado porque no he sido capaz de pasarle como parámetro la lista de directorios al rsync. El problema está en que si es más de un directorio tiene que ir entre comilla simple ' y aunque "escape" el caracter con \ no funciona el rsync. Lo que hace el script es calcular el último snapshot y crear la nueva copia basándose en la anterior. Así, cada vez que lo ejecutamos se crea un nuevo directorio backup.X con la falsa ilusión de que es un backup completo por la magia de los hard links.
    #!/bin/bash

    # Comprobación de los parámetros
    if [ -z $1 ] ; then
    echo Uso `basename $0` hostname
    exit 1
    fi

    # Destino del backup
    DEST_DIR=/mnt/raid/datos

    HOST=$1
    FULL_DEST_DIR=$DEST_DIR/$HOST

    # Calculo del último snapshot del backup y del nuevo
    LAST_SNAPSHOT=`ls -ltr $FULL_DEST_DIR | tail -1 | awk {'print $8'} | cut -d . -f 2`
    ((NEW_SNAPSHOT=LAST_SNAPSHOT+1))

    # En función de la máquina de la que queramos hacer el backup, ejecutamos con unos u otros parámetros
    if [ $HOST == "doraemon" ] ; then
    rsync -av --delete --link-dest=$FULL_DEST_DIR/backup.$LAST_SNAPSHOT/ ivan@doraemon:'/Dir1 /Dir2 /Dir3' $FULL_DEST_DIR/backup.$NEW_SNAPSHOT > $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt
    mv $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt $FULL_DEST_DIR/backup.$NEW_SNAPSHOT/files.txt
    elif [ $HOST == "dorami" ] ; then
    rsync -av --delete --link-dest=$FULL_DEST_DIR/backup.$LAST_SNAPSHOT/ ana@dorami:'/MisDocs' $FULL_DEST_DIR/backup.$NEW_SNAPSHOT > $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt
    mv $FULL_DEST_DIR/files_$NEW_SNAPSHOT.txt $FULL_DEST_DIR/backup.$NEW_SNAPSHOT/files.txt
    else
    exit 2
    fi

       Lo único necesario es configurar el acceso por ssh sin password desde mi pc con linux (doraemon) y el portatil de mi mujer (dorami) al servidor de backup (shian) y desde éste a los clientes puesto que el backup parte de shian. Sé que es algo engorroso tener que configurar la conexión ssh sin password en ambos sentidos, pero prefiero hacerlo así porque quiero que el momento en el que se realice el backup se decida en el lado cliente.

       Instalé en el portatil de mi mujer Cygwin y lo configuré como sigue para conectarme por ssh sin tener que utilizar ninguna clave:
  • Primero, en windows, desde cygwin generamos el par de claves pública/privada:
    $ ssh-keygen -t dsa -b 1024
    Generating public/private dsa key pair.
    Enter file in which to save the key (/cygdrive/c/Documents and Settings/ana/.ssh/id_dsa): INTRO
    Enter passphrase (empty for no passphrase): INTRO
    Enter same passphrase again: INTRO
    Your identification has been saved in /cygdrive/c/Documents and Settings/ana/.ssh/id_dsa.
    Your public key has been saved in /cygdrive/c/Documents and Settings/ana/.ssh/id_dsa.pub.
    The key fingerprint is:
    7b:9a:c6:e9:ee:f1:2e:b0:00:fc:68:c6:58:2b:d6:a0 ana@dorami.casa
  • Copiamos la clave pública al servidor de backup:
    $ scp id_dsa.pub rsync@shian:/home/rsync/.ssh/id_dsa_ana.pub
    Password:
    id_dsa.pub 100% 605 0.6KB/s 00:00
  • Ahora nos conectamos al servidor de backup con el usuario rsync y añadimos la clave pública en el archivo de claves autorizadas para poder conectarnos por ssh sin necesidad de password:
    rsync@shian:~$ cat ~/.ssh/id_dsa_ana.pub >> ~/.ssh/authorized_keys
  • En este momento ya nos podemos conectar por ssh sin password desde la máquina windows (dorami) al servidor de backup (shian):
    $ hostname
    dorami

    $ ssh rsync@shian
    Last login: Fri 11 21:50:47 2007 from doraemon
    rsync@shian:~$
  • Para afinar un poco más la configuración y eliminar el agujero de seguridad de permitir sesiones por ssh con el usuario utilizado para el backup, editamos el archivo de claves autorizadas y añadimos al principio la limitación de sólo poder conectarnos desde esa máquina, no permitir redirección de puertos y no permitir sesiones interactivas, quedando así:
    rsync@shian:~$ cat .ssh/authorized_keys
    from="dorami.casa",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAAAB3Nza................y6SzRKqzW6V9PpwQ== ana@dorami.casa
  • De esta manera, si ahora intentamos conectarnos por ssh al servidor, obtenemos el siguiente error:
    $ ssh rsync@shian
    stdin: is not a tty

  •    Repetí los pasos desde mi máquina aunque obviamente sin la parte de capar el acceso por ssh ;-). Adicionalmente hay que hacer lo mismo para configurar las conexiones sin password pero desde el servidor hacia los clientes.

       Ahora, para finalizar, lo que hago es crear un script en cygwin para lanzar el backup y otro script .bat para crear un acceso directo en windows para que mi mujer pueda ejecutar sus backups sin ningún problema.
    # En cywin
    $ cat backupAna.sh
    #!/bin/sh
    ssh rsync@shian /home/rsync/scripts/backup.sh dorami


    # En windows
    @echo off
    REM EjecutaBackup.bat
    echo Ejecutando backup...
    C:\cygwin\bin\bash --login -i /usr/local/bin/backupAna.sh
    pause

       Y esto es todo, mi mujer puede lanzar su backup cuando quiera y yo desde mi máquina tengo un script similar.

       Como conclusiones finales me quedo con un cierto mal sabor de boca por no haber elegido BackupPc puesto que me parece la solución más completa aunque también es cierto que los tiempos de backup incrementales son bastante elevados. Aunque bastante menos elegante, la solución del script manual es mucho más eficiente y cómoda para mi.

    26 comentarios:

    Vicente dijo...

    ¡Muy interesante! ¡No tenía ni idea de esas alternativas tan potentes (¿quizás demasiado para los PCs de casa como tú mismo te planteas?)a tiro de apt-get.

    Yo nunca me he puesto a mirar alternativas de backup porque siempre he usado directamente rsync. Tengo unos scripts muy parecidos a los tuyos, la verdad :-)

    Respecto a:

    > El problema está en que si es más de un directorio tiene que ir entre comilla simple ' y aunque "escape" el caracter con \ no funciona el rsync.

    Recuerdo que también tuve problemas con cosas de esas y si no recuerdo mal lo solucioné metiendo los directorios que me interesaban en un fichero y usando estas opciones:

    --include-from=FILE read include patterns from FILE
    --files-from=FILE read list of source-file names from FILE

    Ahora mismo no te lo puedo mirar, pero ¿has probado con ellas a ver si te solucionan el problema? Además es más flexible porque no tienes que editar cada vez el script para añadir o quitar cosas del backup sino un fichero auxiliar.

    ¡Gracias por el artículo!

    Iván dijo...

    Gracias Vicente!, me alegro de que te gustara el artículo. Seguro que tienes unos scripts tan cutres como los míos? ;-), mira que lo he intentado, pero al final he tenido que hardcodear...

    Ya había visto las opciones de include-from y files-from, pero, o no me entero cómo funcionan o no soy capaz de decirle que tome la lista de directorios de un .txt. Si tuvieras algún ejemplo te estaría muy agradecido.

    Saludos, Iván.

    P.D: Has cambiado de nombre? ;-)

    Super Coco dijo...

    Mis scripts son de andar por casa, créeme :-)

    Si nos centramos en el --files-from, se puede usar un comando como el siguiente:

    rsync -av --delete -r --files-from=/path/ficheros_backup /path_absoluto_que_contenga_todos_los_paths/ destino:/path_dest/

    Aunque haya -a, el -r es necesario porque si se usa el --files-from:

    o The --archive (-a) option's behavior does not imply --recursive (-r), so specify it explicitly, if you want it.

    Por tanto, si tenemos un directorio /dir con carpetas /dir/a, /dir/b y /dir/c y queremos hacer backup del directorio a y del b con todos sus contenidos, pondríamos en el fichero ficheros_backup esto:

    -----
    a
    b
    -----

    y el comando quedaría así:

    rsync -av --delete -r --files-from=/path/ficheros_backup /dir/ destino:/path_dest/

    Pero también podríamos poner en el fichero:

    -----
    dir/a
    dir/b
    -----

    y usar este comando:

    rsync -av --delete -r --files-from=/path/ficheros_backup / destino:/path_dest/

    La diferencia es que en el primer caso en destino:/path_dest/ no se crea un directorio "dir" y en el segundo sí.

    Espero que me haya podido explicar :-)

    Respecto al nombre, ha sido un despiste ;-)

    Iván dijo...

    Muchas gracias!. Ahora ya me ha quedado muy claro y según la pruebecilla que acabo de hacer parece que me va a funcionar.
    Cuando llegue a casa lo probaré a ver si todo se comporta como yo espero.

    Saludos, Iván.

    SuperCurro dijo...

    Te lo has currao, aunque ahora si que podrías cambiar a backuppc. En sus últimas versiones 3.1.0 ya puedes hacer backups rsync con o sin ssh y los incrementales tardan segundos.

    Si es cierto que el ancho de banda varía mucho, y depende del tamaño de los archivos, si son pequeños se queda 10-20 mbps y si son grandes a 50-60 mbps.

    En cuanto al tema de hacerlo bajo demanda, todo es programable, puedes programar cada cuanto quieres que arranque el servicio (por defecto cada hora) o sencillamente hacerlo bajo demanda dandole al botoncito y decirle que no arranque el servicio nunca. La única pega que le veo es que por la noche a las 1:00 hace sus procesos internos de limpieza, y claro, si no lo dejas alguna noche limpiando se te queda lleno de basura.

    De todas formas la comparativa muy currada.

    Yo para todos los pcs de casa uso backuppc, precisamente por el interface que es genial para ver los históricos. Además en las proximas versiones se podrá hacer copias por ftp.

    Para hacer backups hacia fuera uso rsync a pelo con un cron. Es una lástima que el backuppc no me deje hacer copias de lo que tengo en el servidor hacia fuera, pero bueno, no es el concepto.

    Por lo que veo que haces, yo diría que te has complicado un poco la vida, ya que para no tener interface gráfica y hacer copias en windows una solución mucho mas sencilla es DeltaCopy, que creo hace todo lo que tu haces y se instala apretando un botón.

    Iván dijo...

    Hola SuperCurro,

    me alegro de que te haya parecido interesante la comparativa.

    Respecto a usar la nueva versión de BackupPC, le echaré un vistazo y haré una pequeña prueba a ver si me termina de convencer. De todas formas, como dicen por ahí si funciona, no lo toques... ;-).

    Es cierto que a lo mejor me he complicado un poco la vida, pero estoy contento con mi solución. Además, lo tengo integrado con Google Calendar para enviarme notificaciones por SMS. Y respecto a windows, si te soy sincero sólo era para el portatil de mi mujer que apenas utiliza. Le copié todos los datos una vez y no ha vuelto a lanzar el backup desde hace más de un año. Por suerte yo lanzo el mío todas las semanas y al final de cada mes.

    Saludos y gracias por tu punto de vista.

    Saludos, Iván.

    WinProg dijo...

    He instalado DeltaCopy, y me funciona muy bien. Pero al restaurar mis archivos no puedo utilizarlos ya que al intentar abrirlos( por ejemplo archivos .txt me sale un error de acceso denegado) y la verdad no se que hacer.
    Les agradezco una ayuda.


    Atte.
    Jesus
    jezafran@hotmail.com

    Iván dijo...

    Hola WinProg,

    lo siento pero no he utilizado DeltaCopy, así que no te puedo ayudar.

    Saludos, Iván.

    juan dijo...

    Creo que puedo ayudarte con deltacopy, mira antes de recuperar que en profile del server, puedas darle boton derecho y puedas elegir fixed permision o algo parecido ( te lo estoy diciendo de memoria, sobretodo si lo tienes en un server win) una vez recuperada la info, mira a ver si puedes hacer lo mismo para recuperar los permisos.

    Yo tb tengo DeltaCopy en windows, aunque tambien funciona con Rsync en distros Linux.

    PD: pasaba por aqui buscando información saludos, espero pasar mas a menudo.

    Anónimo dijo...

    Muy interesante este blog, las ideas que se aportan son muy buenas. Respecto a backuppc excelente herramienta, estoy leyendo su documentación para implementarla y encontré un detalle que no me parece muy bonito, que es el siguiente (tal vez este equivocado) pero cuando se configura la copia por smb en backuppc a un equipo windows la variable $Conf{SmbShareName}=['directorio1','directorio2','directorio3'];
    y las demás variables. No hay forma de especificar para que carpetas de ese equipo necesito incrementales y completas. A una carpeta de documentos se necesita "incremental" y para una de algún programa contable "completa", vale aclarar que ambas carpetas están en el mismo equipo.

    Esa es mi inquietud.

    Iván dijo...

    Hola Anónimo,

    me temo que no te puedo ayudar porque como comento, no utilizo backuppc, sino mis propios scripts con rsync.

    Saludos, Iván.

    Anónimo dijo...

    Muy buen análisis, te lo has currao :)

    Iván dijo...

    Hola Anónimo,

    me alegro de que te guste y te haya podido ser útil.

    Saludos, Iván.

    Anónimo dijo...

    Solo a modo de consulta, has logrado configurar la opcion de notificacion por correo???

    Atte.
    Christian

    Iván dijo...

    Hola Christian,

    ¿a qué notificación de correo te refieres?, ¿de qué programa?.

    Saludos, Iván.

    Anónimo dijo...

    Notificacion por correo que integra BackupPC si es que has probadola aplicacion.

    Atte.
    christian Carrasco.

    Iván dijo...

    Hola Christian,

    Lo siento pero como comento en el post, probé BackupPC pero lo descarté.

    Saludos, Iván.

    Anónimo dijo...

    Una maravilla de comparativa!!.

    Estamos intentando instalar un servidor de copias de seguridad para nuestra pequeña empresa (seis pcs bajo windows) y este blog ha sido una maravilla. Servidor ubuntu con BackupPC!. Ya os contaré a ver que tal.

    Muchas gracias.

    Iván dijo...

    Hola Anónimo,

    me alegro de que te haya servidor la comparativa. Espero que te vaya todo bien con BackupPC.

    Saludos, Iván.

    Diego dijo...

    Holas,
    ¿alguien podría confirmar si backuppc tiene la utilidad de hacer snapshot??,,
    si lo tiene, me tiro de cabeza a por él,,
    gracias.

    Jaime González Vallejo dijo...

    Ivan quiero exactamente lo mismo que tu. (Los requisitos son los mismos) Pero no tengo ni idea de código ni programacion.. He probado el Norton Ghost y el Acronis y algun otro pero las copias de seguridad las hace en formatos muy raros que no se pueden recuperar en otros equipos.. Quisiera algun programa que sea mitad TotalCommander y Dropbox sin internet. Que me sincronice dos discos duros y no sea RAID. Me entiendes?

    Iván dijo...

    Hola Jaime,

    yo ahora estoy usando "Back in Time" y la verdad es que estoy muy contento con él.

    Permite snapshots, copias incrementales, comparar distintas versiones,... y guarda los archivos tal cual.

    Espero que te sirva.

    Saludos, Iván.

    Javier 30 dijo...

    Buenos dias.

    La comparativa genial Ivan, muy bueno.

    A titulo de script a mi me viene algo grande pero es una forma de sacar el maximo provecho.

    Tengo varias preguntas Ivan.

    Quiero montar un sistema de copias de seguridad en red. Pero montado en maquinas virtuales teniendo como servidor ubuntu-server lts 12.04 y como clientes ubuntu y windows XP.

    La pregunta visto que backup-pc llevaba tiempo sin actualizar en versiones, comentaron en bacula pero es algo mas complejo de usar.

    Mi pregunta que me aconsejan BAckupPC o Bacula.

    Es una prueba, por eso montarlo en maquinas virtuales, y luego pasarlo a maquinas reales.

    Por favor ayuda.

    Que me aconsejais....

    Y Back in time, como funciona. es facil la instalacion y configuracion en ubuntu server??? y permite hacer copias de seguridad de windows???

    gracias

    Iván dijo...

    Hola Javier,

    sobre BackupPC o Bacula me temo que no te puedo aconsejar. Realmente no llegué a utilizarlos porque me decidí por una solución más artesanal con scripts + rsync.

    Ahora mismo, como ya he dicho en los comentarios, estoy utilizando Back in Time. Tengo configurado el directorio de backups en el QNAP y lo único que tengo que hacer es abrirlo y darle al botón de ejecutar el backup. También se puede ejecutar automáticamente, pero he preferido hacerlo a mano.
    Respecto a la instalación, tienes que instalarlo en el ordenador del que quieras hacer las copias. Es un paquete .deb que no tiene ninguna complicación.
    Sobre windows, no estoy seguro pero creo que sólo hay versión para linux.

    Saludos, Iván.

    Bernat Roig Marin dijo...

    Hola, antes que nada disculparme por levantar un post tan antiguo.
    El tema es el siguiente, me monte unos scripts de backup con rotación de snapshots hace algunos años, hasta ahora no habia necesitado hacer backup de windows pero ahora empieza a ser necesario, he visto que configuraste cywin para usar ssh pero yo por el momento solo consigo acceder al servidor pero no que este acceda a el pc con windows, podrias porfavor explicarme como lo lograste? Gracias de antemano.

    Iván dijo...

    Hola Bernat.

    Lamento no poder ayudarte porque hace mucho tiempo que no tengo ninguna máquina con windows. Si los pasos que explico aquí ya no funcionan supongo que será por distintas versiones de windows y cygwin.

    Saludos, Iván.

    Publicar un comentario