Dateibasierte RSync-Datensicherung auf externen Datenträger oder RSync kompatiblen Server

Aus

Einleitung

Mit dem Start der DSM 6 Beta und Hyper Backup wurde die dateibasierte Datensicherung bis auf weiteres auf Eis gelegt. Stattdessen werden die gesicherten Daten in einer Datenbank abgelegt, auf die man erstmal keinen direkten Zugriff hat. Zum wiederherstellen dieser Daten ist nach aktuellen Stand in jedem Falle ein System von Synology erforderlich bzw. ein in Zukunft zur Verfügung gestelltes Tool von Synology für Windows sowie evtl. weiterer Betriebssysteme. Da in meinen Augen eine dateibasierte Datensicherung jedoch eine elementare Funktion darstellt, suchte ich nach einer Möglichkeit auch weiterhin nach diesem Prinzip meine persönlichen Daten zu sichern. Dabei lag mein Fokus auf eine einfache und handliche Funktionsweise sowie eine unkomplizierte Einrichtung über den DSM. Man muß sich also nicht auf die Konsole der DS begeben.


Anmerkung

Bevor ihr anfangt, nehmt bitte noch den Artikel "Wichtige Informationen zum Modden der Synology Stations" zur Kenntnis.

Auch wenn dieses Script intensiv auf einwandfreie Funktion hin getestet wurde, so kann eine Fehlfunktion und demzufolge ein möglicher Datenverlust nicht ausgeschlossen werden. Daher verwendet ihr dieses Script auf eigene Gefahr. Aus diesem Grunde solltet ihr das System erstmal mit unwichtigen Testdaten auf Herz und Nieren prüfen, bevor ihr das ganze "produktiv" einsetzt. Auch ist es immer Ratsam, bereits ein Backup seiner Daten in Reichweite zu haben.


Voraussetzungen

  • Umgang mit dem DSM Aufgabenplaner
  • Umgang mit einem Editor seiner Wahl (z.B. Notepad++ oder dem DSM Text-Editor)
  • Grundkenntnisse im Umgang mit Shell-Scripten
  • Zum versenden einer E-Mail muss im DSM unter Hauptmenü/Systemsteuerung/Benachrichtigung eine E-Mail Adresse hinterlegt sein.
  • Ein externer USB- oder SATA-Datenträger


Erläuterungen zur Funktion und Arbeitsweise

Das hier vorgestellte System besteht aus zwei Scripten. Das erste Script mit dem Namen „search-rsync.sh“ wird über den DSM-Aufgabenplaner angesprochen. Bei Bedarf kann hier auch die automatische bzw. zeitgesteuerte Script-Ausführung konfiguriert werden.

Das zweite Script, welches den Dateinamen "rsync.sh" tragen muss, wird auf dem externen USB- oder SATA-Datenträger in dessen Wurzelverzeichnis abgelegt, auf dem die Datensicherung erfolgen soll. Dementsprechend muss dieses Script noch auf die benötigten Begebenheiten angepasst werden indem man E-Mail-Adresse, Backupquellen und das Backupziel definiert.

Nachdem das Script "search-rsync.sh", manuell oder automatisiert über den DSM-Aufgabenplaner gestartet wurde wird versucht, das auf dem externen USB- oder SATA-Datenträger abgelegte Script „rsync.sh“ zu finden und es auszuführen, welches den eigentlichen Backupvorgang initiiert.

Im Folgenden wird Anhand einer Abfrage erkannt, an welchen USB- oder SATA Anschluss sich der externe Datenträger befindet um die Pfade im Script entsprechend anzupassen. Der so ermittelte Laufwerkspfad wird dem Backup-Zielordner vorangestellt. Das Backup selber synchronisiert sämtliche konfigurierte Quellen mit dem Backupziel. Dabei werden die Ordnerpfade relativ, nach dem jeweiligen Volume(1,2,3,4….) angelegt. Gelöschte Dateien in der Quelle werden im Ziel in den Ordner @Recycle verschoben um einen möglichen Datenverlust vorzubeugen. Systemorder wie z.B. /@eaDIR, /#recycle, #snapshot und /.DS_Store werden von der Synchronisation ausgeschlossen.

Des Weiteren wird ein Protokoll in den Ordner @Logfiles geschrieben welches man sich bei Bedarf auch per E-Mail zusenden lassen kann. Außerdem erhält die DSM-Administratorengruppe über das Benachrichtigungssystems des DSM eine Meldung über Erfolg oder Misserfolg des Vorganges inkl. Fehler-Code. Der Fehlercode entstammt hierbei den exit-codes von rsync und kann bei Bedarf ergooglet werden.


Script 1: search-rsync.sh

Vom Prinzip her ist es egal, an welchem Ort das Script abgelegt wird. Es macht jedoch Sinn das Script dort abzulegen, wo man es bei Bedarf von der DSM-Oberfläche aus bearbeiten kann. Ich habe hierfür z.B. eigens einen gemeinsamen Ordner Namens „ScriptStuff“ angelegt. Der Name des Scriptes spielt hier auch keine Rolle und kann frei vergeben werden. Wichtig ist nur, das das Script die Endung .sh trägt. Als Beispiel habe ich das Script „search-rsync.sh“ genannt.

Angemeldet als Benutzer "admin", kann das Script z.B. mit dem Text-Editor aus dem DSM erstellt werden (evtl. muss das Paket noch über das Paketzentrum installiert werden). Nachdem im Text-Editor das Script eingefügt, die Datei „search-rsync.sh“ erstellt bzw. gespeichert wurde müssen noch die Berechtigungen angepasst werden um das Script "ausführbar" zu machen. Dazu muss man in der FileStation mit einem rechtsklick auf die Datei „search-rsync.sh“ gehen und im Kontextmenü den Menüpunkt "Eigenschaften" auswählen. Dort angekommen wechselt man zum Reiter "Genehmigung" und weiter auf die Schaltfläche "Erweiterte Optionen" um darauffolgend den Punkt "Übernommene Genehmigungen einschließen" auszuwählen. Zum Schluss bestätigt man das Ganze mit der Schaltfläche "OK" (Die Datei sollte jetzt die Berechtigung rwxrw-rw, bzw. 766 haben)

Nachdem die Privilegien richtig gesetzt wurden, kann das Script unter Hauptmenü/Systemsteuerung in den Aufgabenplaner aufgenommen werden, ohne die Aufgabe jedoch vorerst auszuführen. Dazu wählt man unter DSM 6 "Erstellen" --> "Geplante Aufgabe" --> "Benutzerdefiniertes Script". Im Reiter "Allgemein" kann man unter "Vorgang" einen individuellen Namen für die Aufgabe vergeben und als Benutzer sollte "root" ausgewählt werden. Die Checkbox "Aktiviert" wird nur benötigt, sollte das Script automatisiert, also Zeitgesteuert gestartet werden. Dazu wäre dann im nächsten Schritt unter dem Reiter der "Zeitplan" zu definieren. Im Reiter "Aufgabeneinstellungen" muss jetzt noch unter dem Punkt "Befehl ausführen" der Pfad zum "Benutzerdefinierten Script" angegeben werden, also z.B. /volume1/ScriptStuff/search-rsync.sh. Nach dem Bestätigen mit "OK" wird die Aufgabe dem Aufgabenplaner hinzugefügt und kann später, falls gewünscht, nach dem Markieren der Aufgabe, über die Schaltfläche "Ausführen" manuell ausgeführt werden.


search-rsync.sh

#!/bin/sh

# Durchsuche volumeUSB1
if [ -f /volumeUSB1/usbshare/rsync.sh ]; then
   sh /volumeUSB1/usbshare/rsync.sh
fi

# Durchsuche volumeUSB2
if [ -f /volumeUSB2/usbshare/rsync.sh ]; then
   sh /volumeUSB2/usbshare/rsync.sh
fi

# Durchsuche volumeUSB3
if [ -f /volumeUSB3/usbshare/rsync.sh ]; then
   sh /volumeUSB3/usbshare/rsync.sh
fi

# Durchsuche volumeSATA
if [ -f /volumeSATA/usbshare/rsync.sh ]; then
   sh /volumeSATA/usbshare/rsync.sh
fi


Script 2: rsync.sh

Das zweite Script, welches im Gegensatz zum ersten Script, den Dateinamen "rsync.sh" tragen muss, wird auf den entsprechenden externen USB- oder SATA-Datenträger in dessen Wurzelverzeichnis abgelegt, auf dem die Datensicherung abgelegt werden soll. Vor der ersten Ausführung des Scriptes müssen im Vorfeld noch die Backup-Quellen (SOURCES), der Backup-Zielordner (DESTINATION) sowie ggfls. eine E-Mailadresse (EMAIL) angegeben werden. Hierzu auch die weiteren Hinweise im Script beachten.

Im Gegensatz zum ersten Script (search-rsync.sh), müssen hier keine Berechtigungen gesetzt werden. Hier reicht es also, das Script über den Text-Editor des DSM zu erstellen und auf dem angeschlossenen, externen Datenträger abzulegen. Nachdem alle Parameter bestimmt wurden, kann man den Vorgang über den Aufgabenplaner ausfühen lassen.


rsync.sh (nur diesen Dateinamen verwenden)

#!/bin/sh

# E-Mail Adresse
# ------------------------------------------------------------------------ 
# Bei Angabe einer E-Mail-Adresse, die identisch mit der bereits im DSM  |
# unter Hauptmenue/Systemsteuerung/Benachrichtigung hinterlegten         |
# E-Mail-Adresse sein muß, wird einem das Sicherungsprotokoll zugestellt |
# Möchte man dies nicht, kann das Feld mit # auskommentiert werden. Es   |
# wird dann nur ein Sicherungsprotokoll unter @Logfiles im Ziel abgelegt.|
# ------------------------------------------------------------------------
EMAIL="you@mail.de"
 
 
# Backup - Quellen  
# ------------------------------------------------------------------------                                                
# Hier können beliebige sowie unterschiedliche Backupquellen von der DS  |
# eingetragen werden. Zu beachten ist, das immer der vollständige Pfad   |
# unter Angabe des entsprechenden Volume anzugeben ist. Weiterhin ist auf|
# die Schreibweise im Beispiel zu achten, pro Zeile je eine Backupquelle.|
# ------------------------------------------------------------------------
SOURCES="/volume1/Musik/Alben
         /volume2/Fotos
	 /volume3/Videos/Serien
	 /volume1/homes/admin"

		 
# Backup - Ziel		   
# ------------------------------------------------------------------------				  
# Als Backupziel bedarf es nur der Angabe des Ordners, worin das Backup  |
# abgelegt werden soll. Das Script erkennt automatisch an welchen USB-   |
# oder SATA-Port sich der externe Datenträger befindet (volumeUSB1,      |
# volumeUSB2, volumeUSB3 oder volumeSATA) und fügt die Ordnerstruktur    |
# dementsprechnend dem Backupziel hinzu.                                 |
# ------------------------------------------------------------------------
DESTINATION="/Backup_DS"
	
	
# ------------------------------------------------------------------------
# Ab hier bitte nichts mehr ändern                                       |
# ------------------------------------------------------------------------

# Umgebungsvariablen definieren
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin
DATEOPT="+%Y-%m-%d_%H%M"
TIMESTAMPOPT="+%d.%m.%Y_%H:%M:%S"

# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren
if find /volumeUSB1/usbshare/rsync.sh 
  then
    mkdir -p /volumeUSB1/usbshare$DESTINATION
    TARGET="/volumeUSB1/usbshare$DESTINATION"
fi

if find /volumeUSB2/usbshare/rsync.sh
  then
    mkdir -p /volumeUSB2/usbshare$DESTINATION
    TARGET="/volumeUSB2/usbshare$DESTINATION"
fi

if find /volumeUSB3/usbshare/rsync.sh
  then
    mkdir -p /volumeUSB3/usbshare$DESTINATION
    TARGET="/volumeUSB3/usbshare$DESTINATION"
fi

if find /volumeSATA/usbshare/rsync.sh
  then 
    mkdir -p /volumeSATA/satashare$DESTINATION
    TARGET="/volumeSATA/satashare$DESTINATION"
fi

# Ordner und Datei für das Protokoll anlegen und bei Bedarf die E-Mail-Kopfdaten generieren
mkdir -p $TARGET/@Logfiles
LOG="$TARGET/@Logfiles/`date $DATEOPT`_Sicherungsprotokoll.log"

if [ "$EMAIL" ]
  then
    echo  "To: $EMAIL" > $LOG
    echo  "From: $EMAIL" >> $LOG
    echo  "Subject: Sicherungsprotokoll vom `date $TIMESTAMPOPT` Uhr" >> $LOG
    echo  "" >> $LOG
  else	
    echo "Sicherungsprotokoll vom `date $TIMESTAMPOPT` Uhr" > $LOG
fi

# rsync - Befehl ausführen sowie protokollieren
for SHARE in $SOURCES
  do
    echo "" >> $LOG
    echo "--> Zusammenfassung: $SHARE nach $TARGET" >> $LOG
    rsync -ahR "$SHARE" --stats --log-file-format="%i %o %f" --exclude=/@eaDir/*** --exclude=/#recycle/*** --exclude=/#snapshot/*** --exclude=/.DS_Store/*** --delete --backup --backup-dir=@Recycle/`date $DATEOPT` "$TARGET" >> $LOG 2>&1
  done

# rsync - Ausführung auswerten und Ergebnis anhand der "exit codes" ausgeben
if [ $? -eq 0 ]
  then
    echo  "" >> $LOG
    echo "rsync-Datensicherung erfolgreich abgeschlossen $TARGET" >> $LOG
    DSMNOTIFY="rsync-Datensicherung erfolgreich abgeschlossen $TARGET"
elif [ $? -ne 0 ]
  then
    echo  "" >> $LOG
    echo "rsync-Datensicherung fehlgeschlagen - Fehler $? $TARGET" >> $LOG
    DSMNOTIFY="rsync-Datensicherung fehlgeschlagen - Fehler $? $TARGET"
fi

# Benachrichtigung an die DSM-Administratorengruppe senden
synodsmnotify @administrators "rsync-Script" "$DSMNOTIFY"
	
# Sicherungsprotokoll als E-Mail versenden (oder als Datei im Backupziel einsehen)
if [ "$EMAIL" ]
  then
    ssmtp $EMAIL < $LOG
fi

Externe Links