Para realizar las copias de seguridad locales usamos rsnapshot.
Este script genera las copias de seguridad en /var/backups, se encarga de rotar las copias y de minimizar el uso de espacio en disco empleando enlaces duros para todos los archivos que no cambien de una copia a otra.
Su archivo de configuración /etc/rsnapshot.conf está profusamente comentado. A continuación se reseña sólo los cambios que se han realizado a la versión instalada por defecto en Debian:
########################### # SNAPSHOT ROOT DIRECTORY # ########################### snapshot_root /var/backups/ ######################################### # BACKUP INTERVALS # # Must be unique and in ascending order # # i.e. hourly, daily, weekly, etc. # ######################################### retain diaria 7 retain mensual 3 ############################### ### BACKUP POINTS / SCRIPTS ### ############################### # LOCALHOST backup /root/ localhost/ backup /home/ localhost/ backup /var/www/ localhost/ backup /var/git/ localhost/ backup /var/spool/cron/ localhost/ backup /habitat/ localhost/ backup /etc/ localhost/ backup /usr/local/ localhost/ backup_script /root/bin/dpkgbackup localhost/dpkg/ backup_script /root/bin/mysqlbackup localhost/mysql/
Como puede observarse añadir que se respalden nuevos directorios es tan sencillo como agregar una directiva backup a la configuración en la sección BACKUP POINT/SCRIPTS.
También soporta la ejecución de scripts. Para la realización de los mismos hay que tener en cuenta que copiara en el destino los archivos generados en donde se ejecute el script, no deben usarse rutas absolutas.
Hemos definido dos scripts:
#!/bin/bash /usr/bin/dpkg --get-selections > dpkg.list
#!/bin/bash # Requiere tener configurado el acceso a MySQL en ~/.my.cnf if [ ! -f ~/.my.cnf ]; then echo "ERROR: No existe ~/.my.cnf" exit 1 fi # Para usar junto con rsnapshot los ficheros generados deben # estar en el directorio actual. Por ello el valor de DESTINO # por defecto es . DESTINO=. if [ $# -eq 1 ]; then DESTINO="$1" fi if [ $# -gt 1 ]; then echo "ERROR: Número de argumentos incorrecto." exit 1 fi if [ ! -d $DESTINO ]; then echo "ERROR: ${DESTINO} no es un directorio" exit 1 fi BBDD=$(mysql --skip-column-name --silent -e 'SHOW DATABASES;') for BD in $BBDD do #echo "Exportando $BD" mysqldump --single-transaction ${BD} | gzip -c -9 > ${DESTINO}/${BD}.gz done
Finalmente podemos ejecutar rsnapshot manualmente en cualquier momento invocando alguno de los dos intervalos que hemos definido en el archivo de configuración:
/usr/bin/rsnapshot diaria
ó
/usr/bin/rsnapshot mensual
Pero lo interesante es dejar automatizada la tarea añadiendolas al cron de root. Actualmente estas líneas existen pero están comentadas:
## Copias de seguridad ## ------------------- ## Descomentar cuando se quieran activar #00 4 * * * /usr/bin/rsnapshot diaria > /dev/null 2>&1 #00 5 1 * * /usr/bin/rsnapshot mensual > /dev/null 2>&1