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