Quick
tip:
Here
is my TAR incremental backup strategy.  I have been using rsync for a long
time but recently ran into a number of permission and symlink issues rsync’ing
from an Ubuntu guest to a Windows host.
A few
comments on the bash script below:
1.   
The
do_backup() function is a common function and it does all the work of the
backup.
2.    The do_backup() function has to
take 4 parameters
a.   
$1
is the source directory.  This is the directory you want to backup, OR,
this is the directory that has stuff in it you want to backup.
b.   
$2
is the destination directory.  This directory is relative to
${backupHome}, but still starts with the / character.  This is where you
want the TAR balls to end up.
c.   
$3
is a name for the backup.  This is used to create the names of the TAR
balls and the SNAR indexes.
d.    $4 is a command to run inside
the source directory ($1) which will be piped to the `tar` command for backup.
3.   
This
strategy makes a full backup (level 0) and a single incremental backup (level
1).  The level 1 backup is (correctly) overwritten each time a backup is
performed.
4.    A full backup is performed if:
a.   
A
backup has never been done before
b.    The size of the incremental
backup is greater than 10% of the size of the full backup.
Bash
script
#!/bin/bash
backupHome=/mnt/hgfs/Backup
#
# First check to see
that that backup directory exists.
# If it does,
continue. Otherwise, exit with error code.
#
if [ ! -d
"${backupHome}" ]; then
       
echo "Directory ${backupHome} does NOT exist, exit."
       
exit 1;
else
       
echo "Directory ${backupHome} exists, continue."
fi
# do_backup
"/etc/postfix" "/etc/postfix" "main" 'echo
main.cf'
function do_backup {
   
local backupSrc=$1
   
local backupDst=${backupHome}${2}
   
local backupNme=$3
   
local backupDir=$4
   
local fullSnarFile=${backupDst}/${backupNme}_full.snar
   local
fullTarFile=${backupDst}/${backupNme}_full.tar.gz
   
local level1SnarFile=${backupDst}/${backupNme}_level_01.snar
   
local level1TarFile=${backupDst}/${backupNme}_level_01.tar.gz
   
echo "Backup: ${backupNme} from: ${backupSrc} to: ${backupDst}"
   
mkdir -p ${backupDst}
   
cd ${backupSrc}
    #
Check file percentages and see if full backup is needed
   
if [ -f ${fullTarFile} ] && [ -f ${level1TarFile} ]
   
then
       
local fullSize=$(stat -c%s ${fullTarFile})
       
echo "  Size of ${fullTarFile} is ${fullSize}"
       
local level1Size=$(stat -c%s ${level1TarFile})
       
echo "  Size of ${level1TarFile} is ${level1Size}"
       
local percentChange=$(echo "scale=2; (${level1Size}/${fullSize}) *
100" | bc)
       
percentChange=$(printf "%.0f" ${percentChange})
       
echo "  Percent change is ${percentChange}"
       
if [ ${percentChange} -gt 10 ]
       
then
           
echo "  Prepare for a new full backup"
     
      rm -f ${fullSnarFile}
           
rm -f ${level1SnarFile}
           
rm -f ${level1TarFile}
       
fi
   
fi
    #
If file does not exist, perform full backup
   
if [ ! -f ${fullSnarFile} ]
   
then
       
echo "  Performing full backup"
       
eval ${backupDir} | tar --listed-incremental ${fullSnarFile} -cpzf ${fullTarFile}
-T -
   
else
       
echo "  Performing level 1 backup"
       
cp -f ${fullSnarFile} ${level1SnarFile}
       
eval ${backupDir} | tar --listed-incremental ${level1SnarFile} -cpzf
${level1TarFile} -T -
   
fi
}
Examples
Let’s
take a look at a few usage examples.  For these examples, assume that
${backupHome} is /mnt/hgfs/Backup/ like in the script.
Example
1: 
do_backup
"/home/apache" "/home/apache" "apache" 'echo .'
Example
1 means you want to backup the /home/apache directory to the
/mnt/hgfs/Backup/home/apache directory. The parameter “apache” means the
following files will be created:
/mnt/hgfs/Backup/home/apache/apache_full.snar
/mnt/hgfs/Backup/home/apache/apache_full.tar.gz
/mnt/hgfs/Backup/home/apache/apache_level_01.snar
/mnt/hgfs/Backup/home/apache/apache_level_01.tar.gz
Finally,
‘echo .’ means the TAR ball will contain everything inside the /home/apache
directory
Example
2: 
do_backup
"/etc/postfix" "/etc/postfix" "main" 'echo
main.cf'
Example
2 means you want to backup the /etc/postfix directory to the
/mnt/hgfs/Backup/etc/postfix directory. The parameter “main” means the
following files will be created:
/mnt/hgfs/Backup/etc/postfix/main_full.snar
/mnt/hgfs/Backup/etc/postfix/main_full.tar.gz
/mnt/hgfs/Backup/etc/postfix/main_level_01.snar
/mnt/hgfs/Backup/etc/postfix/main_level_01.tar.gz
Finally,
‘echo main.cf’ means the TAR ball will ONLY contain the
/etc/postfix/main.cf file!
Example
3: 
do_backup
"/home/michael" "/home/michael" "michael" 'find .
-type f -name ".forward" -o -type d -name "cron" -o
-type d -name
"Applications" -o -type d -name ".ssh"'
Example
3 means you want to backup the /home/michael directory to the
/mnt/hgfs/Backup/home/michael directory. The parameter “michael” means the
following files will be created:
/mnt/hgfs/Backup/home/michael/michael_full.snar
/mnt/hgfs/Backup/home/michael/michael_full.tar.gz
/mnt/hgfs/Backup/home/michael/michael_level_01.snar
/mnt/hgfs/Backup/home/michael/michael_level_01.tar.gz
Finally,
'find . -type f -name ".forward" -o -type d -name "cron" –o
-type d -name "Applications" -o -type d -name ".ssh"' means
the TAR ball will ONLY contain the following:
/home/michael/.forward
/home/michael/cron/
/home/michael/Applications/
/home/michael/.ssh/
Enjoy!
References
Whipp,
Paul. (2010, December). Using tar for full and incremental backups.
paulwhippconsulting.com. Retrieved April 4, 2016, from http://paulwhippconsulting.com/blog/using-tar-for-full-and-incremental-backups/