Copias de seguridad incrementales con rsync | Algo de Linux

jueves, 24 de enero de 2008

Copias de seguridad incrementales con rsync

El sistema de copias de seguridad que uso en el instituto está basado en rsync (una herramienta disponible en linux). Para mí es uno de los mejores sistemas de copias de seguridad, sobre todo porque es muy fácil de implementar. Y lo mejor de todo, es que resulta muy sencillo buscar archivos en las copias de seguridad. Tan sólo hay que usar comandos que manejamos a diario, como p. ej. find.
Yo hago las copias de seguridad en una unidad nfs que tengo en un equipo que había en el instituto sin usar, pero se podrían hacer también en discos externos usb (muy baratos hoy en día) o firewire.
El script de copia de seguridad está sacado de una adaptación de Brian Hone de un script disponible en sync.samba.org.
Este script se ejecuta automáticamente de lunes a viernes a las 23:55. Para ello tengo una línea como la siguiente en el crontab del servidor:
# Copia de seguridad del servidor
55 23 * * 1,2,3,4,5 root /usr/sbin/hacerbackup.sh
Éste script hace copias de seguridad incrementales. Y funciona de la siguiente manera: La copia más actual se almacena en un directorio llamado main y las variaciones se almacenan en un directorio cuyo nombre es la fecha en que se hicieron las modificaciones.
Cosas que tenéis que configurar como mínimo para usarlo:
BACKUPDIR=directorio del que queremos hacer copia de seguridad. Yo tengo puesto el directorio / para hacer copia de seguridad de todo excepto lo que especifico en EXCLUDES
EXCLUDES=nombre del archivo en el que especificamos los directorios de los que no queremos hacer copia de seguridad. Creais este archivo y dentro ponéis la lista de directorios de los que no queréis hacer copias de seguridad, como por ejemplo /tmp, /usr...
ARCHIVEROOT=lugar donde almacenamos la copia de seguridad. Yo uso una máquina en la que tengo compartido un directorio por nfs. De este modo, las copias quedan almacenadas en un equipo diferente para poder recuperar datos si falla el servidor o si a alguien se le perdió algún archivo. Para que el directorio de backup de la otra máquina esté conectado tengo puesta la siguiente línea en el fstab del servidor: 172.19.144.16:/backup /backup nfs rw,hard,intr
Pego a continuación el script tal y como lo tengo montado en el servidor para hacer copias de seguridad del mismo:
 #!/bin/sh
#
# Script to do incremental rsync backups
# Adapted from script found on the rsync.samba.org
# Brian Hone 3/24/2002
# This script is freely distributed under the GPL
#
# Configure These Options
#
# mail address for status updates
# - This is used to email you a status report
#
# MAILADDR=adminies.valledeljerte@edu.juntaextremadura.net
#
# HOSTNAME
# - This is also used for reporting
#
HOSTNAME=valledeljerte3.valledeljerte3.ex

#
# directory to backup
# - This is the path to the directory you want to archive
#
BACKUPDIR=/

#
# excludes file - contains one wildcard pattern per line of files to exclude
# - This is a rsync exclude file. See the rsync man page and/or the
# example_exclude_file
#
EXCLUDES=/etc/excluirbackup

#
# root directory to for backup stuff
#
ARCHIVEROOT=/backup

#
# From here on out, you probably don't #
# want to change anything unless you #
# know what you're doing. #
#

# directory which holds our current datastore
CURRENT=main

# directory which we save incremental changes to
INCREMENTDIR=`date +%Y-%m-%d`

# options to pass to rsync
OPTIONS="--force --ignore-errors --delete --delete-excluded \
--exclude-from=$EXCLUDES --backup --backup-dir=$ARCHIVEROOT/$INCREMENTDIR -av"

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

# make sure our backup tree exists
install -d $ARCHIVEROOT/$CURRENT

# our actual rsyncing function
do_rsync()
{
rsync $OPTIONS $BACKUPDIR $ARCHIVEROOT/$CURRENT
}

