rsnapshot can back-up automatically a filesystem, local or remote, just making snapshots. It uses rsync and hard links and keeps multiple, full backups instantly available. The disk space required is just a little more than the space of one full backup, plus incrementals.
I’m going to show you how to install and configure rsnapshot on a fresh-installed OpenBSD 5.0.
Let’s start obtaining the ports:
cd /tmp
ftp ftp://ftp.heanet.ie/pub/OpenBSD/5.0/ports.tar.gz
cd /usr
tar xzf /tmp/ports.tar.gz
Install the port rsnapshot:
cd /usr/port/net/rsnapshot
make install clean
Check which packages have been installed in the system:
pkg_info
p5-Lchown-1.01p1 perl interface to the lchown(2) system call
quirks-1.53 exceptions to pkg_add rules
rsnapshot-1.3.1p1 remote filesystem snapshot utility
rsync-3.0.8p0 mirroring/synchronization over low bandwidth links
Ok, assuming you want to back-up the following directories:
/etc
/home
/var/log
edit the configuration file accordingly:
vi /etc/rsnapshot.conf
Otherwise you can use this configuration file slightly edited to meet those requirements:
#################################################
# rsnapshot.conf - rsnapshot configuration file #
#################################################
# #
# PLEASE BE AWARE OF THE FOLLOWING RULES: #
# #
# This file requires tabs between elements #
# #
# Directories require a trailing slash: #
# right: /home/ #
# wrong: /home #
# #
#################################################
#######################
# CONFIG FILE VERSION #
#######################
config_version 1.2
###########################
# SNAPSHOT ROOT DIRECTORY #
###########################
# All snapshots will be stored under this root directory.
#
snapshot_root /.snapshots/
# If no_create_root is enabled, rsnapshot will not automatically create the
# snapshot_root directory. This is particularly useful if you are backing
# up to removable media, such as a FireWire or USB drive.
#
#no_create_root 1
#################################
# EXTERNAL PROGRAM DEPENDENCIES #
#################################
# LINUX USERS: Be sure to uncomment "cmd_cp". This gives you extra features.
# EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility.
#
# See the README file or the man page for more details.
#
#cmd_cp /bin/cp
# uncomment this to use the rm program instead of the built-in perl routine.
#
cmd_rm /bin/rm
# rsync must be enabled for anything to work. This is the only command that
# must be enabled.
#
cmd_rsync /usr/local/bin/rsync
# Uncomment this to enable remote ssh backups over rsync.
#
cmd_ssh /usr/bin/ssh
# Comment this out to disable syslog support.
#
cmd_logger /usr/bin/logger
# Uncomment this to specify the path to "du" for disk usage checks.
# If you have an older version of "du", you may also want to check the
# "du_args" parameter below.
#
cmd_du /usr/bin/du
# Uncomment this to specify the path to rsnapshot-diff.
#
cmd_rsnapshot_diff /usr/local/bin/rsnapshot-diff
# Specify the path to a script (and any optional arguments) to run right
# before rsnapshot syncs files
#
#cmd_preexec /path/to/preexec/script
# Specify the path to a script (and any optional arguments) to run right
# after rsnapshot syncs files
#
#cmd_postexec /path/to/postexec/script
#########################################
# BACKUP INTERVALS #
# Must be unique and in ascending order #
# i.e. hourly, daily, weekly, etc. #
#########################################
interval hourly 6
interval daily 7
interval weekly 4
#interval monthly 3
############################################
# GLOBAL OPTIONS #
# All are optional, with sensible defaults #
############################################
# Verbose level, 1 through 5.
# 1 Quiet Print fatal errors only
# 2 Default Print errors and warnings only
# 3 Verbose Show equivalent shell commands being executed
# 4 Extra Verbose Show extra verbose information
# 5 Debug mode Everything
#
verbose 2
# Same as "verbose" above, but controls the amount of data sent to the
# logfile, if one is being used. The default is 3.
#
loglevel 3
# If you enable this, data will be written to the file you specify. The
# amount of data written is controlled by the "loglevel" parameter.
#
logfile /var/log/rsnapshot
# If enabled, rsnapshot will write a lockfile to prevent two instances
# from running simultaneously (and messing up the snapshot_root).
# If you enable this, make sure the lockfile directory is not world
# writable. Otherwise anyone can prevent the program from running.
#
lockfile /var/run/rsnapshot.pid
# Default rsync args. All rsync commands have at least these options set.
#
#rsync_short_args -a
#rsync_long_args --delete --numeric-ids --relative --delete-excluded
# ssh has no args passed by default, but you can specify some here.
#
#ssh_args -p 22
# Default arguments for the "du" program (for disk space reporting).
#
#du_args -csh
# If this is enabled, rsync won't span filesystem partitions within a
# backup point. This essentially passes the -x option to rsync.
# The default is 0 (off).
#
#one_fs 0
# The include and exclude parameters, if enabled, simply get passed directly
# to rsync. If you have multiple include/exclude patterns, put each one on a
# separate line. Please look up the --include and --exclude options in the
# rsync man page for more details on how to specify file name patterns.
#
#include ???
#include ???
#exclude ???
#exclude ???
# The include_file and exclude_file parameters, if enabled, simply get
# passed directly to rsync. Please look up the --include-from and
# --exclude-from options in the rsync man page for more details.
#
#include_file /path/to/include/file
#exclude_file /path/to/exclude/file
# If your version of rsync supports --link-dest, consider enable this.
# This is the best way to support special files (FIFOs, etc) cross-platform.
# The default is 0 (off).
#
link_dest 1
# When sync_first is enabled, it changes the default behaviour of rsnapshot.
# Normally, when rsnapshot is called with its lowest interval
# (i.e.: "rsnapshot hourly"), it will sync files AND rotate the lowest
# intervals. With sync_first enabled, "rsnapshot sync" handles the file sync,
# and all interval calls simply rotate files. See the man page for more
# details. The default is 0 (off).
#
#sync_first 0
# If enabled, rsnapshot will move the oldest directory for each interval
# to [interval_name].delete, then it will remove the lockfile and delete
# that directory just before it exits. The default is 0 (off).
#
#use_lazy_deletes 0
# Number of rsync re-tries. If you experience any network problems or
# network card issues that tend to cause ssh to crap-out with
# "Corrupted MAC on input" errors, for example, set this to a non-zero
# value to have the rsync operation re-tried
#
#rsync_numtries 0
###############################
### BACKUP POINTS / SCRIPTS ###
###############################
# LOCALHOST
backup /home/ localhost/
backup /etc/ localhost/
backup /var/log/ localhost/
#backup /usr/local/ localhost/
#backup /var/log/rsnapshot localhost/
#backup /etc/passwd localhost/
#backup /home/foo/My Documents/ localhost/
#backup /foo/bar/ localhost/ one_fs=1, rsync_short_args=-urltvpog
#backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/
# EXAMPLE.COM
#backup_script /bin/date "+ backup of example.com started at %c" unused1
#backup [email protected]:/home/ example.com/ +rsync_long_args=--bwlimit=16,exclude=core
#backup [email protected]:/etc/ example.com/ exclude=mtab,exclude=core
#backup_script ssh [email protected] "mysqldump -A > /var/db/dump/mysql.sql" unused2
#backup [email protected]:/var/db/dump/ example.com/
#backup_script /bin/date "+ backup of example.com ended at %c" unused9
# CVS.SOURCEFORGE.NET
#backup_script /usr/local/bin/backup_rsnapshot_cvsroot.sh rsnapshot.cvs.sourceforge.net/
# RSYNC.SAMBA.ORG
#backup rsync://rsync.samba.org/rsyncftp/ rsync.samba.org/rsyncftp/
Schedule the tasks as you prefer:
crontab -e
Consider the following example inside root’s crontab:
5 */4 * * * /usr/bin/nice -n19 /usr/local/bin/rsnapshot hourly
30 3 * * * /usr/bin/nice -n19 /usr/local/bin/rsnapshot daily
0 3 * * 1 /usr/bin/nice -n19 /usr/local/bin/rsnapshot weekly
30 2 1 * * /usr/bin/nice -n19 /usr/local/bin/rsnapshot monthly
The snapshots are stored in /.snapshots and archived in directories:
hourly.0
hourly.1
hourly.2
hourly.3
hourly.4
hourly.5
daily.0
daily.1
daily.2
daily.3
daily.4
daily.5
daily.6
weekly.0
weekly.1
and so on.
You can customize further by adding some scripts to add before and/or after rsnapshot’s task. I mean, for example, make a mysql dump, execute rsnapshot and then transfer your back-up to a remote filesystem, just in case…
Let’s try to figure out how to do that.
First, dump your databases and compress the archive:
vi /root/domysqldump.sh
#!/bin/sh
mysqldump -uroot -pYOURPASS --all-databases --opt > /root/dump.sql
tar -cjf /root/dump.sql.tbz /root/dump.sql
Then, transfer your back-up elsewhere via FTP. So install a ftp client, ncftp for instance:
cd /usr/ports/net/ncftp
make install clean
Now create a transfer script:
vi /root/doftptransfer.sh
#!/bin/sh
ncftpput -u USERNAME -p PASSWORD -C FTPHOST LOCALPATH REMOTEPATH
Give the script permission to execute:
chmod +x /root/domysqldump.sh /root/doftptransfer.sh
So, tell rsnapshot which scripts to execute before and after its task.
Edit /etc/rsnapshot.conf and insert:
cmd_preexec /root/domysqldump.sh
cmd_postexec /root/doftptransfer.sh
You have now an automated back-up system that can transfer away the snapshots to achieve maximum security against data loss.
You should be aware that this is just a quick guide. You are encouraged to read all the relevant documentation and the manuals as well:
man 1 rsnapshot