I have four Seagate 4TB USB HDDs that I use. I alternate every day, one and the the other, of a pair. I do an incremental backup every day using a pretty ordinary script that calls a utility called rsync. It goes through my entire computer drive and checks for new files or files that have changed, and copies only those files. The script is only partly my work, the main part is common usage for this utility. Below is the script.
########################################################################
#!/bin/bash
# This script, incbak.sh is a script to perform incremental backups using rsync
# ALL LINES BEGINNING WITH THE HASH MARK ARE COMMENTS AND ARE NOT EXECUTED
set -o errexit
set -o nounset
set -o pipefail
readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/media/grrrr/BackupA/MainLaptop"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"
readonly LOGFILENAME="${HOME}/rsynclogs/rsync_backuplogfile_$(date '+%Y-%m-%d_%H:%M:%S')"
mkdir -p "${HOME}/rsynclogs/"
mkdir -p "${BACKUP_DIR}"
rsync -av --delete "${SOURCE_DIR}/" --link-dest "${LATEST_LINK}" --exclude '.cache' --exclude 'Videos' --exclude 'rsynclogs' "${BACKUP_PATH}" | tee "${LOGFILENAME}"
rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"
# to automate this using cron
# select editor to use with command 'select-editor'
# crontab -e to open crontab edit. Then paste the following--
# SHELL=/bin/bash
# MAILTO=[redacted for privacy]
# PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# 01 04 * * * /home/grrrr/incbak.sh
# sudo rsync -av --dry-run --info=progress2 --exclude="lost+found" --exclude=".cache" /media/grrrr/BackupA/latest/ /home/
# Can back up whole system.
# Backup Your Entire Linux System Using Rsync
# First, insert your backup medium (USB thumb drive or External hard disk). Then find the drive letter using 'fdisk -l' command. In my case, my Pen drive id is /dev/sdb1.
#
# Mount your drive to any location of your choice. I am going to mount it under /mnt.
#
# $ sudo mount /dev/sdb1 /mnt
# To backup the entire system, all you have to do is open your Terminal and run the following command as root user:
#
# $ sudo rsync -aAXv / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt
# This command will backup the entire root (/) directory, excluding /dev, /proc, /sys, /tmp, /run, /mnt, /media, /lost+found directories, and save the data in /mnt folder.
#
# Let us break down the above command and see what each argument does.
#
# rsync - A fast, versatile, local and remote file-copying utility
# -aAXv - The files are transferred in "archive" mode, which ensures that symbolic links, devices, permissions, ownerships, modification times, ACLs, and extended attributes are preserved.
# / - Source directory
# --exclude - Excludes the given directories from backup.
# /mnt - It is the backup destination folder.
# Important note: Please be mindful that you must exclude the destination directory, if it exists in the local system. It will avoid the infinite loop.
#
# If you want to preserve hard links, just include -H flag in the above command. Please note that it consumes more memory.
#
# $ sudo rsync -aAXHv / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt
# Restore Backup
# To restore the backup, just reverse the source and destination paths in the above command.
################################################################################
Sorry for all the commented garbage. I like to keep the original lines for a while when I change something in a bash script or python program or indeed just about any code I write or copy, and change to suit me.
I am not sure if WinDOHs has rsync or not, but you could always run it from a Linux LiveUSB. Or use a similar Windows terminal utility, calling it with a *.bat file.
From reading the code it is obvious that I have set this to run automatically in the past, but currently I initiate it manually. The script is in my path variable so I just type:
bash incbak.sh
and it does its thing. Every month or so I make complete new backups from scratch, overwriting the previous two used backup drives. So I have extremely robust backup going on. The incremental backup only takes a few minutes so I COULD run it several times a day, I suppose, but a complete backup that is up to date less than 24 hours old seems good enough for me. If one gets corrupted then my next freshest backup is still less than 48 hours old, and I can also revert to the previous month's backups.
Don' need no steenking cloud, don' need no steenking gui app.
Linux also automatically backs up most user created files in the same directory as the parent file, and keeps them hidden by pre-pending the file name with a dot. In most distros, type CTRL + H to show the hidden files.