On Saturday 24 Jan 2004 15:57, Aaron Walker wrote: > Once I get everything back up and running, I want to start making it > a habit to back things up on a regular basis. I was wondering what > others on this list did for their backups. > > any recommendations? > > Thanks, > Aaron > I use tar like this: #====================================================================== #! /bin/bash # /usr/local/bin/backup ####################### # Backup Script ####################### # Jason Calabrese <[EMAIL PROTECTED]> # Modified by Peter Ruskin <[EMAIL PROTECTED]> 25-Sep-03
# This script uses tar to back up your whole system (with an EXCLUDE # variable to handle what you want to skip) to a dedicated backup disk. # I have three 200GB disks, one of which has a single hdg1 partition for # backups. Using tar by itself is *much* quicker than using bz2 # compression. # Most of the script is taken up with reporting. I found the best way # to get capacity is to cat /proc/partitions for the backup partition to # get the TOTALBLOCKS and divide that by 1024 twice. That reports 189GB # here. # cat /proc/partitions doesn't work for 2.6 kernels. # I pipe some of the calculations to bc to prevent divide-by-zero errors # when fractions are involved. # CHANGES # 04-Dec-03 Peter Ruskin <[EMAIL PROTECTED]>: if clause added # to TOTALBLOCKS to allow for 2.6 kernels # 06-Dec-03 Peter Ruskin <[EMAIL PROTECTED]>: separate backups # for linux and Windows # 18-Jan-04 Peter Ruskin <[EMAIL PROTECTED]>: removed USEDSPACE # and RSYNCSPACE variables; they use `du` # which takes up too much time (6-8 minutes/calculation). ####################### # Initial backup variables BK_DISK=hdg BK_PART=hdg1 BACKUP_TO=/mnt/backup HOST=$( hostname|cut -f1 -d. ) # Make sure there is nothing on the unmounted mount point echo "Ensuring that an unmouted ${BACKUP_TO} is empty..." echo if [[ "$(mount | grep ${BACKUP_TO})" == "" ]]; then echo " ${BACKUP_TO} is not mounted" echo if [[ "$(ls ${BACKUP_TO})" != "" ]]; then rm ${BACKUP_TO}/* 2> /dev/null fi fi echo " Backup of ${HOST} started at `date +'%H:%M'`" echo echo " Mounting boot partition..." mount /boot echo echo " Mounting backup disk..." echo " ...waiting 10 seconds for disk to spin up..." mount ${BACKUP_TO} sleep 10 if [[ "$(mount | grep ${BACKUP_TO})" == "" ]]; then echo " ${BACKUP_TO} is not mounted" exit 1 fi echo echo " ...calculating..." echo # Variables and calculations before backup FILE_LINUX=${BACKUP_TO}/$HOST-linux-$( date +"%F-%H%M" ).tar FILE_WIN=${BACKUP_TO}/$HOST-win-$( date +"%F-%H%M" ).tar FILE_LIST_LINUX=${BACKUP_TO}/$HOST-linux-$( date +"%F-%H%M" ).list FILE_LIST_WIN=${BACKUP_TO}/$HOST-win-$( date +"%F-%H%M" ).list EXCLUDE_LINUX='--exclude /mdk --exclude /mnt/downloads/Mandrake \ --exclude /mnt/downloads/Pan --exclude /mnt/backup \ --exclude /mnt/cdrom --exclude /mnt/floppy --exclude /mnt/KROH \ --exclude /mnt/KROH-LIESE --exclude /mnt/KROH-PETER \ --exclude /mnt/PENGUIN --exclude /mnt/win --exclude /proc \ --exclude /sys --exclude /usr/portage/distfiles --exclude /tmp \ --exclude /root/.ccache --exclude /home/peter/.ccache' EXCLUDE_WIN='--exclude /mnt/win/d/Pan --exclude /mnt/win/j \ --exclude /mnt/win/l --exclude /mnt/win/n --exclude /mnt/win/o' #USEDSPACE=$( du -sh ${BACKUP_TO} | grep G | awk '{print $1}' | \ # cut -f1 -dG ) # test for first run unset FIRSTTIME if ! [[ $(ls ${BACKUP_TO}/${HOST}-*.tar 2> /dev/null) ]]; then # To pevent divide by zero errors. # TARSPACE is the space occupied by tarballs. You may have other stuff # on this disk. # I do a daily rsync backup to this partition for instant rescue. TARSPACE=1 TARSPACE_LINUX=1 TARSPACE_WIN=1 NUMBAKUPS=1 NUMBAKUPS_LINUX=1 NUMBAKUPS_WIN=1 FIRSTTIME=1 else TARSPACE=$( du -sch ${BACKUP_TO}/${HOST}*.tar | grep total | \ awk '{print $1}' | cut -f1 -dG ) TARSPACE_LINUX=$( du -sch ${BACKUP_TO}/${HOST}-linux*.tar | \ grep total | awk '{print $1}' | cut -f1 -dG ) TARSPACE_WIN=$( du -sch ${BACKUP_TO}/${HOST}-win*.tar | \ grep total | awk '{print $1}' | cut -f1 -dG ) NUMBAKUPS=$( ls ${BACKUP_TO}/${HOST}-*.tar | wc -w | awk '{print $1}' ) NUMBAKUPS_LINUX=$( ls ${BACKUP_TO}/${HOST}-linux*.tar | wc -w | \ awk '{print $1}' ) NUMBAKUPS_WIN=$( ls ${BACKUP_TO}/${HOST}-win*.tar | wc -w | \ awk '{print $1}' ) fi if [[ $(uname -r | cut -d. -f2) -eq 6 ]]; then # This is disk manufacturers' gigabytes (1000000000 bytes) # CAPACITY=$( echo "$(cat /sys/block/${BK_DISK}/size)*512/1000000000" \ #| bc ) CAPACITY=$( echo "$(cat /sys/block/${BK_DISK}/size) \ *512/1024/1024/1024" \ | bc ) else TOTALBLOCKS=$(cat /proc/partitions|grep \ ide/host2/bus1/target0/lun0/part1|awk '{print $3}') CAPACITY=$(( ${TOTALBLOCKS}/1024/1024 )) fi #RSYNCSPACE=$( du -sch ${BACKUP_TO}/rsync* | grep total | \ #awk '{print $1}' | cut -f1 -dG) #REALCAPACITY=$( echo "${CAPACITY} - ${RSYNCSPACE}" | bc ) #SPACELEFT=$( echo "${CAPACITY} - ${USEDSPACE}" | bc ) SPACELEFT=$(df -h ${BACKUP_TO} | grep ${BACKUP_TO} | awk '{print $4}' \ | cut -dG -f1) AVSIZE_LINUX=$( echo "${TARSPACE_LINUX}/${NUMBAKUPS_LINUX}" | bc ) AVSIZE_WIN=$( echo "${TARSPACE_WIN}/${NUMBAKUPS_WIN}" | bc ) AVSIZE=$( echo "${AVSIZE_LINUX}+${AVSIZE_WIN}" | bc ) #ESTBKUPS=$( echo "2*${REALCAPACITY}/${AVSIZE}" | bc ) ESTBKUPS=$( echo "${NUMBAKUPS} + (2 * ${SPACELEFT}/${AVSIZE}) - 2" \ | bc ) # Variables and calculations before backup echo "STATUS BEFORE BACKUP..." echo " Capacity of backup partition: ${CAPACITY}GB" #echo " Space occupied by backup partition: ${USEDSPACE}GB" #echo " Space occupied by rsync backups: ${RSYNCSPACE}GB" echo " Space occupied by tar backups: ${TARSPACE}GB" echo " Space left on backup partition: ${SPACELEFT}GB" if [ $FIRSTTIME ] ; then echo " Number of backups: This is the first backup." else echo " Number of backups: ${NUMBAKUPS}" fi echo " Average size per backup run: ${AVSIZE}GB" echo " Average size of linux backups: ${AVSIZE_LINUX}GB" echo " Average size of Windows backups: ${AVSIZE_WIN}GB" echo " Estimated total number of backups: ${ESTBKUPS}" echo # For when there's not enough space... if [ "$( echo "${SPACELEFT} <= ${AVSIZE}" | bc )" == 1 ] ; then ESTBKUPS=$(( ${ESTBKUPS} - 2 )) # so remove earliest echo " Removing earliest archive - not enough space for backup..." ls ${BACKUP_TO}/$HOST-linux*.tar | sort | head -n1 | xargs rm ls ${BACKUP_TO}/$HOST-linux*.list | sort | head -n1 | xargs rm ls ${BACKUP_TO}/$HOST-win*.tar | sort | head -n1 | xargs rm ls ${BACKUP_TO}/$HOST-win*.list | sort | head -n1 | xargs rm NUMBAKUPS=$( ls ${BACKUP_TO}/${HOST}-*.tar | wc -w | awk '{print $1}' ) NUMBAKUPS_LINUX=$( ls ${BACKUP_TO}/${HOST}-linux*.tar | wc -w | \ awk '{print $1}' ) NUMBAKUPS_WIN=$( ls ${BACKUP_TO}/${HOST}-win*.tar | wc -w | \ awk '{print $1}' ) echo " Number of backups: ${NUMBAKUPS}" echo " Estimated total number of backups: ${ESTBKUPS}" fi ####################### # Now here's the actual backup: the easiest bit. echo echo " Performing backup at `date +'%H:%M'`..." echo #/bin/tar -cpvvf ${FILE} / ${EXCLUDE} > ${FILE_LIST} > /dev/null 2>&1 /bin/tar -cpvvf ${FILE_LINUX} / ${EXCLUDE_LINUX} > ${FILE_LIST_LINUX} \ > /dev/null 2>&1 echo " Linux backup finished at `date +'%H:%M'`" echo " Archive is ${FILE_LINUX}" echo echo " Now backing up Windows..." echo /bin/tar -cpvvf ${FILE_WIN} /mnt/win/ ${EXCLUDE_WIN} >${FILE_LIST_WIN} \ > /dev/null 2>&1 echo " Windows backup finished at `date +'%H:%M'`" echo " Archive is ${FILE_WIN}" ####################### # Variables and calculations after backup echo echo " ...calculating..." echo #USEDSPACE=$( du -sh ${BACKUP_TO} | grep G | awk '{print $1}' | \ #cut -f1 -dG ) #RSYNCSPACE=$( du -sch $BACKUP_TO/rsync* | grep total | \ #awk '{print $1}' | cut -f1 -dG) #REALCAPACITY=$( echo "${CAPACITY} - ${RSYNCSPACE}" | bc ) TARSPACE=$( du -sch ${BACKUP_TO}/${HOST}*.tar | grep total | \ awk '{print $1}' | cut -f1 -dG ) TARSPACE_LINUX=$( du -sch ${BACKUP_TO}/${HOST}-linux*.tar | \ grep total | awk '{print $1}' | cut -f1 -dG ) TARSPACE_WIN=$( du -sch ${BACKUP_TO}/${HOST}-win*.tar | grep total | \ awk '{print $1}' | cut -f1 -dG ) NUMBAKUPS=$( ls ${BACKUP_TO}/${HOST}-*.tar | wc -w | awk '{print $1}' ) NUMBAKUPS_LINUX=$( ls ${BACKUP_TO}/${HOST}-linux*.tar | wc -w | \ awk '{print $1}' ) NUMBAKUPS_WIN=$( ls ${BACKUP_TO}/${HOST}-win*.tar | wc -w | \ awk '{print $1}' ) #SPACELEFT=$( echo "${CAPACITY} - ${USEDSPACE}" | bc ) SPACELEFT=$(df -h ${BACKUP_TO} | grep ${BACKUP_TO} | awk '{print $4}' \ | cut -dG -f1) AVSIZE_LINUX=$( echo "${TARSPACE_LINUX}/${NUMBAKUPS_LINUX}" | bc ) AVSIZE_WIN=$( echo "${TARSPACE_WIN}/${NUMBAKUPS_WIN}" | bc ) AVSIZE=$( echo "${AVSIZE_LINUX}+${AVSIZE_WIN}" | bc ) #ESTBKUPS=$( echo "2*${REALCAPACITY}/${AVSIZE}" | bc ) ESTBKUPS=$( echo "${NUMBAKUPS} + (2 * ${SPACELEFT}/${AVSIZE}) - 2" \ | bc ) if [ "$( echo "${SPACELEFT} <= ${AVSIZE}" | bc )" == 1 ]; then ESTBKUPS=$(( ${ESTBKUPS} - 2 )) # so remove earliest echo " Removing earliest archive - not enough space for tomorrow..." ls ${BACKUP_TO}/$HOST-linux*.tar | sort | head -n1 | xargs rm ls ${BACKUP_TO}/$HOST-linux*.list | sort | head -n1 | xargs rm ls ${BACKUP_TO}/$HOST-win*.tar | sort | head -n1 | xargs rm ls ${BACKUP_TO}/$HOST-win*.list | sort | head -n1 | xargs rm echo # USEDSPACE=$( du -sh ${BACKUP_TO} | grep G | awk '{print $1}' | \ # cut -f1 -dG ) # RSYNCSPACE=$( du -sch $BACKUP_TO/rsync* | grep total | \ # awk '{print $1}' | cut -f1 -dG) # REALCAPACITY=$( echo "${CAPACITY} - ${RSYNCSPACE}" | bc ) TARSPACE=$( du -sch ${BACKUP_TO}/${HOST}*.tar | grep total \ | awk '{print $1}' | cut -f1 -dG ) TARSPACE_LINUX=$( du -sch ${BACKUP_TO}/${HOST}-linux*.tar | \ grep total | awk '{print $1}' | cut -f1 -dG ) TARSPACE_WIN=$( du -sch ${BACKUP_TO}/${HOST}-win*.tar | \ grep total | awk '{print $1}' | cut -f1 -dG ) NUMBAKUPS=$( ls ${BACKUP_TO}/${HOST}-*.tar | wc -w | awk '{print $1}' ) NUMBAKUPS_LINUX=$( ls ${BACKUP_TO}/${HOST}-linux*.tar | wc -w | \ awk '{print $1}' ) NUMBAKUPS_WIN=$( ls ${BACKUP_TO}/${HOST}-win*.tar | wc -w | \ awk '{print $1}' ) # SPACELEFT=$( echo "${CAPACITY} - ${USEDSPACE}" | bc ) SPACELEFT=$(df -h ${BACKUP_TO} | grep ${BACKUP_TO} | \ awk '{print $4}' | cut -dG -f1) AVSIZE_LINUX=$( echo "${TARSPACE_LINUX}/${NUMBAKUPS_LINUX}" | bc ) AVSIZE_WIN=$( echo "${TARSPACE_WIN}/${NUMBAKUPS_WIN}" | bc ) AVSIZE=$( echo "${AVSIZE_LINUX}+${AVSIZE_WIN}" | bc ) # ESTBKUPS=$( echo "2*${REALCAPACITY}/${AVSIZE}" | bc ) ESTBKUPS=$( echo "${NUMBAKUPS} + (2 * ${SPACELEFT}/${AVSIZE}) - 2" \ | bc ) fi echo "STATUS AFTER BACKUP..." echo " Capacity of backup partition: ${CAPACITY}GB" #echo " Space occupied by backup partition: ${USEDSPACE}GB" #echo " Space occupied by rsync backups: ${RSYNCSPACE}GB" echo " Space occupied by tar backups: ${TARSPACE}GB" echo " Space left on backup partition: ${SPACELEFT}GB" echo " Number of backups: $NUMBAKUPS" echo " Average size per backup run: ${AVSIZE}GB" echo " Average size of linux backups: ${AVSIZE_LINUX}GB" echo " Average size of Windows backups: ${AVSIZE_WIN}GB" echo " Estimated total number of backups: $ESTBKUPS" echo echo " Backup of ${HOST} finished at `date +'%H:%M'`" echo echo " Unmounting boot and backup partitions..." /bin/umount -l /boot /bin/umount -l ${BACKUP_TO} echo " Spinning down backup disk..." /sbin/hdparm -y /dev/${BK_DISK} echo echo " To restore a file, search for it in" echo " ${FILE_LIST_LINUX}, e.g. etc/fstab" echo " or ${FILE_LIST_WIN}, e.g." echo " mnt/win/c/scsi/drvlight.hlp, then:" echo " # cd /" echo " # tar -xpvf <full path to tar file> etc/fstab" echo #====================================================================== Peter -- ====================================================================== Gentoo Linux: Portage 2.0.49-r20 kernel-2.6.1-gentoo-w4l i686 AMD Athlon(tm) XP 3200+ KDE: 3.1.5 Qt: 3.2.3 gcc(GCC): 3.2.3 ====================================================================== -- [EMAIL PROTECTED] mailing list