Pour le repertoire, du incrémental avec rsync, et pour le SQL suffit de pisser un mysqldump dans le tas...
#!/bin/sh
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility
# ----------------------------------------------------------------------
# this needs to be a lot more general, but the basic idea is it makes
# rotating backup-snapshots of /home whenever called
# ----------------------------------------------------------------------
unset PATH # suggestion from H. Milz: avoid accidental use of $PATH
# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;
MOUNT=/bin/mount;
UMOUNT=/bin/umount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;
TOUCH=/bin/touch;
DPKG=/usr/bin/dpkg
AWK=/usr/bin/awk
RSYNC=/usr/bin/rsync;
TAR=/bin/tar
# ------------- file locations -----------------------------------------
MOUNT_DEVICE=/dev/sdb1;
SNAPSHOT_RW=/mnt/backup;
EXCLUDES=/usr/local/backup/exclude;
BCKDIR=/depot/tools/linux/backup
# ------------------ the backup of config files ------------------------
$DPKG -l | $AWK '{print $2}' > $BCKDIR/packages.list
$CP /etc/fstab $BCKDIR
$CP /boot/conf* $BCKDIR
$CP /boot/grub/menu.lst $BCKDIR
$CP /etc/X11/xorg.conf* $BCKDIR
$CP /root/.vimrc $BCKDIR/_vimrc
$CP /root/.bashrc $BCKDIR/_bashrc
$CP /usr/local/backup/* $BCKDIR
$CP /bin/maj.sh $BCKDIR
$CP /etc/apt/sources.list $BCKDIR
# ------------- the script itself --------------------------------------
# make sure we're running as root
if (( `$ID -u` != 0 )); then { $ECHO "Sorry, must be root. Exiting..."; exit; } fi
# attempt to remount the RW mount point as RW; else abort
$MOUNT -t ext3 $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
$ECHO "snapshot: could not remount $SNAPSHOT_RW readwrite";
exit;
}
fi;
#######################################################################################
# rotating snapshots of /var/www
#######################################################################################
# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/www/hourly.3 ] ; then \
$RM -rf $SNAPSHOT_RW/www/hourly.3 ; \
fi ;
# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/www/hourly.2 ] ; then \
$MV $SNAPSHOT_RW/www/hourly.2 $SNAPSHOT_RW/www/hourly.3 ; \
fi;
if [ -d $SNAPSHOT_RW/www/hourly.1 ] ; then \
$MV $SNAPSHOT_RW/www/hourly.1 $SNAPSHOT_RW/www/hourly.2 ; \
fi;
# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists
if [ -d $SNAPSHOT_RW/www/hourly.0 ] ; then \
$CP -al $SNAPSHOT_RW/www/hourly.0 $SNAPSHOT_RW/www/hourly.1 ; \
#cd $SNAPSHOT_RW/home/hourly.0 && find . -print | cpio -dpl $SNAPSHOT_RW/home/hourly.1
fi;
# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first. If it were not so, this would copy over the other
# snapshot(s) too!
$RSYNC \
-va --delete --delete-excluded \
--exclude-from="$EXCLUDES" \
/var/www/* $SNAPSHOT_RW/www/hourly.0 ;
# step 5: update the mtime of hourly.0 to reflect the snapshot time
$TOUCH $SNAPSHOT_RW/www/hourly.0 ;
# and thats it for www.
#######################################################################################
# rotating snapshots of /depot
#######################################################################################
# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/depot/hourly.3 ] ; then \
$RM -rf $SNAPSHOT_RW/depot/hourly.3 ; \
fi ;
# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/depot/hourly.2 ] ; then \
$MV $SNAPSHOT_RW/depot/hourly.2 $SNAPSHOT_RW/depot/hourly.3 ; \
fi;
if [ -d $SNAPSHOT_RW/depot/hourly.1 ] ; then \
$MV $SNAPSHOT_RW/depot/hourly.1 $SNAPSHOT_RW/depot/hourly.2 ; \
fi;
# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists
if [ -d $SNAPSHOT_RW/depot/hourly.0 ] ; then \
$CP -al $SNAPSHOT_RW/depot/hourly.0 $SNAPSHOT_RW/depot/hourly.1 ; \
fi;
# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first. If it were not so, this would copy over the other
# snapshot(s) too!
$RSYNC \
-va --delete --delete-excluded \
--exclude-from="$EXCLUDES" \
/depot/ $SNAPSHOT_RW/depot/hourly.0 ;
# step 5: update the mtime of hourly.0 to reflect the snapshot time
$TOUCH $SNAPSHOT_RW/depot/hourly.0 ;
# and thats it for depot.
#######################################################################################
$UMOUNT $SNAPSHOT_RW;
# now remount the RW snapshot mountpoint as readonly
#$MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
#if (( $? )); then
#{
# $ECHO "snapshot: could not remount $SNAPSHOT_RW readonly";
# exit;
#} fi;