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