Fork me on GitHub

Project Notes

#338 rsync

All about rsync - a fast, versatile, local and remote file-copying tool

Notes

The rsync utility is available on Linux and macOS (and other platforms).

It is primarily used to backup/mirror files to another location. The destination may be local, or remote (over SSH).

The main benefits of rsync over other methods:

  • it is smart enough to only copy modifications (making it far superior to cp for example)
  • it is incremental, and can resume partial replications (making it superior to say sftp)

The command has many options to modify its behaviour. Let’s look at 3 main scenarios:

  • simple backup
  • pure mirror
  • remote sync

Simple Backup

By simple backup, I mean we want to copy all files to the destination, but don’t care if the destination has additional files (they should be preserved).

The -a, --archive “super” option configures a decent backup mode, equating to:

  • -r, --recursive : recurse into directories
  • -l, --links : copy symlinks as symlinks
  • -p, --perms : preserve permissions
  • -t, --times : preserve modification times
  • -g, --group : preserve group
  • -o, --owner : preserve owner (super-user only)
  • -D : same as --devices (transfer character and block device files) and --specials (transfer special files such as named sockets and fifos)

Additional options that may be added:

  • -u, --update : skip files that are newer on the receiver
  • -v, --verbose : increase verbosity

So for a simple backup command I will often just use the -av options.

user@rsync1> rsync -av backup-source/ backup-dest/

The backup-example.sh script uses rsync to demonstrate how it:

  • performs the initial sync
  • incrementally updates with changes
    • handles new files added to the source
    • handles modified files in to the source
    • handles files removed from the destination
    • ignores additional files in the destination
    • updates modified files in the destination

Running the example:

$ ./backup-example.sh
Making a fresh copy of ./tmp/original
## performs the initial sync: ./tmp/original/ to ./tmp/copy/
Transfer starting: 9 files
./
1.txt
2.txt
sub1/
sub1/1.txt
sub1/2.txt
sub2/
sub2/1.txt
sub2/2.txt

sent 667 bytes  received 170 bytes  760909 bytes/sec
total size is 32  speedup is 0.04
## handles new files added to the source: add 3.txt to source
Transfer starting: 10 files
3.txt

sent 419 bytes  received 42 bytes  419090 bytes/sec
total size is 34  speedup is 0.07
## handles modified files in to the source: update 2.txt in source
Transfer starting: 10 files
2.txt

sent 429 bytes  received 42 bytes  428181 bytes/sec
total size is 44  speedup is 0.09
## handles files removed from the destination: removing 1.txt from dest
Transfer starting: 10 files
1.txt

sent 419 bytes  received 42 bytes  4610000 bytes/sec
total size is 44  speedup is 0.10
## ignores additional files in the destination: add bogus.txt to dest
Transfer starting: 10 files
./

sent 377 bytes  received 26 bytes  4030000 bytes/sec
total size is 44  speedup is 0.11
## updates modified files in the destination: update 2.txt in dest
Transfer starting: 10 files
2.txt

sent 429 bytes  received 42 bytes  428181 bytes/sec
total size is 44  speedup is 0.09
## shows the differences between source and destination
Only in ./tmp/copy: bogus.txt
Common subdirectories: ./tmp/original/sub1 and ./tmp/copy/sub1
Common subdirectories: ./tmp/original/sub2 and ./tmp/copy/sub2

Pure Mirror

For a mirror, we want the destination to match the source exactly. This can be achieved by adding the --delete option:

  • --delete : delete extraneous files from dest dirs
user@rsync1> rsync -av --delete backup-source/ backup-dest/

The mirror-example.sh script uses rsync to demonstrate how it:

  • performs the initial sync
  • incrementally updates with changes
    • handles new files added to the source
    • handles modified files in to the source
    • handles files removed from the destination
    • removes additional files in the destination
    • updates modified files in the destination

Running the example:

$ ./mirror-example.sh
Making a fresh copy of ./tmp/original
## performs the initial sync: ./tmp/original/ to ./tmp/copy/
Transfer starting: 9 files
./
1.txt
2.txt
sub1/
sub1/1.txt
sub1/2.txt
sub2/
sub2/1.txt
sub2/2.txt

sent 671 bytes  received 170 bytes  764545 bytes/sec
total size is 32  speedup is 0.04
## handles new files added to the source: add 3.txt to source
Transfer starting: 10 files
3.txt

sent 423 bytes  received 42 bytes  422727 bytes/sec
total size is 34  speedup is 0.07
## handles modified files in to the source: update 2.txt in source
Transfer starting: 10 files
2.txt

sent 433 bytes  received 42 bytes  431818 bytes/sec
total size is 44  speedup is 0.09
## handles files removed from the destination: removing 1.txt from dest
Transfer starting: 10 files
1.txt

sent 423 bytes  received 42 bytes  422727 bytes/sec
total size is 44  speedup is 0.09
## removes additional files in the destination: add bogus.txt to dest
Transfer starting: 10 files
./bogus.txt: deleting

sent 375 bytes  received 20 bytes  359090 bytes/sec
total size is 44  speedup is 0.11
## updates modified files in the destination: update 2.txt in dest
Transfer starting: 10 files
2.txt

sent 433 bytes  received 42 bytes  431818 bytes/sec
total size is 44  speedup is 0.09
## shows the differences between source and destination
Common subdirectories: ./tmp/original/sub1 and ./tmp/copy/sub1
Common subdirectories: ./tmp/original/sub2 and ./tmp/copy/sub2

Remote Sync

To sync remotely, specify the destination in an ssh-compatible form e.g.

user@rsync1> rsync -av rsync-test/ user@rsync2:rsync-test/

Setup ssh no-password by adding public key to .ssh/authorized_hosts on the remote server.

Note the -e, --rsh=COMMAND can be used to choose an alternative remote shell program, but ssh is the default.

Credits and References

About LCK#338 rsynctools

This page is a web-friendly rendering of my project notes shared in the LittleCodingKata GitHub repository.

Project Source on GitHub Return to the LittleCodingKata Catalog
About LittleCodingKata

LittleCodingKata is my collection of programming exercises, research and code toys broadly spanning things that relate to programming and software development (languages, frameworks and tools).

These range from the trivial to the complex and serious. Many are inspired by existing work and I'll note credits and references where applicable. The focus is quite scattered, as I variously work on things new and important in the moment, or go back to revisit things from the past.

This is primarily a personal collection for my own edification and learning, but anyone who stumbles by is welcome to borrow, steal or reference the work here. And if you spot errors or issues I'd really appreciate some feedback - create an issue, send me an email or even send a pull-request.

Follow the Blog follow projects and notes as they are published in your favourite feed reader