[Projekt] rsync -Alternative dateibasierte Datensicherung

Status
Für weitere Antworten geschlossen.

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Dann werd ich volumeUSB3 und volumeSATA gleich mal mit einbauen. Und du hast vollkommen recht, so hat man für jede Backupplatte ein individuelles Backupscript und man läuft nicht Gefahr, das irgendwas mal auf der falschen Platte landet. So konnten wir die Wünsche und Vorschäge von tschortsch ja doch noch erfüllen und im Nachhinein betrachtet, war das ein sehr guter Einwand, dessen Umsetzung sich sogar einfacher als erwartet gestalltet hat, dank deiner Tipps PsychoHH

Schön. Richtig schön!

Tommes
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
OK, dann hier nochmal das komplette Script. Heist volumeSATA dann auch volumeSATA/satashare ???

Aufgabenplaner
Entweder man kopiert den Inhalt einfach in das Textfeld des Aufgabenplaners, oder legt sich ein script an (Shebang nicht vergessen) und gibt dann den Pfad zum Script an.

PHP:
if find /volumeUSB1/usbshare/rsync.sh; then
/volumeUSB1/usbshare/rsync.sh
fi
if find /volumeUSB2/usbshare/rsync.sh; then
/volumeUSB2/usbshare/rsync.sh
fi
if find /volumeUSB3/usbshare/rsync.sh; then
/volumeUSB3/usbshare/rsync.sh
fi
if find /volumeSATA/satashare/rsync.sh; then
/volumeSATA/satashare/rsync.sh


Externer USB- oder SATA-Datenträger
Und hier das rsync.sh Script, welches auf den jeweiligen USB- oder SATA-Datenträger abgelegt wird.
PHP:
#!/bin/sh

# E-Mail Adresse
# --------------------------------------------------------------
# Die E-Mail-Adresse muß identisch mit der im DSM unter 
# Systemsteuerung/Benachrichtigung konfigurierten sein.
    EMAIL="dein.name@mail.tld"

# Backup - Quelle
# --------------------------------------------------------------
    VOLUME="/volume1"        
    SHAREDFOLDER=(/photo 
                  /video/Spielfilme
                  /music/Alben/Deutsch )

# Backup - Ziel (Nur den Zielordner, ohne Angabe des Volumes)
# --------------------------------------------------------------
	DESTINATION="/Backup"

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

# Umgebungsvariablen definieren
	RSYNCCONF=(--stats --log-file-format="%i %o %f" --delete --backup --backup-dir=`$DATE`_Recycle)
	RSYNC="/bin/rsync"
	SSH="/bin/ssh" 
	SSMTP="/usr/bin/ssmtp"
	ECHO="/bin/echo" 
	MKDIR="/bin/mkdir"
	FIND="/bin/find"
	SYNODSMNOTIFY="/usr/syno/bin/synodsmnotify"
	DATE="/bin/date +%Y-%m-%d"; 
	TIMESTAMP="/bin/date +%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
	
# Datei für das Protokoll anlegen und bei Bedarf die E-Mail-Kopfdaten generieren
LOG="$TARGET/`$DATE`_Sicherungsprotokoll.log"	

if [ "$EMAIL" ]; then
	$ECHO  "To: $EMAIL" > $LOG
	$ECHO  "From: $EMAIL" >> $LOG
	$ECHO  "Subject: Sicherungsprotokoll vom `$TIMESTAMP` Uhr" >> $LOG
	$ECHO  "" >> $LOG	
	else	
		$ECHO "Sicherungsprotokoll vom `$TIMESTAMP` Uhr" > $LOG
	fi

# rsync - Befehl ausführen sowie protokollieren	
for SHARE in "${SHAREDFOLDER[@]}"
	do
		$ECHO "" >> $LOG
		$ECHO "------------------------------------------------------------------------------------" >> $LOG
		$ECHO "Statusbericht für: $VOLUME$SHARE" >> $LOG
		$ECHO "------------------------------------------------------------------------------------" >> $LOG
		$RSYNC -ah "$VOLUME$SHARE" "${RSYNCCONF[@]}" "$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" >> $LOG
		DSMNOTIFY="rsync-Datensicherung erfolgreich abgeschlossen"	
		elif [ $? -ne 0 ]; then	
			$ECHO  "" >> $LOG
			$ECHO "rsync-Datensicherung fehlgeschlagen" >> $LOG
			DSMNOTIFY="rsync-Datensicherung fehlgeschlagen - Fehler $?"
	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

