Zum Inhalt

Datensicherung mit rsync

Das folgende Skript verwende ich, um eine Datensicherung von meinem Linux Client auf ein openmediavault mit rsync durchzuführen.

In einem früheren Beitrag habe ich das Einbinden von einer FRITZ!Box NAS bereit ausführlich beschrieben.

👉 AVM NAS als Festplatte bei Raspberry Pi als Festplatte mounten

Für die Datensicherung von meinem Linux Client soll das freigegebene Laufwerk aber nicht global mit sudo eingebunden werden, sondern mit einem normalen Benutzer.

Auf dem Client wird das Paket benötigt

sudo apt install cifs-utils

Im nächsten Schritt sind die Zugangsdaten für die CIFS-Freigabe zu erstellen. Ihr müsst dabei unbedingt berücksichtigen, dass euer Benutzer einen lesenden zugriff auf die Datei benötigt! Die Datei mit dem Namen auth legen wir deshalb einfach mal im Home-Verzeichnis an.

cd
nano auth

Der Inhalt der Datei ist folgendermaßen aufgebaut.

username=benutzername
password=passwort

Im nächsten Schritt sind noch zwei neue Ordner anzulegen, in die

  • die CIFS-Freigabe gemountet werden kann
  • das BACKUPDIRECTORY in das die gelöschten Dateien geschrieben werden sollen (Optional)
cd
mkdir openmediavault
cd openmediavault

# Dieser Ordner ist im Skript ${TARGET}
mkdir sicherung

# Dieser Ordner ist im Skript ${BACKUPDIRECTORY1}
mkdir backupdirectory

Damit normale Benutzer auch Verzeichnisse einbinden können, sind diese in der /etc/fstab einzutragen.

sudo nano /etc/fstab

Die Zeile tragt ihr einfach am Ende der Datei ein.

//192.168.1.40/Sicherung /home/benutzer/openmediavault/sicherung cifs noauto,user,credentials=/home/benutzer/auth  0 0
  • //192.168.1.40/Sicherung = Der freigegebene CIFS-Ordner auf dem openmediavault
  • /home/benutzer/openmediavault/sicherung = das neu angelegte Verzeichnis auf dem Client (mount point)
  • /home/benutzer/auth = Pfad zur Datei mit den Anmeldedaten

Ganz wichtig sind die Optionen

  • noauto = Das Verzeichnis wird nicht beim Starten des Clients versucht zu mounten, sondern erst nach Eingabe des Befehls mount /home/benutzer/openmediavault/sicherung/
  • user = erlaubt normalen Benutzer das Verzeichnis einzubinden

Das Skript legt ihr irgendwo im Home-Verzeichnis eures Benutzers ab.

cd
sudo nano backup.sh

Und kopiert den Inhalt in diese Datei.

#!/usr/bin/env bash

# This script creates a full backup of the SOURCE directory which is located on the laptop
# The backup location is the openmediavault


###################################
# Define Variables
###################################

# Name of backup
BACKUP="backup-openmediavault"

# Backup storage
BACKUPSTORAGE="/home/benutzer/openmediavault/sicherung/"


###################################
# 1st Backup Folder Definition
###################################
#Source patch
SOURCE="/home/benutzer/Dokumente/"

#Target path on BACKUPSTORAGE
TARGET="/home/benutzer/openmediavault/sicherung/Sicherungsdateien/dokumente/"

#Exclude from RSYNC file
EXCLUDEFILE="/home/benutzer/backupsbackup-openmediavault-excludefile.txt"

#BACKUP Directory
# In dieses Verzeichnis werden alle Dateien kopiert die während des rsync-Laufs durch die Option --delete gelöscht werden.
# Diese Option erzeugt eine hohe Systemlast und eine sehr lange Laufzeit des Skripts
#BACKUPDIRECTORY=${}


###################################
# 2nd Backup Folder Definition
###################################

#Source patch
SOURCE1="/home/benutzer/Bilder/Jahr-2021/"

#Target path on BACKUPSTORAGE
TARGET1="/home/benutzer/openmediavault/sicherung/Bilder/"

#Exclude from RSYNC file
EXCLUDEFILE1="/home/benutzer/backupsbackup-openmediavault-excludefile1.txt"

