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 entweder ein NAS-System von Synology oder eine von Synology bereitgestellte Zusatzsoftware, dem "Hyper Backup Explorer" erforderlich, welchen es aktuell jedoch nur für Windows und Ubuntu gibt. 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 muss 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, wobei die hier verwendeten Script-Dateinamen nur der Veranschaulichung dienen. Die Script-Dateinamen können, unter Beachtung einiger Rahmenbedingungen nach Belieben verändert werden. Das erste Script mit dem beispielhaften 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 beispielhaften Dateinamen "rsync.sh" trägt, wird auf einen an der DS angeschlossenen, externen USB- oder SATA-Datenträger in dessen Wurzelverzeichnis abgelegt, auf dem die Datensicherung erfolgen soll.

Das über den Aufgabenplaner ausgeführte Script "search-rsync.sh" versucht anhand einiger Abfragen zu erkennen, an welchem USB- oder SATA Anschluss sich der externe Datenträger und somit das "rsync.sh"-Script befindet um die Pfade im Backup-Auftrag entsprechend anzupassen. 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. Protokolle und zum Löschen vorgemerkte Dateien können nach Ablauf einer einstellbaren Zeitvorgabe (in Tagen) automatisch über das System gelöscht werden. 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 unter dem Punkt „Externe Links“ entnommen 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.

Nachfolgend werden zwei Varianten des Such-Scripts vorgestellt. Da beide Varianten ihre Vor- aber auch ihre Nachteile haben und darüber hinaus die Geschmäcker verschieden sind überlasse ich es euch, welches der beiden Varianten ihr nutzen wollt. Es funktionieren beide, ihr müsst euch nur für eines entscheiden.


- Variante 1: Scripte anhand ihrer vollständigen Script-Dateinamen suchen und ausführen.

Bei dieser Variante müssen stets die vollständigen Script-Dateinamen inkl. ihrer Erweiterung (.sh) aufgeführt werden, damit die auszuführenden Scripte gefunden werden können.


search-rsync.sh (beispielhaft)

#!/bin/sh

# Script-Dateinamen definieren
# ------------------------------------------------------------------------
# Es besteht die Möglichkeit mehrere Scripte auszuführen, die dazu       |
# noch auf unterschiedlichen Datenträgern liegen. Dabei ist es auch nicht|
# zwingend erforderlich, das alle Scripte permanent verfügbar sein müssen|
# Wird ein Script oder auch mehrere Scripte gefunden, werden diese       |
# ausgeführt und somit das eigentliche Backupsystem angestoßen.          |
# Weiterhin ist auf die Schreibweise im Beispiel zu achten, pro Zeile je |
# ein Script-Dateiname.                                                  |
# ------------------------------------------------------------------------
SCRIPTNAME="rsync.sh
	    rsync-music.sh"

# ------------------------------------------------------------------------
# Ab hier bitte nichts mehr ändern                                       |
# ------------------------------------------------------------------------
for SCRIPT in $SCRIPTNAME
  do  
  # Durchsuche volumeUSB1
  if [ -f /volumeUSB1/usbshare/$SCRIPT ]; then
    sh /volumeUSB1/usbshare/$SCRIPT
  fi
  # Durchsuche volumeUSB2
  if [ -f /volumeUSB2/usbshare/$SCRIPT ]; then
    sh /volumeUSB2/usbshare/$SCRIPT
  fi
  # Durchsuche volumeUSB3
  if [ -f /volumeUSB3/usbshare/$SCRIPT ]; then
    sh /volumeUSB3/usbshare/$SCRIPT
  fi
  # Durchsuche volumeSATA
  if [ -f /volumeSATA/satashare/$SCRIPT ]; then
    sh /volumeSATA/satashare/$SCRIPT
  fi
done

- Variante 2: Scripte anhand einer bestimmten Zeichenkette im Script-Dateinamen suchen und ausführen.

