[comp.unix.admin] Automated Stand Alone Backups

mstgil@sol (Marc Ph. A. J. St.-Gil) (05/03/91)

As I have received multiple requests for details on how I have implemented
an almost completely unattended backup system for our 1.7GB server system,
I have decided to post this document to comp.unix.admin.  Perhaps it should
be worked into a/the FAQ for this group?

First off, let me describe our environment.  THe system being backed up is
a Solbourne 5E/902 Enterprise server with 2 IPI drives totaling about 1.7GB
of disk storage and 1 8mm 2.3 GB cassette drive for tape backup.  This system
is running Solbourne OS/MP v.4.0D which is equivalent to SunOS 4.0.3.  We are
not currently exporting any filesystems nor are we mounting same.  Therefore,
I have not had to deal with the headache of cross network backups.  The
following set of files and scripts is how I have set things up so that all
the operators have to do is swap a tape once a day.  Our operators are part-
time student employees who are quite competent, but we want them to spend a
majority of their time working on less brainless tasks than switching tapes
for backups all day.

My proceedure consists of three parts.  Part 1 is a set of cron entries to
make things happen at the proper time.  Part 2 is a modification to Sol's
/etc/rc script.  And part 3 is a set of scripts designed to actually do the
work.

Part 1  -  the relevant cron entries

# cron table for root
#
# do an incremental backup Sun-Fri at 02:00
0 2 * * 0-5 /var/backups/daily
#
# tell system to shut down at 02:00 for stand alone backups on Sat. at 00:01
1 0 * * 6 /usr/etc/shutdown -r 02:00 " for stand alone backups" >/dev/null 2>&1
#
# create the stand alone backup control file on Sat. at 01:50
50 1 * * 6 /usr/bin/touch /var/backups/do_standalone
#
# remind the operator to put in a new backup tape Sat-Thurs at 17:00
0 17 * * 0-4,6 /var/backups/daily.msg >/dev/console
# and at 08:00 on Friday's
0 8 * * 5 /var/backups/sa.msg >/dev/console
#

Part 2  -  The modified area of our /etc/rc script
	   Lines added are indicated by a leading "> ".

#
# See if things look like they are still mounted read-only.
# If so, perform all the remounting and set up work now.
#
touch /
if [ $? -ne 0 ]; then
	(echo "Remounting file systems")			>/dev/console
	sh /etc/rc.single
fi

> if [ -r /var/backups/do_standalone ]; then
> 	#remove the flag file 1st to prevent possible looping on error
> 	rm -f /var/backups/do_standalone
> 	#do the backup synchronously
> 	sh /var/backups/standalone
> 	#check the backup asynchronously
> 	sh /var/backups/sa.check &
> fi

if [ -r /fastboot ]; then
	rm -f /fastboot
elif [ $1x = autobootx ]; then
	(echo Automatic reboot in progress...)			>/dev/console
else
	(echo Multiuser startup in progress...)			>/dev/console
fi
date >/dev/console

Part 3  -  the backup scripts

These are included as a shell archive, they should be sufficiently commented
internally.  :)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	daily
#	daily.msg
#	sa.bump
#	sa.check
#	sa.msg
#	sa.week
#	standalone
# This archive created: Fri May  3 09:02:42 1991
export PATH; PATH=/bin:$PATH
if test -f 'daily'
then
	echo shar: will not over-write existing file "'daily'"
else
cat << \SHAR_EOF > 'daily'
#!/bin/sh
# set -x
#  Script Header
#
#  Name/Usage: daily
#
#  Purpose: Perform a level 5 backup while running
#
#  Known Bugs: none
#
#  Inputs: none
#
#  Dependencies: Expects a writeable tape to be in the drive
#
#  Outputs: Backup Tape, log file /var/backups/daily.out.<Day>
#
#  Side Effects: none
#
#  Author: Marc Ph. A. J. St.-Gil
#
#  Creation Date: Tue Feb 26 19:19:23 CST 1991
#
#  Modification History:
#  changed tape drive and added vars for speed and ease of modification
#	Fri Apr 19 11:59:31 CDT 1991
#
# contents of /etc/fstab when last modified
# /dev/xd0a /                         4.2 rw       1 1
# /dev/xd0d /var                      4.2 rw       1 2
# /dev/xd0g /usr                      4.2 rw       1 3
# /dev/xd1a /etc/security/audit/sol   4.2 rw       1 1
# /dev/xd1b /etc/security/audit/sol.1 4.2 rw       1 1
# /dev/xd1d /home                     4.2 rw,quota 1 3
# /dev/xd0e /tmp                      4.2 rw       1 1
# /dev/xd0f /var/tmp                  4.2 rw       1 2

