Distintas formas de backup

05.mar 2007 Envía un trackback

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.
syadmin admin backup seguridad rsync scp

Comentarios
Gravatar Wu@05.03.2007, 'Re: Distintas formas de backup'

Yo tuve que plantearme una politica de backup para un server de intranet que he montado hace poco, y en un principio iba a tirar de la idea de Juanjo tambien, pero si lees los comentarios de su post, veras que alguien apunta a rdiff-backup.

Me dio por mirarlo y la verdad es que es muy muy comodo. Con un simple `rdiff-backup dir_origen dir_destino` esta herramienta ya hace un copia incremental del directorio dir_origen sobre dir_destino, y luego tu puedes hacer un `rdiff-backup restore` para recuperar la ultima copia (que tambien puedes recuperar con cp por que almacena los datos "tal cual") o `rdiff-backup -restore-as-of X` para recuperar la copia tal cual estaba el dia X (con fechas y un monton de opciones mas.

Desde luego, una opcion a tener en cuenta rdiff-backup.


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]