# our post rsync accounting function
do_accounting()
{
echo "Backup Accounting for Day $INCREMENTDIR on $HOSTNAME:">/tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "">>/tmp/rsync_script_tmpfile
du -s $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile
echo "Mail $MAILADDR -s $HOSTNAME Backup Report < /tmp/rsync_script_tmpfile" Mail $MAILADDR -s $HOSTNAME Backup Report < /tmp/rsync_script_tmpfile echo "rm /tmp/rsync_script_tmpfile" # rm /tmp/rsync_script_tmpfile }  # some error handling and/or run our backup and accounting if [ -f $EXCLUDES ]; then    if [ -d $BACKUPDIR ]; then       # now the actual transfer       do_rsync && do_accounting    else       echo "cant find $BACKUPDIR"; exit    fi else    echo "cant find $EXCLUDES"; exit fi  
Hay un artículo muy majo en el que Brian Hone habla de este sistema de copias de seguridad. Os recomiendo echarle un vistazo:
http://linuxfocus.org/Castellano/March2004/article326.shtml

5 comentarios:

Clemente dijo...

Lo primero de todo gracias por el mensaje, y las explicaciones...
Lo segundo es comentar unas dudas y problemas que tengo...
Por ejemplo, en la variable de excludes tengo /backup (es donde guardo la copia de seguridad) y /tmp, pero al ejecutar el script, no hace caso.
La otra duda es, ¿como restauras todo en caso de un fallo total del sistema?

Gracias

Clemente dijo...

Hola,
Lo primero de todo, es darte las gracias por los manuales que vas publicando en la web, los cuales nos ayudan mucho a los que no dominamos tan bien linux...
Tengo dos dudas:
La primera es acerca de los directorios que excluimos de la copia:
EXCLUDES=/backup, /tmp
Esa es mi línea, pero me lo incluye en el backup siempre, por lo que el tamaño es superior.
La segunda es acerca del método de recuperación. Una vez creadas las copias de seguridad, si alguna vez hubiera un crash total en el sistema, ¿como lo recuperaría?, tengo todos los ficheros dispersos en la copia inicial + los incrementales, pero ¿como restaurar todo para dejarlo en el estado inicial antes del crash?

Gracias

enavas dijo...

Hola,

Me alegro de que te gusten las cosillas que voy publicando en el blog. La idea del blog es tener un lugar donde echar mano cuando necesito algo que hice hace tiempo y que posiblemente no recuerde como lo hice. Si además, mis experiencias le sirven a alguien, pues nada, encantado de compartirlas.

Respondo a tus dudas:

1) En la línea EXCLUDES, hago referencia a un fichero, donde se ecuentra la lista de directorios que quiero excluir de la copia de seguridad. Si te fijas, yo tengo algo así:

EXCLUDES=/etc/excluirbackup

Pues bien, excluirbackup es un fichero con una línea por cada directorio que quiero excluir de la copia de seguridad. Ejemplo de contenido del fichero /etc/excluirbackup:

/tmp
/backup
/var

2) Para evitar una caida total del sistema, normalmente, contarás con otros mecanismos de seguridad, como por ejemplo un RAID.
La idea del sistema de copias de seguridad es guardar tan sólo la información necesaria para recuperar el sistema tras un fallo: En mi caso, son sobre todo los ficheros de configuración del software servidor instalado y los directorios HOME de los usuarios, para poder ofrecerles garantías de que existen copias de sus datos.
Nosotros tenemos un RAID 1 (disk mirroring), y cuando ha caido un disco, no hemos tenido más que sustituirlo y el sistema se ha recuperado nuevamente.

Claro, que todo esto depende de las necesidades de cada uno.

Una cosa que debes tener clara es para qué quieres las copias de seguridad. Si mi servidor cae, no tengo más que volver a instalarlo y copiarle los archivos de configuración para volver a reestablecer los servicios en el menor tiempo posible.

Si lo que quieres es tener una imagen de todo el sistema para poder clonar en caso de fallo, deberías usar sistemas de clonación, pero ésto no sirve de mucho para un servidor en el que los datos están en constante cambio. Y, además, las imágenes serían demasiado grandes para guardar las copias. Claro, que todo está en la cantidad de datos y software que ocntenga tu servidor. Y sobre todo, lo que varíen.
Si te sirve de ayuda, yo uso la clonación de máquinas para los equipos clientes.

Clemente dijo...

Ok,
Lo que yo tengo para una copia inicial del sistema, es un archivo de imagen del disco duro, creado con el partimage.
Pero no sé muy bien que usar, por eso ví interesante tu artículo, para hacer copias d eseguridad de los datos. El problema de mi copia de respaldo inicial, es que si hay que restaurarla, necesito estar físicamente delante del servidor, y creía que con el rsync podría recuperar los datos sin estar físicamente delante...

Gracias

enavas dijo...

Para mí, las copias de seguridad con rsync son una herramienta más.

La verdad es que todo depende del problema. En ocasiones he podido resolver el fallo de forma remota. Y en otras ocasiones, he tenido que bajarme a la consola.

Como te decía, las copias de seguridad me han servido en muchas ocasiones para recuperar archivos de usuarios, o para restaurar las configuraciones de los servicios que se hayan actualizado y por alguna razón me hayan sustituido los archivos de configuración, para recuperar BBDD...