Es wird. Leute, es wird!

Tommes
 
Zuletzt bearbeitet:

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Ja sollte auch satashare sein, hab gerade kein SATA angeschlossen.

Du kannst aber eigentlich mit der Variable PWD alles abkürzen.

So sollte folgendes für alle Scripte langen, da dort der "aktuelle Pfad" ausgegeben wird.

auf Platte1 wird dann Target = /volumeUSB1/usbshare$DESTINATION
auf Platte2 wird dann Target = /volumeUSB2/usbshare$DESTINATION
und unter Sata wird dann Target = /volumeSATA/satashare$DESTINATION




# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren
if $FIND $PWD/rsync.sh; then
$MKDIR -p $PWD$DESTINATION
TARGET="$PWD$DESTINATION"
fi

Dies geht nicht, da es unter /usr/syno/synoman/webapi läuft.


So klappt es aber :)

# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren

LOCATION=$(dirname "$(readlink -e "$0")")
if $FIND $LOCATION/rsync.sh; then
$MKDIR -p $LOCATION$DESTINATION
TARGET="$LOCATION$DESTINATION"
fi
 
Zuletzt bearbeitet:

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Das funktioniert irgendwie nicht. Wenn ich mir TARGET="$PWD$DESTINATION" ausgeben lasse, erhalte ich als Antwort /bin/pwd/Backup

Ich hab die Variable $PWD ja mit PWD="/bin/pwd" gesetzt und diese ruft er anscheinend ab.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Ja nimm mal das untere Script.
Hab das eben auch gesehen und eine Lösung geschrieben.
Hab noch eine Benachrichtigung geändert, sodass man sieht wo welches Backup funktioniert/fehlschlägt.

Also probiert mal die beiden Sachen.
Bei mir klappt es.

PHP:
# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren      LOCATION=$(dirname "$(readlink -e "$0")")if $FIND $LOCATION/rsync.sh; then $MKDIR -p $LOCATION$DESTINATIONTARGET="$LOCATION$DESTINATION" fi


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

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
OK, das läuft soweit. Wie muß ich jetzt das hier umbauen...

LOG="$TARGET/`$DATE`_Sicherungsprotokoll.log"

... da mir das Protokoll jetzt immer auf der DS im Hauptordner unter / abgelegt wird.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
sollte nicht passieren.

Bei mir landet es z.B. unter volumeUSB1/usbshare/Backup/

/volumeUSB1/usbshare/Backup/2016-01-31_Sicherungsprotokoll.log

# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren

LOCATION=$(dirname "$(readlink -e "$0")")
if $FIND $LOCATION/rsync.sh; then
$MKDIR -p $LOCATION$DESTINATION
TARGET="$LOCATION$DESTINATION"
fi



Target wird ja somit immer festgelegt mit "volume*/*share/$DESTINATION



Irgendwie zerhaut er mir immer die Formatierung beim code :/
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Ach ich Seppel. Ich hab anstatt...

TARGET="$LOCATION$DESTINATION"

... das hier hier geschrieben

$TARGET="$LOCATION$DESTINATION"

Ich glaub, ich sollte für heut schluß machen... der Tunnel indem ich mich befinde wird langsam zu eng... ich seh nichts mehr *g*

Auf jeden Fall nochmals Danke für deine tolle Hilfe (wie oft hab ich dir das eigentlich schon gesagt? )

Ich mach mal Pause...

Tommes
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Ach das passiert doch schnell.
Mach mal einfach Pause :)




Ich würde noch einen Ordner Log erstellen, ab 20 Logs kann es sonst schnell unübersichtlich werden.
also einfach, falls man die Logs behalten will.
LOG="$TARGET/Log/`$DATE`_Sicherungsprotokoll.log"