Bei dieser Variante ist es nicht mehr erforderlich, den kompletten Script-Dateinamen anzugeben, sondern es reicht eine Zeichenkette, die in jedem Script-Dateinamen enthalten sein muss. So lassen sich zum Beispiel alle Scripte finden die die Zeichenkette "rsync" tragen: rsync_Backup_Filme.sh rsync_Filme.sh oder auch Filme_per_rsync_Script_sichern.sh


search-rsync.sh (beispielhaft)

#!/bin/sh

# Zeichenkette für Script-Dateinamen definieren
# ------------------------------------------------------------------------
# Eingabe einer Zeichenkette, die in jedem auszuührenden Script-         |
# Dateinamen enthalten sein muss.                                        |
# Beispiele für die Zeichenkette: "rsync" = rsync_Backup_Filme.sh        |
# rsync_Filme.sh oder auch Filme_per_rsync_Script_sichern.sh             |
#-------------------------------------------------------------------------
SCRIPT_STRING="rsync"

# ------------------------------------------------------------------------
# Ab hier bitte nichts mehr ändern                                       |
# ------------------------------------------------------------------------

for SCRIPT in /volume*/*share/*$SCRIPT_STRING*.sh
  do
    if [ -f $SCRIPT ]; then
    sh $SCRIPT
    fi
  done

Script 2: rsync.sh

Das zweite Script mit dem beispielhaften Script-Dateinamen "rsync.sh", 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) und falls gewünscht, die Signalsteuerung angegeben werden. Ebenso ist das setzen einer Zeitvorgabe für das Löschen alter Logdateien und zum Löschen vorgemerkter Dateien sinnvoll. Weiterhin muss der Script-Dateiname im „search-rsync.sh“ Script unter der Variablen „SCRIPTNAME“ hinterlegt werden. Es ist hierbei durchaus möglich, unterschiedliche Scripte mit unterschiedlichen Backup-Aufgaben auszuführen, die dabei auch auf unterschiedlichen Datenträgern abgelegt wurden. Es ist nicht zwingend erforderlich, das alle Scripte permanent Verfügbar sind. Alle gefundenen Scripte werden ausgeführt, nicht auffindbare Scripte werden übersprungen. Die auszuführenden Script-Dateinamen müssen dafür in der „search-rsync.sh“ hinterlegt werden. Hierzu auch die weiteren Hinweise in den Scripten 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 einen an der DS angeschlossenen, externen Datenträger abzulegen. Nachdem alle Parameter bestimmt wurden, kann man den Vorgang über den Aufgabenplaner ausführen lassen.


rsync.sh (beispielhaft)

#!/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   |
# ohne Angabe des entsprechenden Volume anzugeben ist. Weiterhin ist auf |
# die Schreibweise im Beispiel zu achten, pro Zeile je eine Backupquelle.|                                                         |
# ------------------------------------------------------------------------
SOURCES="/Musik/Alben
         /Fotos
	 /Videos/Serien
	 /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"


# Optische- sowie akustische Signalausgabe
#-------------------------------------------------------------------------
# 0 = Optische- sowie akustische Signalausgabe aus                       |
# 1 = Optische- sowie akustische Signalausgabe an                        |
#     Start      :  Status-LED wechselt von grün nach orange             |
#                   und es erklinkt ein Signalton                        |
#     Erfolgreich:  Status-LED wechselt von orange nach grün             |
#                   und es erklinkt ein weiterer Signalton               |
#     Fehler     :  Status-LED wechselt von orange nach grün             |
#                   und es erklinkt ein 3-Facher Fehler-Signalton        |
#-------------------------------------------------------------------------
SIGNAL="1"
  

# Exportieren der DSM-Systemkonfiguration (.dss)
#-------------------------------------------------------------------------
# Durch Eingabe einer "1" wird die DSM-Systemkonfigurartion (.dss) in den|
# Systemordner /@DSMConfig exportiert. Ist der Export nicht gewünscht,   |
# ist hier eine "0" einzutragen.                                         |
#-------------------------------------------------------------------------
DSSEXPORT="1"

# Rotationszyklus für das Löschen von @Recycle und @Logfiles 
#-------------------------------------------------------------------------
# Zeitangabe, wann Ordner bzw. Dateien in den System-Ordnern             |
# @Recycle (RECYCLE_ROTATE), @Logfiles (LOGFILES_ROTATE) sowie           |
# @DSMConfig (DSMCONFIG_ROTATE) endgültig gelöscht werden sollen, die    |
# älter als x Tage sind. Bei der Angabe "0" werden keinen Ordner/Dateien |
# in dem jeweiligen Ordner @Recycle, @Logfiles oder @DSMConfig gelöscht. |
# ------------------------------------------------------------------------
RECYCLE_ROTATE="90"
LOGFILES_ROTATE="90"
DSMCONFIG_ROTATE="90"



# ------------------------------------------------------------------------
# Ab hier bitte nichts mehr ändern, wenn man nicht weiß was man tut !!!  |
# ------------------------------------------------------------------------

# Umgebungsvariablen definieren
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin
SCRIPTFILE="${0##*/}"
SCRIPTNAME="${SCRIPTFILE%.*}"
DATEOPT="+%Y-%m-%d_%Hh%M"
TIMESTAMPOPT="+%d.%m.%Y%t%H:%M:%S"

