Backup-Skript

Dies ist mein Backup-Skript. Es gibt viele andere, aber dieses ist meins.

Ziel ist es, von einem Verzeichnis eine (in diesem Fall 15-tägige) Historie anzulegen. Damit dabei nicht Unmengen an Plattenplatz verbraucht werden, werden für Dateien, die sich nicht geändert haben, Hardlinks verwendet.

#!/bin/bash
# This script should be started after midnight.
 
NR_OF_BACKUPS=15
SOURCE="/path/to/data-folder/"
TARGET="/path/to/backup-folder/"
EXCLUDE="lost+found"
 
###############################################################################
# Delete outdated backups
###############################################################################
# Create complete list of backups
BACKUPS=($(find ${TARGET} -mindepth 1 -maxdepth 1 -type d | sort -r))
 
# Create list of backups to delete
BACKUPS_TO_DELETE=${BACKUPS[@]:${NR_OF_BACKUPS}-1}
 
# Delete outdated backups
for BACKUP in ${BACKUPS_TO_DELETE[@]}; do
    echo "Deleting ${BACKUP}"
    rm -rf ${BACKUP}
done
 
###############################################################################
# Create latest backup
###############################################################################
YESTERDAY="$(date -d yesterday +%Y-%m-%d)"
 
echo "Creating backup for ${YESTERDAY}"
 
rsync -a --delete --exclude "${EXCLUDE}" "${SOURCE}" "${TARGET}${YESTERDAY}/" --link-dest="${TARGET}last/"
 
ln -nsf "${TARGET}${YESTERDAY}" "${TARGET}last"
 
exit 0

Die Hauptlast der Arbeit übernimmt dabei rsync mit folgenden Optionen:

Option Beschreibung
-a Archive-Modus; entspricht -rlptgoD (rekursiv in Verzeichnisse, kopiere Symlinks als Symlinks, erhalte Berechtigungen, Änderungszeiten, Gruppe, Besitzer, Gerätedateien und Spezialdateien)
–delete Lösche fremde Dateien in den Zielverzeichnissen
–exclude PATTERN Schließe Dateien, die PATTERN entsprechen, aus
–link-dest=DIR Setze Hardlink zu Dateien in DIR, wenn diese unverändert sind

Das Skript läuft einmal täglich, konfiguriert über crontab -e (bei mir um 4:00 Uhr nachts):

# m h  dom mon dow   command
0 4 * * * /path/to/backup_nas.sh
  • Zuletzt geändert: 2022-09-28 16:45