TAPE=/dev/rst0
NTAPE=/dev/nrst0

DUMP=/usr/etc/dump
DUMP_OPTS="S5ufM $NTAPE P6-120"

RESTORE=/usr/etc/restore
RESTORE_OPTS="tfMs $TAPE P6-120"

REWIND="/usr/bin/mt -f $TAPE rew"

# figure out what 'day' it is
day=`date +%a`

echo "Doing backups for $day" >/var/backups/daily.out.$day
echo >>/var/backups/daily.out.$day
echo >>/var/backups/daily.out.$day

$REWIND
if [ $? -ne 0 ]; then exit -1; fi

# dump file systems in order most likely to need restoration

# /
$DUMP $DUMP_OPTS /dev/rxd0a >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /usr
$DUMP $DUMP_OPTS /dev/rxd0g >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /home
$DUMP $DUMP_OPTS /dev/rxd1d >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /etc/security/audit/sol
$DUMP $DUMP_OPTS /dev/rxd1a >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /etc/security/audit/sol.1
$DUMP $DUMP_OPTS /dev/rxd1b >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /var
$DUMP $DUMP_OPTS /dev/rxd0d >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /tmp
$DUMP $DUMP_OPTS /dev/rxd0e >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day
# /var/tmp
$DUMP $DUMP_OPTS /dev/rxd0f >>/var/backups/daily.out.$day 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/daily.out.$day

$REWIND
if [ $? -ne 0 ]; then exit -1; fi

# now check our work
echo "Now check our work" >>/var/backups/daily.out.$day
echo >>/var/backups/daily.out.$day

# /
$RESTORE $RESTORE_OPTS 1 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "1st backup ok" >>/var/backups/daily.out.$day
# /usr
$RESTORE $RESTORE_OPTS 2 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "2nd backup ok" >>/var/backups/daily.out.$day
# /home
$RESTORE $RESTORE_OPTS 3 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "3rd backup ok" >>/var/backups/daily.out.$day
# /etc/security/audit/sol
$RESTORE $RESTORE_OPTS 4 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "4th backup ok" >>/var/backups/daily.out.$day
# /etc/security/audit/sol.1
$RESTORE $RESTORE_OPTS 5 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "5th backup ok" >>/var/backups/daily.out.$day
# /var
$RESTORE $RESTORE_OPTS 6 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "6th backup ok" >>/var/backups/daily.out.$day
# /tmp
$RESTORE $RESTORE_OPTS 7 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "7th backup ok" >>/var/backups/daily.out.$day
# /var/tmp
$RESTORE $RESTORE_OPTS 8 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "8th backup ok" >>/var/backups/daily.out.$day

$REWIND
if [ $? -ne 0 ]; then exit -1; fi
echo "all backups ok - tape rewound" >>/var/backups/daily.out.$day
SHAR_EOF
chmod +x 'daily'
fi # end of overwriting check
if test -f 'daily.msg'
then
	echo shar: will not over-write existing file "'daily.msg'"
else
cat << \SHAR_EOF > 'daily.msg'
#!/bin/sh
# set -x
#  Script Header
#
#  Name/Usage: daily.msg
#
#  Purpose: print a message about which backup tape to insert
#
#  Known Bugs: none
#
#  Inputs: none
#
#  Dependencies: none
#
#  Outputs: see purpose
#
#  Side Effects: none
#
#  Author: Marc Ph. A. J. St.-Gil
#
#  Creation Date: Tue Apr 30 14:05:54 CDT 1991
#
#  Modification History:
#
echo "Please insert tape for `date +%a`."
SHAR_EOF
chmod +x 'daily.msg'
fi # end of overwriting check
if test -f 'sa.bump'
then
	echo shar: will not over-write existing file "'sa.bump'"
else
cat << \SHAR_EOF > 'sa.bump'
#!/bin/sh
# set -x
#  Script Header
#
#  Name/Usage: sa.bump
#
#  Purpose: Bump the sa.week file around one for syncing up schedules
#
#  Known Bugs: none
#
#  Inputs: /var/backups/sa.week
#
#  Dependencies: /var/backups/sa.week
#
#  Outputs: stdout, /var/backups/sa.week
#
#  Side Effects: none
#
#  Author: Marc Ph. A. J. St.-Gil
#
#  Creation Date: Sat Apr 27 11:32:32 CDT 1991
#
#  Modification History:
#

