Thursday, February 10, 2011

BACKUP USING RSYNC & CRON



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!


The original quoted link:
http://www.linuxbasement.com/content/backups-using-rsync-bash-cron

Follow this link to create loginless ssh:
http://blogs.sun.com/jkini/entry/how_to_scp_scp_and

About Me

My photo
Jaison Paul Mulerikkal is the Vice Principal of Rajagiri School of Engineering and Technology (RSET), Kochi. He was the Principal of Jyothi Engineering College (JEC), Cheruthuruthy, Trissur, India. He is a member of CMI Sacred Heart Province, Kochi. He is a civil engineer by profession, but did his Masters in Information Systems from RMIT University, Melbourne, Australia and subsequently received his PhD in High Performance Scientific Computing from the Australian National University. He had worked as a computational scientist at the University of Auckland, New Zealand.