How to reliably backup an external drive to another external drive

backupexternal-disk

I have got an external hard drive (A) that contains my iTunes & Aperture libraries. It's not always plugged to my MacBook.

What's the best way to make a backup of it on another external hard drive (B) ?

Wanted features :

  • fully automated (that executes itself hourly, or something like that)
  • incremental (in order to be fast)
  • only activates when both disks (A & B) are plugged in
  • works with multiple backup disks (in order to have a backup at home and another at work)
  • discrete indication that a backup is in progress
  • ability to pause or stop backup (useful if I am in a hurry and have to disconnect external drives)

It would be nice if backup disks could be networked, but that's not mandatory.

I would have loved to use Time Machine in order to have an history, but it doesn't seem to work well with external hard drives that aren't always connected and I don't trust it for that use case (my internal SSD is backed up thanks to Time Machine, though).

Online backups aren't adequate because I have a very poor internet connection.

Best Answer

Another possible option: use rsync and a launchd job to execute it when the disk is mounted. I believe Time Machine uses a similar approach to running on disk mount. For the hourly execution, you can use cron. The discreet notification can be done in a number of ways (for instance sending a mail or the Growl extension which allows notifications to be sent from the command line). killall rsync should stop the backup safely if you need to pack up and go. Also rsync is also entirely capable of networked syncing.

It will take a bit of work to set up, but the advantages are:

  • it's versatile (see man rsync, they pretty much thought of everything)
  • it's discreet
  • it doesn't cost anything
  • rsync is quick

You may find this helpful for launchd jobs involving disk mounting.

Edit: I should add that the --partial option to rsync will mean that the backup is resumed after killall rsync.

Edit 2: You can use a Control Plane context instead of launchd if you prefer.