Hast schon oft genug danke gesagt, wir wollen ja alle eine gute Lösung erhalten.


Es ist somit schon ein sehr gutes Script und super, dass es auch egal ist wo man die Platte dann anschließt.

Und ob jemand jetzt immer alle Dateien behält oder diese per rsync löscht, kann das ja selbst festlegen.



*EDIT*

Hab mir gerade nochmal ein paar Gedanken gemacht was fehlt.
Gibt ja doch mal einige Daten, die sich auf volume2 befinden und man sichern will.

Man könnte noch mehrere Variable festlegen für volume2 z.B.
und dann halt die shares als share1 + share2 zu deklarieren.
dann würde es auch sinn machen den rsync mit $VOLUME* zu erweitern, sodass das Backup dann unter /Backup/volume*/ gespeichert wird.

Folgende Ordner/Dateien würde ich z.B. auch noch ausschließen. Und dafür eine Variable setzen.
EXCLUDE="--exclude=@eaDir --exclude=\#recycle --exclude=.DS_Store"
 
Zuletzt bearbeitet:

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Du hälst einen alten Mann wie mich ja ganz schön auf Trab. Ich werd mich heut Abend wohl nochmal dransetzen und versuchen deine wertvollen Tipps umzusetzen. Du hast ja bereits gemerkt, das ich im Scripten noch nicht wirklich sattelfest bin, aber ich hab in den letzten beiden Tagen wieder sehr viel dazugelernt und ich finde es toll, wie sich das Ganze hier entwickelt und das treibt mich weiter an.

Den Exclude kann man hier noch anhängen...

RSYNCCONF=(--stats --log-file-format="%i %o %f" --delete --backup --backup-dir=`$DATE`_Recycle)

Tommes
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Kleines Update:

Ich habe jetzt folgende Ordner/Dateien mit...

