My desktop computer, which runs Gentoo Linux, has a 120 GB drive (used for my / and /boot and swap partitions) and a 480 GB drive (used for /home). I decided to add another drive for backups. Ended up with a 720 GB drive, which is bigger than the others combined with room to spare, and only cost me about $100.
(Backing up to another hard drive on the same box is easy, and fast, and protects from a single drive failing, but does not protect against the computer being stolen or the house burning down. So I still need to push really important stuff, like source code, offsite.)
I mount the new drive as /mnt/backup. I use rsync to backup everything, minus a few excluded directories, to /mnt/backup/{TIMESTAMP}. I tell rsync to use hard links when a file is the same as the file in the previous backup. That way I have a full backup tree per day, but the incremental hard disk space used is only equivalent to the size of the files that actually changed that day.
I control the backup with this Python script (sh or perl would work too, but I like Python), which lives at /usr/local/bin/backup.py:
#!/usr/bin/python
"""Backup most of a filesystem to a backup disk, using rsync."""
import subprocess
import time
import os
SOURCE = "/"
DESTINATION = "/mnt/backup"
EXCLUDES = [
"/proc",
"/sys",
"/lost+found",
"/mnt",
"/media",
"/tmp",
"/var/tmp",
"/var/run",
"/var/lock",
]
RSYNC = "/usr/bin/rsync"
def find_latest_destdir():
latest = 0
for fn in os.listdir(DESTINATION):
if fn.isdigit() and len(fn) == 14:
timestamp = int(fn)
latest = max(timestamp, latest)
if latest:
return str(latest)
return None
def main():
cmd = [RSYNC]
cmd.append("-ab")
for exclude in EXCLUDES:
cmd.append("--exclude=%s" % exclude)
latest = find_latest_destdir()
if latest:
cmd.append("--link-dest=%s" % (os.path.join(DESTINATION, latest)))
cmd.append(SOURCE)
timestamp = time.strftime("%Y%m%d%H%M%S")
cmd.append(os.path.join(DESTINATION, timestamp))
print cmd
returncode = subprocess.call(cmd)
if __name__ == "__main__":
main()
And here's the crontab line that runs it every night at 3 a.m, added with "sudo crontab -e":
0 3 * * * /usr/local/bin/backup.py
Automated nightly backups are now so easy (thanks to tools like rsync, and the cheapness of hard drives) that there's really no excuse not to do them.
Post a Comment
You must be logged in to post a comment.