# figure out what 'week' it is
week=`cat /var/backups/sa.week`

# tell user
echo "Current week set to $week"

# set up for next week
week=`expr $week + 1`;
if [ $week -eq 5 ]; then week=1; fi
echo $week > /var/backups/sa.week

# tell user
echo "Week now set to $week"
SHAR_EOF
chmod +x 'sa.bump'
fi # end of overwriting check
if test -f 'sa.check'
then
	echo shar: will not over-write existing file "'sa.check'"
else
cat << \SHAR_EOF > 'sa.check'
#!/bin/sh
# set -x
#  Script Header
#
#  Name/Usage: sa.check
#
#  Purpose: Check the level 0 backup while coming up from re-boot
#
#  Known Bugs: none
#
#  Inputs: /dev/st0, /var/backups/sa.week
#
#  Dependencies: /dev/st0, /var/backups/sa.week
#
#  Outputs: /var/backups/sa.out.<week#>, /var/backups/sa.week
#
#  Side Effects: none
#
#  Author: Marc Ph. A. J. St.-Gil
#
#  Creation Date: Sat Apr 27 11:23:59 CDT 1991
#
#  Modification History:
#
# contents of /etc/fstab when last modified
# /dev/xd0a /                         4.2 rw       1 1
# /dev/xd0d /var                      4.2 rw       1 2
# /dev/xd0g /usr                      4.2 rw       1 3
# /dev/xd1a /etc/security/audit/sol   4.2 rw       1 1
# /dev/xd1b /etc/security/audit/sol.1 4.2 rw       1 1
# /dev/xd1d /home                     4.2 rw,quota 1 3
# /dev/xd0e /tmp                      4.2 rw       1 1
# /dev/xd0f /var/tmp                  4.2 rw       1 2

TAPE=/dev/rst0
NTAPE=/dev/nrst0

RESTORE=/usr/etc/restore
RESTORE_OPTS="tfMs $TAPE P6-120"

REWIND="/usr/bin/mt -f $TAPE rew"

# figure out what 'week' it is
week=`cat /var/backups/sa.week`

# start backup
echo >>/var/backups/sa.out.$week
echo "Checking backups for week $week" >>/var/backups/sa.out.$week
echo >>/var/backups/sa.out.$week
echo >>/var/backups/sa.out.$week

# dump file systems in order most likely to need restoration

$REWIND
if [ $? -ne 0 ]; then exit -1; fi

# /
$RESTORE $RESTORE_OPTS 1 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "1st backup appears ok" >>/var/backups/sa.out.$week
# /usr
$RESTORE $RESTORE_OPTS 2 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "2nd backup appears ok" >>/var/backups/sa.out.$week
# /home
$RESTORE $RESTORE_OPTS 3 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "3rd backup appears ok" >>/var/backups/sa.out.$week
# /etc/security/audit/sol
$RESTORE $RESTORE_OPTS 4 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "4th backup appears ok" >>/var/backups/sa.out.$week
# /etc/security/audit/sol.1
$RESTORE $RESTORE_OPTS 5 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "5th backup appears ok" >>/var/backups/sa.out.$week
# /var
$RESTORE $RESTORE_OPTS 6 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "6th backup appears ok" >>/var/backups/sa.out.$week
# /tmp
$RESTORE $RESTORE_OPTS 7 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "7th backup appears ok" >>/var/backups/sa.out.$week
# /var/tmp
$RESTORE $RESTORE_OPTS 8 >/dev/null
if [ $? -ne 0 ]; then exit -1; fi
echo "8th backup appears ok" >>/var/backups/sa.out.$week

$REWIND
if [ $? -ne 0 ]; then exit -1; fi
echo "all backups appear ok - tape rewound" >>/var/backups/sa.out.$week

# set up for next week
week=`expr $week + 1`;
if [ $week -eq 5 ]; then week=1; fi
echo $week > /var/backups/sa.week
SHAR_EOF
chmod +x 'sa.check'
fi # end of overwriting check
if test -f 'sa.msg'
then
	echo shar: will not over-write existing file "'sa.msg'"
