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

Reply via email to