├── user ├── excluded.txt └── rsync.sh ├── README.md ├── system ├── excluded.txt └── rsync.sh ├── backup-all.sh └── compare-checksum.sh /user/excluded.txt: -------------------------------------------------------------------------------- 1 | /shared -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | A series of backup scripts I am using for my Arch Linux. 2 | -------------------------------------------------------------------------------- /system/excluded.txt: -------------------------------------------------------------------------------- 1 | /.snapshots 2 | /var/lib/docker/ 3 | /var/lib/containers/ 4 | /var/tmp/ 5 | /var/cache/ 6 | /.swap/ 7 | -------------------------------------------------------------------------------- /backup-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DIRNAME=$(dirname $0) 4 | 5 | TARGET="$(cd $(dirname $1); pwd)/$(basename $1)" 6 | set -- $TARGET "${@:2}" 7 | 8 | mkdir -p $TARGET 9 | 10 | sudo $DIRNAME/system/rsync.sh $@ 11 | $DIRNAME/user/rsync.sh $@ 12 | -------------------------------------------------------------------------------- /compare-checksum.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "$1" ]; then 4 | exit 1 5 | fi 6 | 7 | TARGET=$1 8 | 9 | summary() { 10 | printf '%s %s\n' $(stat -c '%y' "$1") $(md5sum "$1") 11 | } 12 | export -f summary 13 | 14 | if [[ $(find $TARGET -type f -exec bash -c 'summary "$0"' {} \; | LC_ALL=C sort | md5sum) != $(cat "$TARGET/../md5sum.txt") ]]; then 15 | echo "not OK" 16 | exit 1 17 | fi 18 | -------------------------------------------------------------------------------- /user/rsync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "$1" ]; then 4 | exit 1 5 | fi 6 | 7 | if [ -z "$TIMESTAMP" ]; then 8 | TIMESTAMP=$(date -Is) 9 | fi 10 | 11 | TARGET="$1/$USER/$TIMESTAMP/$USER" 12 | set -- $TARGET "${@:2}" 13 | 14 | mkdir -p $TARGET 15 | 16 | rsync -axX --info=progress2 \ 17 | --exclude-from="$(dirname $0)/excluded.txt" \ 18 | --exclude={"/.cache/"} \ 19 | /home/$USER/ $@ 20 | 21 | # summary() { 22 | # printf '%s %s\n' $(stat -c '%y' "$1") $(md5sum "$1") 23 | # } 24 | # export -f summary 25 | 26 | # find $TARGET -type f -exec bash -c 'summary "$0"' {} \; | LC_ALL=C sort | md5sum > "$TARGET/../md5sum.txt" 27 | -------------------------------------------------------------------------------- /system/rsync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $(whoami) != root ]]; then 4 | exit 1 5 | fi 6 | 7 | if [ -z "$1" ]; then 8 | exit 1 9 | fi 10 | 11 | if [ -z "$TIMESTAMP" ]; then 12 | TIMESTAMP=$(date -Is) 13 | fi 14 | 15 | TARGET="$1/system/$TIMESTAMP/system" 16 | set -- $TARGET "${@:2}" 17 | 18 | mkdir -p $TARGET 19 | 20 | # https://ostechnix.com/backup-entire-linux-system-using-rsync/ 21 | rsync -axX --info=progress2 \ 22 | --exclude-from="$(dirname $0)/excluded.txt" \ 23 | --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \ 24 | --exclude="/home" \ 25 | / $@ 26 | 27 | # summary() { 28 | # printf '%s %s\n' $(stat -c '%y' "$1") $(md5sum "$1") 29 | # } 30 | # export -f summary 31 | 32 | # find $TARGET -type f -exec bash -c 'summary "$0"' {} \; | LC_ALL=C sort | md5sum > "$TARGET/../md5sum.txt" 33 | --------------------------------------------------------------------------------