Linux

2011-08-07

Jag �r Linuxanv�ndare sedan 1999 och hade t�nkt forts�tta med det.


Backup

Jag k�r backup till en Ubuntudator i k�ket, kopplad till en Seagate 1TB USBdisk, se diagramet. F�r att f� maximal hastighet har jag valt att k�ra krypteringen med hj�lp av blowfish. Jag har i dagsl�get ungef�r 525 GB data som backupas och det tar en halvtimme att skapa en ny backup.

Jag k�r ett script som kopierar data till backupdisken, inget konstigt med det. Det smarta med mitt backupscript �r att jag sparar 7 versoner av varje fil, i en 1 dag gammal version, en 2 dagars, en 4 dagars, en 8, en 16, en 32 och en 64 dagar gammal. Det riktigt kluriga �r att det tar minimalt med plats p� min backupdisk d� endast skillnader fr�n den �ldsta filen sparas. Dessutom skickas bara f�r�ndrade data mellan server och backup, s� det g�r snabbt. Det smarta med versionshanteringen �r h�rda l�nkar, "cp -al" som skapar kopior som inte tar n�gon plats, och rsynk som hanterar vad som ska skickas mellan server och backup. Efter att r�tt katalog har identifierats s� suddas denna backup bort och ers�tts med en l�nkas kopia av den senaste backupen f�r att minimera �verf�ringen av data i n�tverket. Sen uppdateras denna backup till att avspegla systemets nuvarande status.

#!/bin/bash

# Backup utility using rsync and ssh
#Lars Karlander 2008
DATE=`date '+%Y-%m-%d'`
LOG=/tmp/rs-backup.log

#client is the one with the orig. data
BACKUP_CLIENT=localhost
CLIENT_DIRS="/home/ /etc/ /var/www/ /var/log/"
EXCLUDE_DIRS="/home/lars/.mozilla"

BACKUP_SERVER=192.168.1.16
#NO TAILING / in BACKUP_HOME
BACKUP_HOME=/home/backup
BUSER=root
RSYNC_OPTIONS="-aRv --delete"

##################### MAIN PROGRAM #######################
log()
{
time=`gettime`
echo "$DATE $time : $*"|tee -a $LOG
}
gettime()
{
time=`date '+%H:%M:%S'`
echo $time
}

# Make sure we are running as root
if [ `id -u` != 0 ] ; then
log "Error: Sorry, must be root. Exiting..."
exit 1
fi

rotate2()
{
rm -f /tmp/brot.txt
ssh -c blowfish $BUSER@$BACKUP_SERVER "ls -1rt $BACKUP_HOME" >/tmp/brot.txt
#nu ska namnen klippas, bara bokstaverna ska vara kvar
SISTA1=`cat /tmp/brot.txt|tail -1|cut -b 1`
SISTA2=`cat /tmp/brot.txt|tail -2| head -1|cut -b 1`
SISTA3=`cat /tmp/brot.txt|tail -3| head -1|cut -b 1`
SISTA4=`cat /tmp/brot.txt|tail -4| head -1|cut -b 1`
SISTA5=`cat /tmp/brot.txt|tail -5| head -1|cut -b 1`
SISTA6=`cat /tmp/brot.txt|tail -6| head -1|cut -b 1`
cat /tmp/brot.txt

if [ "$SISTA1" != "A" ] ; then
BACKUPTARGET="A"
else
if [ "$SISTA2" != "B" ] ; then
BACKUPTARGET="B"
else
if [ "$SISTA3" != "C" ] ; then
BACKUPTARGET="C"
else
if [ "$SISTA4" != "D" ] ; then
BACKUPTARGET="D"
else
if [ "$SISTA5" != "E" ] ; then
BACKUPTARGET="E"
else
if [ "$SISTA6" != "F" ] ; then
BACKUPTARGET="F"
else
BACKUPTARGET="G"
fi
fi
fi
fi
fi
fi
echo "Backuptarget=$BACKUPTARGET"
#target valt, dax att radera target..
ssh -c blowfish $BUSER@$BACKUP_SERVER "rm -rf $BACKUP_HOME/$BACKUPTARGET-20??-??-??"
log "Tog bort $BACKUPTARGET"
#och kopiera till en ny mapp med cp -al... THIS IS WHERE THE MAGIC HAPPENS...
ssh -c blowfish $BUSER@$BACKUP_SERVER "cp -al $BACKUP_HOME/$SISTA1-* $BACKUP_HOME/$BACKUPTARGET-$DATE"
ssh -c blowfish $BUSER@$BACKUP_SERVER "touch $BACKUP_HOME/$BACKUPTARGET-$DATE"
log "Kopierade till $BACKUP_HOME fr�n $SISTA1"
}


# File system backups
rotate2
for DIR in $CLIENT_DIRS ; do
EXCLUDE_LIST=""
for EX in $EXCLUDE_DIRS ; do
log "Examining exclude list..."
DIR_LEN=`echo $DIR | wc -m`
DIR_LEN=`expr $DIR_LEN - 1`
EXD=`echo $EX | cut -c 1-$DIR_LEN`
#echo " $DIR = $EXD"
if [ "$DIR" = "$EXD" ] ; then
EXCLUDE_LIST="$EXCLUDE_LIST $EX "
log "Adding $EX to exclude list for this backup."
fi
done
if [ ! -z $EXCLUDE_LIST ] ; then
log "Excluding the following directories from this backup: $EXCLUDE_LIST "
fi
if [ ! -z $EXCLUDE_LIST ] ; then
RSYNC_OPTIONS="$RSYNC_OPTIONS --exclude $EXCLUDE_LIST"
fi
log "Starting backup of $DIR"
if rsync $RSYNC_OPTIONS -e "ssh -c blowfish" $DIR $BUSER@$BACKUP_SERVER:$BACKUP_HOME/$BACKUPTARGET-$DATE/ >> $LOG 2>&1 ; then
log "Completed backup of $DIR"
else
log "Warning: Backup of $DIR on $BACKUP_CLIENT could not be completed"
error_status=6
fi
done
exit $error_status