Introduction
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 rsnapshot
portinstall rsnapshot
(pacman -S rsnapshot
on Arch)
Step 2 — Configure rsnapshot
I use the following configuration to tell rsnapshot
to keep seven days of daily backups along with one montly backup in /usr/.rsnapshot
.
config_version 1.2 snapshot_root /usr/.snapshots/ cmd_rm /bin/rm cmd_rsync /usr/local/bin/rsync cmd_logger /usr/bin/logger cmd_postexec /usr/local/bin/backup-strongspace.sh interval daily 7 interval monthly 1 verbose 2 loglevel 3 logfile /var/log/rsnapshot lockfile /var/run/rsnapshot.pid rsync_long_args --delete --numeric-ids --relative --delete-excluded --filter="dir-merge,n- .backup-exclude" link_dest 1 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/
The 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:
#!/bin/sh /usr/local/bin/rsync -az --delete --delete-excluded /usr/.snapshots/daily.0 estan@estan.strongspace.com:/strongspace/estan/dose
This will sync the latest backup to my Strongspace account (40 GB Starter account, $4.99/month).
The --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 .backup-exclude
files.
Next comes the backup
directives, these simply specify the directories that should be backed up.
Using the 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:
#!/bin/sh /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 rsnapshot
.
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 cron
job
I created two scripts that are run from cron as part of FreeBSD’s regular periodic maintenance scripts:
/etc/periodic/daily/001.backup
:
#!/bin/sh /usr/local/bin/rsnapshot daily > /tmp/rsnapshot.out 2>&1 || cat /tmp/rsnapshot.out | mail -s "daily backups failed on `hostname`" my@email.com
and
/etc/periodic/montly/001.backup:
#!/bin/sh /usr/local/bin/rsnapshot monthly > /tmp/rsnapshot.out 2>&1 || cat /tmp/rsnapshot.out | mail -s "monthly backups failed on `hostname`" my@email.com
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.
Result
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.
Cheers,
Elvis
I use rsnapshot on an ArchLinux server I run at work, with the whole pool tar+gzipped and copied to another server that is properly backed up to tape & offsite storage. It does the job very well for me too.
At home, I use BackupPC on an ArchLinux server. It backs up my ArchLinux laptop, my wife’s WinXP laptop, and itself. BackupPC works particularly brilliantly if you won’t necessarily have a set time that is good for a backup; it gets the job done when you happen to be there. It’s a little tricky to get set up, though.
I use rsnapshot on an iscsi lvm partition of an intranet raid backup server. Works great. I would like to have a small dolphin plugin that translates the backup path to a file to a history-tab of that file in the “property” dialog.
@paul: Ah. I’ll take a look at BackupPC for my girlfriend. She recently had a HDD crash on her windows laptop, and is now using my mine until we can afford a new drive for hers (we’re poor students :)
@thorsten: That would definitely be nice (Dolphin plugin). Though hopefully the times I’ll have to go digging in backups will be few and far between.
If I had a Mac, I’d use Time Machine!! :-)
I used to use bacula, but wanted something more lightweight. I don’t like rsync for incremental backups, as corruption in an earlier version of a file means you can’t restore any later version.
My current program is client only and backs up incrementally to any mounted disk. It stores meta-info separately from file data, and can split large files, so you can safely back up a Unix files onto FAT32, CDFS/ISO9660, Samba share or anything else that doesn’t support Unix features (the same is not true of rsync). The current version is CLI only – no GUI yet, but it does checksumming and compression.
As far as strategy goes – a full backup can take quite a long time, and is often unnecessary given the amount of stuff that doesn’t change. I do like to ‘rebase’ with a differential backup regularly. You can then throw out older incremental runs to save space.
Steve
I use rsync to create snapshots, and darchive to slice, dice, and encrypt a weekly snapshot into slices I can write to DVD-Rs. I wrote my own scripts to manage disk space… allowing the disks to get a certain level full before they automatically delete the oldest snapshots.