A simple backup scheme using rsnapshot

From Gentoo Wiki
Jump to: navigation, search
External resources

This article describes a simple automated backup scheme using the tool rsnapshot, which is based on rsync. rsnapshot makes a specified number of incremental backups of specified file trees, using hard links to save space on the backup medium.

The following backup scheme will rotate the backups on a daily, weekly and monthly basis. That means, it will keep a daily snapshot for 7 days, a weekly snapshot for 4 weeks and a monthly snapshot for 12 month. Furthermore, it uses an extra partition for the backup which will be mounted only for the time of the backup process.

Setup

Installation

Install app-backup/rsnapshot:

root # emerge --ask rsnapshot

fstab

Assumed the backup partition is labeled backup, formatted with ext4 and it should be mounted on /mnt/backup during backup: Add an entry like the following in your fstab:

File/etc/fstab

LABEL=backup    /mnt/backup    ext4    noatime,noauto    0 0

The noauto option means that this backup filesystem will not be mounted by default. The backup filesystem would normally be on an external device to be safe in the case of a device failure.

Cron scripts

Create cron scripts for the different backup intervals:

File/etc/cron.daily/rsnapshot.daily

#!/bin/sh

echo "### RSNAPSHOT DAILY ###"
mount /mnt/backup && rsnapshot daily || echo "Backup failure"
umount /mnt/backup
echo
File/etc/cron.weekly/rsnapshot.weekly

#!/bin/sh

echo "### RSNAPSHOT WEEKLY ###"
mount /mnt/backup && rsnapshot weekly || echo "Backup failure"
umount /mnt/backup
echo
File/etc/cron.monthly/rsnapshot.monthly

#!/bin/sh

echo "### RSNAPSHOT MONTHLY ###"
mount /mnt/backup && rsnapshot monthly || echo "Backup failure"
umount /mnt/backup
echo
Note
These scripts must be executable.
Note
rsnapshot knows nothing about timing. The daily, weekly and monthly parameters are identifiers for rsnapshot without any semnatic meaning. Therefore, it is important to call the daily snapshot only once a day, to call the weekly snapshot only once a week, etc.

rsnapshot configuration files

Set up the rsnapshot configuration file.

Note
rsnapshot configuration files are tab delimited. Be careful to always use tabs instead of spaces for the options.
Note
Filetree specifications are in rsync format. See the rsync man page for details.

Default rsnapshot config file:

File/etc/rsnapshot.conf

# Default config version
config_version	1.2

# So the hard disk is not polluted in case the backup filesystem is not available
no_create_root	1

# Standard settings
cmd_cp			/bin/cp
cmd_rm			/bin/rm
cmd_rsync		/usr/bin/rsync
link_dest		1

# For convenience, so that mount points can be taken as backup starting points
one_fs			1

# Store all backups in one directory per machine
# A useful alternative may be to create a separate directory for each interval
snapshot_root	/mnt/backup/

# increments, which are kept
retain	daily	7
retain	weekly	4
retain	monthly	12

# Backup folder(s)/files
backup	/path/to/something	localhost/
backup	/var			localhost/

# Exclude pattern (refer to --exclude-from from rsync man page)
exclude		/path/to/something/tmp

In these files, the second argument of backup specifies a container directory for the backups, usually referring to the machine (in this case, localhost). This can be changed to any name of your choosing. The final snapshots will be saved under /mnt/backup/{daily,weekly,monthly}.[0-9]*/localhost/path/to/something/

Note
rsnapshot will always take the last daily snapshot to create the first weekly snapshop and the last weekly snapshot to create the first monthly one. It will not take the 7th daily snapshot to create the first weekly snapshot. Therefore, it is possible to keep less or more than 7 daily snapshots, but is this case the first weekly snapshot is not one week old.

Restoration

To restore the localhost backups specified above, we would use

root # mount /mnt/backup
root #
rsync -a /mnt/backup/localhost/monthly.0/ /mnt/myroot/
root #
rsync -a /mnt/backup/localhost/weekly.0/ /mnt/myroot/
root #
rsync -a /mnt/backup/localhost/daily.0/ /mnt/myroot/

where /mnt/myroot is the mount point of the fresh root filesystem. In the paths above *.0 refers to the latest increment.

Possible improvements

It is also possible to make remote backups via rsync or SSH -- see the rsnapshot man page for details.

BTRFS snapshots

If you are crazy enough to use btrfs you can leverage its snapshot feature with rsnapshot. Walter Werther has a guide on this.