Linux
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