Install the rsync package using pacman:
# pacman -S rsync
For more examples, search the Community Contributions and General Programming forums.
rsync can be used as an advanced cp alternative, especially for copying larger files:
$ rsync -P source destination
The -P
option is the same as --partial --progress
, which keeps partially transferred files and shows a progress bar during transfer.
You may want to use the -r --recursive
option to recurse into directories, or the -R
option for using relative path names (recreating entire folder hierarchy on the destination folder).
The rsync protocol can easily be used for backups, only transferring files that have changed since the last backup. This section describes a very simple scheduled backup script using rsync, typically used for copying to removable media. For a more thorough example, see Full system backup with rsync.
For the sake of this example, the script is created in the /etc/cron.daily
directory, and will be run on a daily basis if a cron daemon is installed and properly configured. Configuring and using cron is outside the scope of this article.
First, create a script containing the appropriate command options:
/etc/cron.daily/backup
#!/bin/bash
rsync -a --delete /folder/to/backup /location/to/backup &> /dev/null
-a
indicates that files should be archived, meaning that most of their characteristics are preserved (but not ACLs, hard links or extended attributes such as capabilities)
--delete
means files deleted on the source are to be deleted on the backup aswell
Here, /folder/to/backup
should be changed to what needs to be backed-up (/home
, for example) and /location/to/backup
is where the backup should be saved (/media/disk
, for instance).
Finally, the script must be executable:
# chmod +x /etc/cron.daily/rsync.backup
If backing-up to a remote host using SSH, use this script instead:
/etc/cron.daily/backup
#!/bin/bash
rsync -a --delete -e ssh /folder/to/backup remoteuser@remotehost:/location/to/backup &> /dev/null
-e ssh
tells rsync to use SSH
remoteuser
is the user on the host remotehost
-a
groups all these options -rlptgoD
(recursive, links, perms, times, group, owner, devices)
This script starts a backup when you plugin your wire.
First, create a script containing the appropriate command options:
/etc/NetworkManager/dispatcher.d/backup
#!/bin/bash
if [ x"$2" = "xup" ] ; then
rsync --force --ignore-errors -a --delete --bwlimit=2000 --files-from=files.rsync /folder/to/backup /location/to/backup
fi
-a
group all this options -rlptgoD
recursive, links, perms, times, group, owner, devices
--files-from
read the relative path of /folder/to/backup from this file
--bwlimit
limit I/O bandwidth; KBytes per second
This is a useful option of rsync, creating a full backup and a differential backup for each day of a week.
First, create a script containing the appropriate command options:
/etc/cron.daily/backup
#!/bin/bash
DAY=$(date +%A)
if [ -e /location/to/backup/incr/$DAY ] ; then
rm -fr /location/to/backup/incr/$DAY
fi
rsync -a --delete --inplace --backup --backup-dir=/location/to/backup/incr/$DAY /folder/to/backup/ /location/to/backup/full/ &> /dev/null
--inplace
implies --partial
update destination files in-place
The same idea can be used to maintain a tree of snapshots of your files. In other words, a directory with date-ordered copies of the files. The copies are made using hardlinks, which means that only files that did change will occupy space. Generally speaking, this is the idea behind Apple’s TimeMachine.
This script implements a simple version of it:
/usr/local/bin/rsnapshot.sh
#!/bin/bash
## my own rsync-based snapshot-style backup procedure
## (cc) marcio rps AT gmail.com
# config vars
SRC="/home/username/files/" #dont forget trailing slash!
SNAP="/snapshots/username"
OPTS="-rltgoi --delay-updates --delete --chmod=a-w"
MINCHANGES=20
# run this process with real low priority
ionice -c 3 -p $$
renice +12 -p $$
# sync
rsync $OPTS $SRC $SNAP/latest >> $SNAP/rsync.log
# check if enough has changed and if so
# make a hardlinked copy named as the date
COUNT=$( wc -l $SNAP/rsync.log|cut -d" " -f1 )
if [ $COUNT -gt $MINCHANGES ] ; then
DATETAG=$(date +%Y-%m-%d)
if [ ! -e $SNAP/$DATETAG ] ; then
cp -al $SNAP/latest $SNAP/$DATETAG
mv $SNAP/rsync.log $SNAP/$DATETAG
fi
fi
To make things really, really simple this script can be run out of /etc/rc.local
.