# rsync Optionen konfigurieren
SYNCOPT="-ahR"
LOGSTAT="--stats"
EXCLUDE="--exclude=/@eaDir/*** --exclude=/#recycle/*** --exclude=/#snapshot/*** --exclude=/.DS_Store/***"
RECYCLE="--delete --backup --backup-dir=@Recycle/`date $DATEOPT`_$SCRIPTNAME"

# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren
if find $0
  then
    mkdir -p "`dirname $0`$DESTINATION"
    TARGET="`dirname $0`$DESTINATION"
  if [ $SIGNAL -eq 1 ]
  	then
  	  echo 3 >/dev/ttyS1
      echo : >/dev/ttyS1
      sleep 2
  fi
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`_$SCRIPTNAME.log"

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

# rsync - Befehl ausführen sowie protokollieren
for SHARE in $SOURCES
  do
    echo "" >> $LOG
    echo "--> Zusammenfassung: $SHARE nach $TARGET" >> $LOG
    rsync $SYNCOPT /volume*$SHARE $LOGSTAT $EXCLUDE $RECYCLE "$TARGET" >> $LOG 2>&1
  done

# DSM-Systemkonfiguration exportieren
if [ $DSSEXPORT -eq 1 ]
  then
    mkdir -p $TARGET/@DSMConfig
    synoconfbkp export --filepath $TARGET/@DSMConfig/DSMConfig_`date $DATEOPT`.dss
fi

# rsync - Ausführung auswerten und Ergebnis anhand der "exit codes" ausgeben
if [ $? -eq 0 ]
  then
    echo  "" >> $LOG
    echo "rsync-Datensicherung erfolgreich abgeschlossen. Sicherungsziel: $TARGET" >> $LOG
    DSMNOTIFY="rsync-Datensicherung erfolgreich abgeschlossen. Sicherungsziel: $TARGET"
  if [ $SIGNAL -eq 1 ]
  	then
      echo 3 >/dev/ttyS1
      echo 8 >/dev/ttyS1
      sleep 2      
  fi
  
elif [ $? -ne 0 ]
  then
    echo  "" >> $LOG
    echo "rsync-Datensicherung nach $TARGET fehlgeschlagen - Fehler $?" >> $LOG
    DSMNOTIFY="rsync-Datensicherung nach $TARGET fehlgeschlagen - Fehler $?"
  if [ $SIGNAL -eq 1 ]
  	then
      echo 2 >/dev/ttyS1
      sleep 1
      echo 2 >/dev/ttyS1
      sleep 1
      echo 2 >/dev/ttyS1
      sleep 1
      echo 8 >/dev/ttyS1
  fi  
fi

# Dateien im Ordner @Recycle die älter als x Tage sind, löschen.
if [ -d $TARGET/@Recycle/ ]
  then 
    if [ $RECYCLE_ROTATE -ne 0 ]
      then
        find $TARGET/@Recycle -type d -mtime +$RECYCLE_ROTATE -exec rm -rd {} \;
   fi
fi

# Dateien im Ordner @RLogfiles die älter als x Tage sind, löschen.
if [ -d $TARGET/@Logfiles/ ]
  then
    if [ $LOGFILES_ROTATE -ne 0 ]
      then
        find $TARGET/@Logfiles -name "*.log" -type f -mtime +$LOGFILES_ROTATE -exec rm {} \;
    fi
fi

# Dateien im Ordner @DSMConfig die älter als x Tage sind, löschen.
if [ -d $TARGET/@DSMConfig/ ]
  then
    if [ $DSMCONFIG_ROTATE -ne 0 ]
      then
        find $TARGET/@DSMConfig -name "*.log" -type f -mtime +$DSMCONFIG_ROTATE -exec rm {} \;
    fi
fi

# Benachrichtigung an die DSM-Administratorengruppe senden
synodsmnotify @administrators "Script: $SCRIPTNAME" "$DSMNOTIFY"

	
# Sicherungsprotokoll als E-Mail versenden (oder als Datei im Backupziel einsehen)
if [ "$EMAIL" ]
  then
    ssmtp $EMAIL < $LOG
fi

Realese-Notes (Stand: 19.03.2016)

  • Ab sofort kann man die DSM-Systemkonfiguration exportieren. Diese wird auf Wunsch in den Systemordner @DSMConfig nach dem Muster DSMConfig_2016-03-19_22h00.dss abgelegt. Weiterhin kann auch hier über eine Zeitvorgabe (in Tagen) eingestellt werden, wie lange die exportieren Systemkonfigurationen erhalten bleiben sollen.
  • Eine weitere Variante des Such-Scriptes wurde veröffentlicht um die Suchbedingungen individueller anpassen zu können.


Release-Notes (Stand: 18.03.2016)

  • Die chronologische Speicherung innerhalb der Systemordner @Recycle und @Logfiles kann jetzt unabhängig von einander über eine individuell einstellbare Zeitvorgabe in Tagen begrenzt werden. Daten, die älter sind als die eingestellten Zeitvorgaben, werden "unwiderruflich" gelöscht.
  • Die eigentliche Befehlszeile des rsync-Aufrufes im Script wurde neu strukturiert, indem die Ausführungsoptionen in Variablen ausgelagert, gruppiert und optimiert wurden. Das erleichtert eine Anpassung des rsync-Aufruf an die gewünschten Bedürfnisse.
  • Verbesserung der Anzeige und Ausgabe von Datum und Uhrzeit sowie des Script-Dateinamens
  • @Logfile Protokolle werden jetzt nach dem Muster 2016-03-18_21h37_[SCRIPT-NAME].log abgelegt
  • @Recycle Ordner werden jetzt nach dem Muster 2016-03-18_21h37_[SCRIPT-NAME] abgelegt
  • In den Benachrichtigungen und Protokollen wird stets der ausgeführte Script-Dateiname angegeben.
  • Viele kleinere Script-Verbesserungen- und Anpassungen


Release-Notes (Stand: 11.03.2016)

  • Anstatt wie bisher nur eine Backup-Aufgabe ausführen zu können, kann jetzt eine beliebige Anzahl von Backup-Aufgaben auf unterschiedlichen Datenträgern ausgeführt werden.
  • Die Script-Dateinamen („search-rsync.sh“ sowie „rsync.sh“) können ab sofort individuell vergeben werden, einzig die Endung .sh muss erhalten bleiben.
  • Beim Definieren der Backup-Quellen (SOURCES), müssen keine Volume-Bezeichnungen mehr mitgeführt werden. Es reicht demnach der Pfad eines gemeinsamen Ordners, also z.B. /music/Alben/International
  • Über das Benachrichtigungssystems des DSM wird jetzt auch der ausgeführte Script-Dateiname angezeigt.
  • Es wurde eine optische- sowie akustische Signalausgabe eingebaut, die optional ausgewählt werden kann.
  • Kleinere Script-Verbesserungen und Beseitigung von Schönheitsfehlern.

Externe Links