else
cat << \SHAR_EOF > 'sa.msg'
#!/bin/sh
# set -x
#  Script Header
#
#  Name/Usage: sa.msg
#
#  Purpose: print a message about which weekly backup tape to insert
#
#  Known Bugs: none
#
#  Inputs: none
#
#  Dependencies: none
#
#  Outputs: see purpose
#
#  Side Effects: none
#
#  Author: Marc Ph. A. J. St.-Gil
#
#  Creation Date: Tue Apr 30 14:05:54 CDT 1991
#
#  Modification History:
#
week=`cat /var/backups/sa.week`
echo "Please insert tape for week $week."
SHAR_EOF
chmod +x 'sa.msg'
fi # end of overwriting check
if test -f 'sa.week'
then
	echo shar: will not over-write existing file "'sa.week'"
else
cat << \SHAR_EOF > 'sa.week'
3
SHAR_EOF
fi # end of overwriting check
if test -f 'standalone'
then
	echo shar: will not over-write existing file "'standalone'"
else
cat << \SHAR_EOF > 'standalone'
#!/bin/sh
# set -x
#  Script Header
#
#  Name/Usage: standalone
#
#  Purpose: Perform a level 0 backup while coming up from re-boot
#
#  Known Bugs: appears to hang re-boot if no tape in drive (fixed?)
#
#  Inputs: Whole File System, /var/backups/sa.week
#
#  Dependencies: Tape in /dev/st0, /var/backups/sa.week
#
#  Outputs: Backup Tape in /dev/st0
#
#  Side Effects: none
#
#  Author: Marc Ph. A. J. St.-Gil
#
#  Creation Date: Tue Feb 26 19:19:23 CST 1991
#
#  Modification History:
#  changed tape drive and added vars for speed and ease of modification
#	Fri Apr 19 15:45:01 CDT 1991
#  changed to a two part script - this part makes backups and exits,
#    other part checks backup in background (sa.check)  they are tightly
#    coupled!
#       Sat Apr 27 11:23:59 CDT 1991
#
# contents of /etc/fstab when last modified
# /dev/xd0a /                         4.2 rw       1 1
# /dev/xd0d /var                      4.2 rw       1 2
# /dev/xd0g /usr                      4.2 rw       1 3
# /dev/xd1a /etc/security/audit/sol   4.2 rw       1 1
# /dev/xd1b /etc/security/audit/sol.1 4.2 rw       1 1
# /dev/xd1d /home                     4.2 rw,quota 1 3
# /dev/xd0e /tmp                      4.2 rw       1 1
# /dev/xd0f /var/tmp                  4.2 rw       1 2

TAPE=/dev/rst0
NTAPE=/dev/nrst0

DUMP=/usr/etc/dump
DUMP_OPTS="0ufM $NTAPE P6-120"

REWIND="/usr/bin/mt -f $TAPE rew"
TAPECHECK="/usr/bin/mt -f $TAPE status"

$TAPECHECK

# figure out what 'week' it is
week=`cat /var/backups/sa.week`

# start backup
echo "Doing backups for week $week" >/var/backups/sa.out.$week
echo >>/var/backups/sa.out.$week
echo >>/var/backups/sa.out.$week

# dump file systems in order most likely to need restoration

$REWIND
if [ $? -ne 0 ]; then exit -1; fi

# /
$DUMP $DUMP_OPTS /dev/rxd0a >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /usr
$DUMP $DUMP_OPTS /dev/rxd0g >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /home
$DUMP $DUMP_OPTS /dev/rxd1d >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /etc/security/audit/sol
$DUMP $DUMP_OPTS /dev/rxd1a >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /etc/security/audit/sol.1
$DUMP $DUMP_OPTS /dev/rxd1b >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /var
$DUMP $DUMP_OPTS /dev/rxd0d >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /tmp
$DUMP $DUMP_OPTS /dev/rxd0e >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week
# /var/tmp
$DUMP $DUMP_OPTS /dev/rxd0f >>/var/backups/sa.out.$week 2>&1
if [ $? -ne 0 ]; then exit -1; fi
echo >>/var/backups/sa.out.$week

$REWIND
if [ $? -ne 0 ]; then exit -1; fi
echo "backups ran without errors - tape rewound" >>/var/backups/sa.out.$week
SHAR_EOF
chmod +x 'standalone'
fi # end of overwriting check
#	End of shell archive
exit 0

Cheers!,
Marc
--
Marc St.-Gil, UNIX Systems Administrator   mstgil@{sol,vaxa,vaxb}.acs.unt.edu
 University of North Texas  817/565-2324   mstgil@{ponder,solo}.csci.unt.edu
 Academic Computing Services   DISCLAIMER: My employers had no idea I was
 PO Box 13495, Denton TX, 76203            going to say that.