--exclude=/@eaDir/*** --exclude=/#recycle/*** --exclude=/.DS_Store/***

...ausgeschlossen. Das /*** bedeutet, das es den Ordner selber einschließlich seiner versteckten Elemente ausschließt. Hab die Funktion aber ehrlich gesagt nur mit dem @eaDir Ordner getestet, was jedoch funktionierte. Gibt es noch weitere Ordner die man hier auschließen könnte/sollte?

Weiterhin habe ich jetzt einen Ordner /@Logfiles für die Sicherungsprotokolle sowie einen Ordner /@Recycle indem die gelöschten Ordner/Dateien in einem Ordner mit aktuellen Datum (z.B. 2016-01-32) reinfallen. Somit hätten wir hier auch eine saubere Lösung. Durch das @ im Ordnernamen stehen diese immer ganz Oben in der Hirachie und können somit immer gut lokalisiert werden.

Das Thema /volume1 /volume2/ /volumeX zu bearbeiten fällt mir da schon schwerer, da ich hier nur 1-Bay Systeme verwende, die halt nur ein /volume1 besitzen. Hier könnte ich zwar was basteln, aber ich kann es dann leider nicht unter realen Bedingungen testen. Auch frage ich mich grade, ob ein 4-Bay System dann auch 4 /volumes besitzt bzw. besitzen kann. Was wäre dann mit noch mehr Bay's? Wo sollen wir da die Grenze ziehen? Was macht Sinn und was nicht.

Zum Abschluss des Tages nochmal das gesamte Script, so wie es aktuell bei mir läuft. Und ich stelle jetzt mal die Codeausgabe von php auf code um, dann ist das alles nicht mehr so bunt :p

Aufgabenplaner
Code:
if find /volumeUSB1/usbshare/rsync.sh; then
/volumeUSB1/usbshare/rsync.sh
fi
if find /volumeUSB2/usbshare/rsync.sh; then
/volumeUSB2/usbshare/rsync.sh
fi
if find /volumeUSB3/usbshare/rsync.sh; then
/volumeUSB3/usbshare/rsync.sh
fi
if find /volumeSATA/satashare/rsync.sh; then
/volumeSATA/satashare/rsync.sh


rsync.sh
Code:
#!/bin/sh

# E-Mail Adresse (= E-Mail aus Systemsteuerung/Benachrichtigung)
# oder das Feld mit # auskommentieren
# --------------------------------------------------------------
    EMAIL="dein.name@mail.tld"

# Backup - Quelle
# --------------------------------------------------------------
    VOLUME="/volume1"        
    SHAREDFOLDER=(/photo 
                  /video/Spielfilme
                  /music/Alben/National )
				  
# Backup - Ziel (Nur den Zielordner, ohne Angabe des Volumes)
# --------------------------------------------------------------
	DESTINATION="/Backup"


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

# Umgebungsvariablen definieren
	RSYNC="/bin/rsync"
	SSH="/bin/ssh" 
	SSMTP="/usr/bin/ssmtp"
	ECHO="/bin/echo" 
	MKDIR="/bin/mkdir"
	FIND="/bin/find"
	PWD="/bin/pwd"
	SYNODSMNOTIFY="/usr/syno/bin/synodsmnotify"
	DATE="/bin/date +%Y-%m-%d"; 
	TIMESTAMP="/bin/date +%d.%m.%Y_%H:%M:%S"  
	RSYNCCONF=(--stats --log-file-format="%i %o %f" --exclude=/@eaDir/*** --exclude=/#recycle/*** --exclude=/.DS_Store/*** --delete --backup --backup-dir=@Recycle/`$DATE`)

# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren      
	LOCATION=$(dirname "$(readlink -e "$0")")

if $FIND $LOCATION/rsync.sh; then
	$MKDIR -p $LOCATION$DESTINATION
	TARGET="$LOCATION$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`_Sicherungsprotokoll.log"	

if [ "$EMAIL" ]; then
	$ECHO  "To: $EMAIL" > $LOG
	$ECHO  "From: $EMAIL" >> $LOG
	$ECHO  "Subject: Sicherungsprotokoll vom `$TIMESTAMP` Uhr" >> $LOG
	$ECHO  "" >> $LOG	
	else	
		$ECHO "Sicherungsprotokoll vom `$TIMESTAMP` Uhr" > $LOG
	fi

# rsync - Befehl ausführen sowie protokollieren	
for SHARE in "${SHAREDFOLDER[@]}"
	do
		$ECHO "" >> $LOG
		$ECHO "------------------------------------------------------------------------------------" >> $LOG
		$ECHO "Statusbericht für: $VOLUME$SHARE" >> $LOG
		$ECHO "------------------------------------------------------------------------------------" >> $LOG
		$RSYNC -ah "$VOLUME$SHARE" "${RSYNCCONF[@]}" "$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

So, Schluss für heute. Es reicht :D

Tommes
 
Zuletzt bearbeitet:

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.383
Punkte für Reaktionen
1.198
Punkte
234
Danke für deine Arbeit, Tommes :D

Ich würde noch einen weiteren Ordner ausschließen. Ist das Dateisystem BTRFS und die Snapshots in der Filestation durchsuchbar, so werden diese im jeweiligen Gemeinsamen Ordner unter der Bezeichnung #snapshot gemountet. Würde man dieses Verzeichnis mit sichern, explodiert wahrscheinlich die Backupgröße.

Daher:
Rich (BBCode):
… --exclude=/#snapshot/*** …

Bildschirmfoto 2016-02-01 um 00.55.24 Kopie.png
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Danke für deine Arbeit, Tommes :D
Dank dir, aber ohne die Hilfe von PsychoHH wäre das Projekt wohl noch lange nicht da, wo es grade ist. Nichts desto trotz macht mir das Ganze hier grad unwahrscheinlich viel Spaß, so das die Arbeit dahinter eher eine Nebenrolle spielt. Ich hab die letzten Tage wieder soviel gelernt... das ist mir die Arbeit wert.

Rich (BBCode):
… --exclude=/#snapshot/*** …

Danke hierfür. Werd ich einbauen.

Tommes
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Sehr gut gemacht. Ja macht auch spaß und die "perfekte" Lösung naht.

So jetzt hab ich mir eben mal ein paar Minuten das Script angesehen.

Man kann mehrere Ordner mit einem Befehl sichern. z.B. rsync quelle quelle ziel

# Backup - Quelle
# --------------------------------------------------------------
VOLUME1="/volume1"
VOLUME2="/volume2"
VOLUME3="/volume3"
VOLUME4="/volume4"

SHAREDFOLDER=(/abc
/ungesichert
/def )



$RSYNC -ah "$VOLUME1$SHARE" "$VOLUME2$SHARE" "${RSYNCCONF[@]}" "$TARGET" >> $LOG 2>&1



Problem ist aber, dass man eine Fehlermeldung bekommt, da die Ordner nicht auf beiden volumes liegen.


Gerade habe ich auch soviel im Kopf, dass ich keine Lösung parat habe.


Die einfachste wäre wahrscheinlich die Quelle genau anzugeben sprich mit "volume1":

SHAREDFOLDER=(volume1/photo
/volume2/video)

Also einfach die Variable $VOLUME komplett rausnehmen und es klappt.
So kriegt man keine Fehler und es steht alles richtig im Log.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Es spricht ja nichts dagegen die Variable $VOLUME komplett zu entfernen und das Volume $SHAREDFOLDER unterzuschieben. Das wäre wohl auch die einfachste Lösung um das Array $SHAREDFOLDER der rsync Schleife SHARE zuzuführen. So sollte es möglich sein, auf einfachste Weise eine unbegrenzte Anzahl von Volumes, also Quellen... einzubinden. Als Speichetort müsste dann halt auch in die jeweiligen Volume-Ordner gesichert werden. Dann wäre es perfekt.

Ich lass dir freie Bahn das umzusetzen, ich werd da heute nämlich nicht mehr zu kommen.

Tommes
 
Zuletzt bearbeitet:

noiasca

Benutzer
Mitglied seit
08. Feb 2014
Beiträge
375
Punkte für Reaktionen
0
Punkte
16
ich lese das erst jetzt - ohne alles zu verstehen. Schaut aber schon super aus. Zum Ausprobieren komm ich erst morgen. Aber die Ideen sprudeln leider jetzt schon:

Liese sich das auch noch erweitern um ein "Versioniertes Backup"? also dass die "Sicherungen" unter einem Datum angelegt werden, für Daten die gleich geblieben sind Hardlinks im aktuellen Datum anlegen, und Daten die sich verändert haben eben tatsächlich kopieren. Zumindest Ext und NTFS sollten ja Hardlinks können ... oder bin ich am falschen Dampfer?
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Na gut, ich hab das grad mal umgebaut (konnte eh nicht mehr schlafen)

Das Script ist jetzt so aufgebaut, das ich die Variablen $VOLUME und $SHAREDFOLDER entfernt und dafür die Variabel $SOURCES definiert habe, worin alle Quellen inkl. volumeX eingetragen werden. Somit spielt es jetzt keine Rolle mehr von welchen Volumes man sichern möchte und kann diese dazu noch beliebig mischen. Die Syntrax lautet also z.B. /volume1/Script_Stuff/share1.

@PsychoHH
Eigentlich eine total simple Geschichte, aber manchmal sieht man den Wald vor lauter Bäumen nicht. Ich denke halt manchmal zu kompliziert und auch wenn die Lösung eigentlich schon vor einem liegt erkennt ich sie oft erst beim zweiten oder dritten hinsehen.

Damit die Daten im Ziel auch im entsprechenden Ordner /volumeX/.../.... landen habe ich dem rsync-Befehl die Option -R gegönnt. Wem es interessiert kann sie die Optionsschalter gerne mal ergooglen. Wem dieses Vorgehen nicht gefällt kann die Option -R auch wieder entfernen.

@noiasca
Ja, man kann mit rsync auch versioniert arbeiten wobei dann i.d.R. mit Hardlinks gearbeitet wird. Ich persönlich stoße mich jedoch noch mit dieser Art der Sicherung, da mir das wiedeherstellen noch nicht so ganz klar ist... wegen den Hardlinks. Auf Linuxsystemen mag das noch recht einfach umzusetzten sein, auf Windowssystemen wohl aber nicht. So jedenfalls verstehe ich das bisher.Nichts desto trotz könnte man eine Option einbauen, die es erlaubt entweder "normal" oder "versioniert" zu arbeiten. Vielleicht baue ich das noch ein... bin mir da aber noch nicht sicher. Anderseits kannst du das Script gerne her nehmen und es selber deinen Vorstellungen anpassen.

@geimist: Hab deinen Codeschnippselt mit drin.

Hier also "mal wieder" das überarbeitete Script. Bitte mal testen, ob noch alles so funktioniert wie es soll. Hatte nämlich ein bisschen wenig Schlaf heute.

Code:
#!/bin/sh

# E-Mail Adresse (= E-Mail aus Systemsteuerung/Benachrichtigung)
# oder das Feld mit # auskommentieren
# --------------------------------------------------------------
    EMAIL="dein.name@mail.tld"

# Backup - Quelle
# --------------------------------------------------------------
	SOURCES=(/volume1/Script_Stuff/share1
	         /volume1/Script_Stuff/share2
		 /volume1/Script_Stuff/share3
		 /volume1/homes/admin)	  
				  
# Backup - Ziel (Nur den Zielordner, ohne Angabe des Volumes)
# --------------------------------------------------------------
	DESTINATION="/Backup"
	
# --------------------------------------------------------------
# Ab hier bitte nichts mehr ändern
# --------------------------------------------------------------

# Umgebungsvariablen definieren
	RSYNC="/bin/rsync"
	SSH="/bin/ssh" 
	SSMTP="/usr/bin/ssmtp"
	ECHO="/bin/echo" 
	MKDIR="/bin/mkdir"
	FIND="/bin/find"
	PWD="/bin/pwd"
	SYNODSMNOTIFY="/usr/syno/bin/synodsmnotify"
	DATE="/bin/date +%Y-%m-%d"; 
	TIMESTAMP="/bin/date +%d.%m.%Y_%H:%M:%S"  
	RSYNCCONF=(--stats --log-file-format="%i %o %f" --exclude=/@eaDir/*** --exclude=/#recycle/*** --exclude=/#snapshot/*** --exclude=/.DS_Store/*** --delete --backup --backup-dir=@Recycle/`$DATE`)

# Angeschlossenes USB-Laufwerk lokalisieren und Ziel definieren      
	LOCATION=$(dirname "$(readlink -e "$0")")

if $FIND $LOCATION/rsync.sh; then
	$MKDIR -p $LOCATION$DESTINATION
	TARGET="$LOCATION$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`_Sicherungsprotokoll.log"	

if [ "$EMAIL" ]; then
	$ECHO  "To: $EMAIL" > $LOG
	$ECHO  "From: $EMAIL" >> $LOG
	$ECHO  "Subject: Sicherungsprotokoll vom `$TIMESTAMP` Uhr" >> $LOG
	$ECHO  "" >> $LOG	
	else	
		$ECHO "Sicherungsprotokoll vom `$TIMESTAMP` 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" "${RSYNCCONF[@]}" "$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

Viel Spaß damit

Tommes
 
Zuletzt bearbeitet:

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Wow klasse.

Also mit -r sollte es tatsächlich klappen.
Hab gestern spät abends nochmal die manpage gelesen und -r total überlesen.

Dann hab ich einfach mal versucht den share zu kürzen. Ging auch, mochte aber array nicht so sehr, sodass nur bei einem pfad geklappt hat. Dann seh ich eben deinen Post und dachte das kann doch nicht sein, dass man die Unterverzeichnisse mit - r kopieren kann.

Probier ich nachher gerne mal aus :)
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.145
Punkte für Reaktionen
1.113
Punkte
314
Ja, das mit den Optionen ist schon Teufelszeug :D

Es macht auch einen Unterschied ob -r oder -R, da -r für rekursiv innerhalb eines Ordners steht und -R um relative Pfadnamen zu nutzen. Auch ist der Schalter -r u.a. bereits in -a enthalten da -a ...

Zitat von *hier*

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)

Ich sag ja, Teufelszeug. Hab auch 'ne halbe Stunde drüber gebrütet bis ich das gerafft hatte.

Tommes
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat