Distintas formas de backup

Es uno de los grandes dilemas BOFH. Cada administrador las hace a su modo, podemos presuponerlas todas correctas hasta que se demuestre lo contrario. En sistemas *NIX like tenemos varias opciones, desde un tar a pelo hasta un script con rsync pasando por rdiff-backup, scp...

Particularmente desde que conozco la opción --link-dest de rsync no soy el mismo. He ido mejorando poco a poco la política de copias, empezando por no tener ninguna hasta llegar al sistema actual que intento explicar.

Fast Backup

Referenciada anteriormente. Se trata de una copia de seguridad rápida, para ayer como suelen decir los jefes, en máquinas con pocos datos y que se pretenden reinstalar en el mínimo tiempo:

# mkdir -p /root/Backup/
# cd Backup/
# cp -r /etc ./
# cp -r /usr/local/etc ./
# pkg_info >> pkg_info.txt
# for i in `pkg_info | cut -f1 -d" "`; do pkg_info -L $i >> pkg_info-l.txt; done
# tar cfvz bck-`hostname -s`-`date "+%Y%m%d"`.tar.gz ./

También válido como sugiere Borja:

# mkdir /home/backup
# cd /home/backup
# tar -jcvvf fullbackup-`hostname -s`-`date +%F`.tar.bz2 /etc /usr/local/etc /var/db/pkg

Ojo con el tamaño de la partición donde se almacena, por aquello de no llenarla. (nótese que es basada en BSD, pkg_info se tendría que sustituir por *ponga aquí su gestor de paquetes*).

Basic Backup

Referenciada anteriormente. Es una copia básica de cada uno de los directorios que nos parezcan importantes a un dispositivo de almacenamiento a través de rsync. Es extrapolable a máquinas en distintas redes siempre y cuando el acceso remoto sea factible:

#!/usr/local/bin/bash

# Montando la partición de seguridad
/sbin/mount /backup

# Sincronizando bbdd y htdocs
/usr/local/bin/rsync --progress --delete -lprtvvzog /var/lib/mysql/ /backup/mysql/
/usr/local/bin/rsync --progress --delete -lprtvvzog /var/www/ /backup/htdocs/

# Copiando partes importantes del sistema
/usr/local/bin/rsync --progress --delete -lprtvvzog /etc/ /backup/etc/
/usr/local/bin/rsync --progress --delete -lprtvvzog /var/log/messages/ /backup/logs/
/usr/local/bin/rsync --progress --delete -lprtvvzog /home/ /backup/home/

# Desmontando la partición de seguridad
/sbin/umount /backup

Complete Backup

Basándonos en la genial idea de Juanjo y arreglando el script a mis necesidades he parido lo siguiente:

#!/bin/bash

# ------------------------------------------------------------
# Variables Generales
# ------------------------------------------------------------
COUNT=168                   # numero de rotaciones
BASE=backup                 # nombre base para las copias
WORK=/media/backup2/muro/   # directorio de trabajo
IP=192.168.0.1              # ip del servidor a copiar

LOGDIR=/media/backup2/log/
LOGNAME=backup_muro.`date '+%d.%m.%Y_%H:%M'`.log
EMAIL_ADMIN=logs@gmail.com
CMD_RSYNC=/usr/bin/rsync


# ------------------------------------------------------------
# Directorios
# ------------------------------------------------------------
SRCDIR=( /etc/ /bin/ )
DSTDIR=( /sys/etc/ /sys/bin/ )


# ---------------------------------------------------------
# Verificamos que los arrays tienen los mismos elementos
# ---------------------------------------------------------
SRCNUM=${#SRCDIR[@]}
DSTNUM=${#DSTDIR[@]}

if [ $SRCNUM -ne $DSTNUM ]; then
        echo "Los arrays son desiguales"
        exit
fi


# ------------------------------------------------------------
# Movemos $base.0 a $base.1 para dej last backup en 0
# Restamos uno alum de elementos del array (empieza en 0)
# Y empezamos la copia de seguridad SOLO si la IP responde
# al ping que enviamos
# ------------------------------------------------------------
if ping -c 1 $IP >/dev/null 2>&1
then
        cd $WORK
        k=$COUNT
        rm -rf $BASE.$k
        while [ $k -gt 0 ]; do
                mv $BASE.$(($k-1)) $BASE.$k 2> /dev/null
                mv $BASE.$(($k-1))-info $BASE.$k-info 2>/dev/null
                k=$(($k-1))
        done
        for i in `seq 0 $(($SRCNUM-1))`; do

                # Creamos los directorios correspondientes
                echo "mkdir -p $BASE.0${DSTDIR[$i]}"

                # Sincronizamos
                echo "$CMD_RSYNC -lprtvvzog -e ssh \\
                	--link-dest=$WORK$BASE.1${DSTDIR[$i]} \\
                	root@$IP:${SRCDIR[$i]} \\
                	$WORK$BASE.0${DSTDIR[$i]}"
        done

        # Reportando la informacion
        echo "Rotated on `date '+%d.%m.%Y_%H:%M'`" > $BASE.0-info
        cat $LOGDIR/$LOGNAME | mail -s "$LOGNAME" $EMAIL_ADMIN
else
        echo "$IP no responde"
        exit
fi
# EOF

Donde las dos primeras secciones son las configurables. Variables generales que hablan por si mismas y dos arrays con los directorios a backupear, $SRCDIR para el origen y $DSTDIR para el destino dentro del directorio base ($WORK).

Algo es algo y tener copias completas ocupando (tanto en disco como en ancho de banda) como incrementales no tiene precio. Claro que este script es mejorable, así que ideas, sugerencias y críticas a los comentarios.

sysadmin

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.