Glad you could stop by the Linux Basement site. Linux Basement is an informational Podcast about Linux, open source software and lots of other wonderful technology. If you want to find out more about open source technologies, subscribe and have a listen!

#linuxbasement is up at irc.freenode.net

MP3 Feed
Ogg Vorbis Feed
MP3 Feed (all episodes)
Ogg Feed (all episodes)

 

Backups using Rsync, Bash & Cron

Article Type: 
Tutorial

I wanted to backup my home directory using rsync to a separate drive, and to make it happen automatically.

I spent ages doing research into the various commands, and found everything I needed to know, but not all in the same place. While it was fun for me, others may just want to know how to do it immediately.  So here goes!

The rsync command

sudo rsync -av --progress --delete --log-file=/home/your-username/Desktop/$(date +%Y%m%d)_rsync.log --exclude "/home/your-username/.gvfs" /home /media/HomeBackup

the -av bit: 'a' means archive, or copy everything recursively preserving things like permissions, ownership and time stamps. The 'v' is verbose, so it tells you what its doing, either in the terminal, or in this case, in the log file.  --progress gives you more specific info about progress.

--delete checks for changes between source and destination, and deletes any files at the destination that you've deleted at the source. --log-file saves a copy of the rsync result to a date-stamped file on my desktop.

--exclude leaves out any files or directories you don't want copied. In my case, the .gvfs directory in Hardy Heron was a pain as even with sudo it errored and wouldn't copy properly, so I excluded it (Its not necessary to copy it anyway)  If you don't use Hardy yet, or any distro using the latest Gnome, skip this line, or upgrade!

/home is the directory I want copied. /home copies the directory and its contents, /home/ would just copy the contents

/media/HomeBackup is the separate drive.  Change this to whatever your backup location is. You can actually have this drive off-site and use ssh, but that will be a tutorial for another day!

The bash script

I was just pasting this command into Terminal each day, but wanted something automatic, so step one was a bash script.

Very easy, just open a new document in your favourite text editor, and type #!bin/bash followed by the command itself on a new line. So:

#!/bin/bash
sudo rsync -av --progress --delete --log-file=/home/your-username/Desktop/$(date +%Y%m%d)_rsync.log --exclude "/home/your-username/.gvfs" /home /media/HomeBackup

Save that as rsync-shell.sh on your Desktop and make it executable by typing
sudo chmod +x /home/your-username/Desktop/rsync-shell.sh   

or by right-clicking the file, select Properties, Permissions and then checking the Execute box

You can now double click that .sh file, choose 'Run in Terminal', it will ask you for your password and run, then leave a log file on your desktop.

or, you can make a cron job to do it for you!

The cron job

My biggest obstacle with this was the sudo bit. rsync won't be able to backup all files, or delete any, without root privileges. I didn't want to have to be there when it runs to type in my password, but after a bit of searching I found out how to make a root cron job.

Copy your .sh file to /root by typing
sudo cp /home/your-username/Desktop/rsync-shell.sh /root

Then type
sudo crontab -e

You'll see a line which reads:   # m h  dom mon dow   command

Under that type
0 22 * * * /root/rsync-shell.sh

What this all means is:

1. The number of minutes after the hour (0 to 59)
2. The hour in military time (24 hour) format (0 to 23)
3. The day of the month (1 to 31)
4. The month (1 to 12)
5. The day of the week(0 or 7 is Sun, or use name)
6. The command to run

So at 22:00 (10pm) every day root will run the shell script, without prompting you for sudo password (because its running as root already)

Now press Control-X, then type Y, then press enter.

You'll see   crontab: installing new crontab

And you're done!
 

"I hope this helps!" <--- I borrowed this line from Verbal, but I am sure he's made it Creative Commons!

Wow this is awesome Daniel,

Wow this is awesome Daniel, thanks! I actually had someone ask me this very question last week! Now if I can only remember who the heck it was. Good documentation!
Chad