I use a small headless Debian system as file server for all family photos, videos, documents, etc. Its hostname is “bubba”. I have recently set it up to run backups to an external harddrive, using cron and rsync.
The external disk is a 500G laptop SATA disk in an USB/eSATA enclosure. It requires no separate power supply. So far I have only got it to work over USB. Somehow the eSATA does not work for me on Debian 6 (aka “squeeze”), even though the file server has an eSATA port.
Prerequisites
sudo mkdir /mnt/backup
sudo apt-get install ntfs-3g
NTFS mount/unmount with sudo
I use NTFS as the filesystem on the backup disk because we wanted it to be compatible with MS Windows. The Debian Linux on the file server uses ntfs-3g for mounting the disk read-write. Unfortunately that only works well with root rights, so I configured sudo to permit myself password-less mounting and unmounting of the device.
/etc/sudoers entry
oliver ALL = NOPASSWD: /bin/mount /mnt/backup, \
/bin/umount /mnt/backup
Nightly rsync
The nightly backup process itself is a simple non-destructive local rsync command, wrapped by mount and unmount commands, to make sure that we can unplug the external disk anytime we want (just not around midnight).
My crontab:
oliver@bubba:~$ crontab -l
0 0 * * * /home/oliver/shared/scripts/backup.sh
The backup.sh script
#! /bin/sh
if mountpoint /mnt/backup; then
sudo umount /mnt/backup
fi
sudo mount /mnt/backup
if [ $? -eq 0 ]; then
rsync -avvih --progress \
--exclude /downloads \
--exclude /movies \
/home/storage/ /home/oliver/backup \
> /tmp/cron_output.log 2>&1
fi
sudo umount /mnt/backup
Symlinks and fstab
Symlink in my home for convenience:
oliver@bubba:~$ ls -l /home/oliver/backup
lrwxrwxrwx 1 oliver users 11 Aug 7 21:38 /home/oliver/backup -> /mnt/backup/
Entry in /etc/fstab:
oliver@bubba:~$ grep "/mnt/backup" /etc/fstab
/usr/local/share/backup /mnt/backup ntfs-3g defaults 0 0
Device symlink /usr/local/share/backup:
oliver@bubba:~$ ls -l /usr/local/share/backup
lrwxrwxrwx 1 root staff 84 Jun 23 01:51 /usr/local/share/backup -> /dev/disk/by-id/usb-WDC_WD50_00BPVT-00HXZT3_FDC0FD500000000FD0FF61A6103926-0:0-part1
Try it manually
/home/oliver/shared/scripts/backup.sh &
less /tmp/cron_output.log
Room for improvement
The symlink to the device file is the ugliest part of the whole solution. Currently I have to plug the disk directly into a USB slot on the file server because if I connect it via a USB hub, it will appear under a different name in /dev/disk/by-id and my symlink won’t work. I would like to use a udev rule instead that automatically creates an identical symlink no matter how the the disk is plugged in.
I would also like to implement a 2-way backup so that files we put on the external disk, for example photos from a trip to relatives, will be mirrored to the file server. It should be just another rsync command going in the opposite reaction.
Maybe I would also like the backup process to start right away when the disk is plugged in, in addition to the nightly cron job. This would probably require another udev rule.