Since I recently set up a simple backup scheme for my laptop, workstation and server that I’m quite happy with, I thought I should share. The thing about backups is that everyone talks about how one should have them, but who really has an adequate backup scheme?
My laptop and workstation runs Arch Linux. The server is an old FreeBSD 7.0 install. I know the FreeBSD version is ancient, but the installed ports are kept up to date, and the machine has been running fine for years. It hosts this blog, along with the blogs and websites of some friends, a DNS server and a private SILC server me and some friends use for chatting.
So in short, here’s what I did for backups on the server. For the laptop and workstation, the instructions are pretty much identical, except you can leave out the parts about MySQL backups.
Step 1 — Install
portinstall rsnapshot (
pacman -S rsnapshot on Arch)
Step 2 — Configure
I use the following configuration to tell
rsnapshot to keep seven days of daily backups along with one montly backup in
interval daily 7
interval monthly 1
rsync_long_args --delete --numeric-ids --relative --delete-excluded --filter="dir-merge,n- .backup-exclude"
backup /usr/home/ localhost/
backup /etc/ localhost/
backup /var/named/ localhost/
backup /var/www/ localhost/
backup /usr/local/etc/ localhost/
backup_script /usr/local/bin/backup-mysql.sh localhost/mysql/
interval directives tell
rsnapshot how many backups to keep. E.g. with the above configuration, if I execute
rsnapshot daily ten times, the last seven of the backups will be kept.
rsnapshot uses hard linking to save space, so the disk usage won’t be horrible.
By using the
cmd_postexec directive, I give the path to a script to execute after each backup run. In my
backup-strongspace.sh script I have:
/usr/local/bin/rsync -az --delete --delete-excluded /usr/.snapshots/daily.0 firstname.lastname@example.org:/strongspace/estan/dose
This will sync the latest backup to my Strongspace account (40 GB Starter account, $4.99/month).
--filter="dir-merge,n- .backup-exclude" is obscure
rsync syntax and means that I can put stuff to be excluded from backup in directory specific
Next comes the
backup directives, these simply specify the directories that should be backed up.
backup-script directive, I specify the path to script to be run in an empty temporary directory before that directory is backed up. The
backup-mysql.sh script I’ve specified contains the following:
/usr/local/bin/mysqldump -u root -pmypassword --all-databases | gzip > all-databases.sql.gz
This will simply make a gzipped dump of all MySQL databases on the machine, which will then be backed up by
An important note for Linux users is that you probably want to specify
cmd_cp /bin/cp, as
rsnapshot can take advantage of some features of GNU cp.
Step 3 — Configure
I created two scripts that are run from cron as part of FreeBSD’s regular periodic maintenance scripts:
/usr/local/bin/rsnapshot daily > /tmp/rsnapshot.out 2>&1 || cat /tmp/rsnapshot.out | mail -s "daily backups failed on `hostname`" email@example.com
/usr/local/bin/rsnapshot monthly > /tmp/rsnapshot.out 2>&1 || cat /tmp/rsnapshot.out | mail -s "monthly backups failed on `hostname`" firstname.lastname@example.org
This means I’ll get an e-mail if the backups fail for some reason, and can then inspect the
rsnapshot log in
/var/log/rsnapshot. On the FreeBSD server I already had an e-mail server configured, but on my laptop and workstation I set up msmtp instead, which is a simple SMTP mailer, and the configuration of the cron jobs is a bit different from FreeBSD.
If I ever mess something up, I’ll have backups from the past seven days to restore from, or from the last monthly backup. And if the HDD crashes, I’ll always have a copy of the latest stuff on my Strongspace account. I’m very happy and it feels good to finally have backups.
Feel free to share your own backup strategy in the comments.