Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
en:linux:backup:full-rsync [2012/06/14 01:54] alex created |
en:linux:backup:full-rsync [2020/04/29 08:04] (current) alex [backup-system] |
||
---|---|---|---|
Line 7: | Line 7: | ||
* ''target'' : system to back up, must be set to output of ''uname -n''. Used as a sanity check. | * ''target'' : system to back up, must be set to output of ''uname -n''. Used as a sanity check. | ||
* ''source_dir'' : source directory. Set to ''/'' for full system backup. | * ''source_dir'' : source directory. Set to ''/'' for full system backup. | ||
- | * ''target_dir'' : target directory. Set to the mountpoint of an external hard drive. Note: make sure that ''target_dir'' or a parent is included in ''exclude_dir'' otherwise rsync will recurse and your hard drive will get filled up completely. | + | * ''target_dir'' : target directory. Set to the mountpoint of an external hard drive or a remote server. Note: make sure that ''target_dir'' or a parent is included in ''exclude_dir'' otherwise rsync will recurse and your hard drive will get filled up completely. |
* ''exclude_dir'' : excluded directories. Set these to temporary directories and other things you don't want backed up. | * ''exclude_dir'' : excluded directories. Set these to temporary directories and other things you don't want backed up. | ||
* ''include_dir'' : included directories. Subfolders of excluded directories to include. | * ''include_dir'' : included directories. Subfolders of excluded directories to include. | ||
+ | |||
+ | If you want to use this script with a remote host where the target user is not root, change flags to | ||
+ | |||
+ | <code> | ||
+ | flags=(-avPse ssh --delete --ignore-errors --rsync-path="rsync --fake-super") | ||
+ | </code> | ||
+ | |||
+ | and use a remote path of the form ''user@host:path'' for ''target_dir'' | ||
====== backup-system ====== | ====== backup-system ====== | ||
- | <code sh> | + | <code bash> |
#!/bin/bash | #!/bin/bash | ||
set -f | set -f | ||
- | hostname=$(uname -n) | + | hostname=$(hostname -s) |
target="my-hostname" | target="my-hostname" | ||
source_dir="/" | source_dir="/" | ||
target_dir="/media/external-hard-drive/$target/" | target_dir="/media/external-hard-drive/$target/" | ||
- | exclude_dir="*/.gvfs /media /run/media /sys /dev /proc /mnt /tmp pagefile.sys hiberfil.sys /home/*/.cache .mozilla/firefox/*/Cache .Trash-1000" | + | exclude_dir=(*/.gvfs /media /run/media /sys /dev /proc /mnt /tmp pagefile.sys hiberfil.sys /home/*/.cache .mozilla/firefox/*/Cache .Trash-1000) |
- | include_dir="/mnt/linux-data/opt /mnt/data" | + | include_dir=(/mnt/linux-data/opt /mnt/data) |
- | flags="-avP --delete" | + | flags=(-avPAX --delete --ignore-errors) |
if [ -n "$target" ] ; then | if [ -n "$target" ] ; then | ||
Line 32: | Line 40: | ||
fi | fi | ||
- | include="" | + | include=() |
# process include directories | # process include directories | ||
- | for d in $include_dir | + | for d in "${include_dir[@]}" |
do | do | ||
found=0 | found=0 | ||
dir="" | dir="" | ||
- | exc_dir="" | + | shortest_parent="/" |
- | shortest_parent="" | + | |
- | + | echo include_dir $d | |
# Need to deal with rsync idiosyncracies | # Need to deal with rsync idiosyncracies | ||
# by including excluded directories | # by including excluded directories | ||
Line 47: | Line 56: | ||
# Removes matches to the include directory | # Removes matches to the include directory | ||
# and finds the shortest parent path | # and finds the shortest parent path | ||
- | for d2 in $exclude_dir | + | for d2 in "${exclude_dir[@]}" |
do | do | ||
+ | echo exclude_dir $d2 | ||
+ | | ||
if [[ $d = $d2* ]]; then | if [[ $d = $d2* ]]; then | ||
found=1 | found=1 | ||
- | | + | |
- | if [[ -z "$shortest_parent" ]]; then | + | if [[ "$shortest_parent" == "/" ]]; then |
shortest_parent=$d2 | shortest_parent=$d2 | ||
else | else | ||
Line 59: | Line 70: | ||
fi | fi | ||
fi | fi | ||
- | | ||
- | else | ||
- | exc_dir="$exc_dir $d2" | ||
fi | fi | ||
+ | echo shortest_parent $shortest_parent | ||
done | done | ||
- | | + | |
if [[ $found ]]; then | if [[ $found ]]; then | ||
- | exclude_dir=$exc_dir | + | path=$(dirname "$d") |
- | path=`dirname "$d"` | + | |
while [[ "$path" != "/" ]]; do | while [[ "$path" != "/" ]]; do | ||
- | exclude_dir="$exclude_dir $path/*" | + | exclude_dir+=("$path/*") |
- | #include_dir="$include_dir $path" | + | include+=("--include=$path") |
- | include="$include --include $path" | + | if [[ "$path" == "$shortest_parent" ]]; then |
- | path=`dirname "$path"` | + | break |
+ | fi | ||
+ | path=$(dirname "$path") | ||
done | done | ||
fi | fi | ||
- | | + | |
- | include="$include --include $d" | + | include+=("--include=$d") |
done | done | ||
- | exclude="" | + | exclude=() |
- | for d in $exclude_dir | + | for d in "${exclude_dir[@]}" |
do | do | ||
- | exclude="$exclude --exclude $d" | + | exclude+=("--exclude=$d") |
done | done | ||
- | sudo -E rsync $flags $include $exclude "$source_dir" "$target_dir" | + | sudo -E rsync "${flags[@]}" "${include[@]}" "${exclude[@]}" "$source_dir" "$target_dir" |
</code> | </code> |