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.