#BACKUP Directory
# In dieses Verzeichnis werden alle Dateien kopiert die während des rsync-Laufs durch die Option --delete gelöscht werden.
# Diese Option erzeugt eine hohe Systemlast und eine sehr lange Laufzeit des Skripts
BACKUPDIRECTORY1="/home/benutzer/openmediavault/backupdirectory/"


#Globales LOGFILE
LOGFILE="/home/benutzer/backupsbackup-openmediavault-logfile.log"


###################################
#Starts rsync Process From Source to Target
###################################
# Copies the files from Source to Target

# -a fasst folgende Optionen zusammen:
#     -r kopiert Unterverzeichnisse
#     -l kopiert symbolische Links
#     -p behält Rechte der Quelldatei bei
#     -t behält Zeiten der Quelldatei bei,
#     -g behält Gruppenrechte der Quelldatei bei
#     -o behält Besitzrechte der Quelldatei bei (nur root)
#     -D behält Gerätedateien der Quelldatei bei (nur root)

# -v: zeigt während des Synchronisierens alle ausgeführten Schritte an

# -h: human readable

# -c: aktiviert einen Dateivergleich, basierend auf Prüfsumme und nicht auf Größe und Zeitstempel. Die eigentliche Prüfsummenbildung dauert DEUTLICH länger als der Vergleich Größe und Änderungs-Zeitstempel; andererseits werden überflüssige Kopiervorgänge (z.B. bei nur geänderter Änderungszeit) vermieden.

# -n: simuliert nur was passieren würde ("dry run")

# -b: sorgt dafür, dass durch die Option --delete gelöschte sowie alle veränderten Objekte gesichert werden (--backup-dir=)

# -P: aktiviert folgende Optionen:
#    --progress Fortschrittsanzeige beim Transfer anzeigen
#    --partial Fortsetzung des Transfers bei Abbruch

# --stats: zeigt einen ausführlicheren Bericht am Ende einer Übertragung an.

# --delete: vergleicht Quellverzeichnisse und Zielverzeichnisse und sorgt dafür, dass Dateien, die im Quellverzeichnis nicht (mehr) vorhanden sind, im Zielverzeichnis gelöscht werden. Dies kann dazu führen, dass man ungewollt Dateien löscht, die man aber noch in der Sicherung behalten möchte.

# --ignore-existing: Überspringt die vorhandenen Daten und schreibt nur die neuen

# siehe https://wiki.ubuntuusers.de/rsync/

# Dieser Abschnitt erklärt die Syntax von rsync
#sudo rsync -av --stats --delete --log-file=${LOGFILE} --exclude ${EXCLUDE} --exclude ${EXCLUDE1} --exclude ${EXCLUDE2} --exclude ${EXCLUDE3} --exclude ${EXCLUDE4} ${SOURCE} ${TARGET}

# Ohne Log Files
#sudo rsync -av --stats --exclude-from=${EXCLUDEFILE} --delete ${SOURCE} ${TARGET}


# This mount the BACKUPSTORAGE
mount ${BACKUPSTORAGE}



echo $(date +%Y-%m-%d_%H-%M-%S) " - Start rsync process"


echo $(date +%Y-%m-%d_%H-%M-%S) " - Start rsync process - 1st Backup Folder"

# 1st Backup Folder
rsync -avhPn --stats --delete --exclude ${EXCLUDE} --log-file=${LOGFILE} ${SOURCE} ${TARGET}

echo $(date +%Y-%m-%d_%H-%M-%S) " - Start rsync process - 2nd Backup Folder"

# 2nd Backup Folder
rsync -avhcPn --stats --delete --backup-dir=${BACKUPDIRECTORY1} --exclude ${EXCLUDE} --exclude ${EXCLUDE1} --log-file=${LOGFILE} ${SOURCE1} ${TARGET1}


echo $(date +%Y-%m-%d_%H-%M-%S) " - Finished rsync process"

echo $(date +%Y-%m-%d_%H-%M-%S) " - Checkout the backupdirectory "

exit 0

Danach ist die Datei ausführbar zu machen und das Backup kann gestartet werden.

sudo chmod o+x backup.sh

Und gestartet wird das Ganze zum Abschluss mit

./backup.sh

Beachtet, dass im Skript die Option n aktiviert ist und es nur ein Dry-Run ist. Es werden also noch keine Änderungen durchgeführt.

Gib mir gerne einen Kaffee ☕ aus ❗️

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Source

Photo by Art Wall - Kittenprint on Unsplash