[Projekt] rsync -Alternative dateibasierte Datensicherung

Status
Für weitere Antworten geschlossen.

Fink

Benutzer
Mitglied seit
11. Dez 2010
Beiträge
92
Punkte für Reaktionen
5
Punkte
8
Hallo,

ich bräuchte sowas um an eine 2 DS zu sichern. Wie würde hier das Skript aussehen?
Reicht es aus, den Pfad mit der IP der 2. DS als Target zu definieren?
Die E-Mail Funktion bräuchte ich nicht.

Ansonsten cooles Projekt.

Gruß
Finke
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.885
Punkte für Reaktionen
1.171
Punkte
754
Du musst entweder den rsyncd auf der Backup-DS aktivieren (Datensicherungsdienst) und dann entsprechend den rsync-Aufruf anpassen. Oder Du mountest Dir im Skript das Netzlaufwerk bzw. die Laufwerke der Backup-DS und stellst dann die Zielpfade im Skript darauf ein.
 

Fink

Benutzer
Mitglied seit
11. Dez 2010
Beiträge
92
Punkte für Reaktionen
5
Punkte
8
Hallo dil88,

vielen Dank für die Info. Der Datensicherungsdienst ist aktiviert. Reicht es nun aus einfach als Target den Pfad mit der IP zu setzen oder muss noch etwas mit SSH geschehen? Die Stations stehen beide im gleichen lokalen Netzwerk.

Gruß
Fink
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.885
Punkte für Reaktionen
1.171
Punkte
754
Wenn Du lokal arbeitest, würde ich auf den ssh-Tunnel verzichten. Wie die genaue Syntax ist, kann ich aus dem Kopf nicht sagen, da ich die zweite Variante nutze. Aber das findest Du im Netz an vielen Orten.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Also bei mir klappt alles mit dem Script.


volume1 und volume2 landen zusammen mit @Logfile im angegeben Zielordner und alles ist da.
Benachrichtigungen und auch die Logs stimmen.



Somit ist es nun egal, welches Volume man sichern will, auch ist es egal an welchen Port man die Platte ansteckt.
Mir gefällt es jetzt sehr gut.

Noch jemand Ideen und Wünsche? :)

Klasse Projekt.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
Ich denke das wir das eigentliche Ziel einer alternativen, dateibasierten Datensicherung erreicht haben. Dafür möchte ich mich auf jeden Fall nochmal bei dir, PsychoHH recht herzlich bedanken. Ich finde wir zwei haben das wirklich gut umgesetzt bekommen und ich bin da ehrlich gesagt auch ein klein wenig Stolz drauf.

Wie geht es also weiter?
Ich denke, ich räum das Script noch was auf und Wisch nochmal feucht durch und stell das die nächsten Tage ins Wiki! Aber du siehst, ein Ende ist noch lange nicht in Sicht. Versioniertes sichern, evtl. sogar verschlüsselt, auf andere Rsync-Server oder Synology Systeme... ich glaub, da geht noch was.

Aber das sollen dann andere machen. Oder vielleicht pack ich doch noch was drauf, wenn mir danach ist. Mal sehen...

Tommes
 

raymond

Benutzer
Mitglied seit
10. Sep 2009
Beiträge
4.704
Punkte für Reaktionen
21
Punkte
118
dicker fetter Daumen hoch!
 

reiki

Benutzer
Mitglied seit
16. Mai 2012
Beiträge
352
Punkte für Reaktionen
5
Punkte
18
Von mir auch Daumen hoch und vielen Dank für die Arbeit.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
Soooooo... ich hab das ganze jetzt nochmal in Schön. Hab die Scripte ein wenig aufgeräumt und mit ein paar Kommentaren versehen. Hab das bei mir abermals getestet und sollte eigentlich alles soweit laufen... aber zur Vorsicht bitte auch nochmal von euch durchtesten ob auch wirklich alles passt. Wir wollen hier ja niemanden einen Datenverlust bescheren.


Script 1: search-rsync.sh (Aufruf manuel oder automatisiert über den Aufgabenplaner)
Code:
#!/bin/sh

# Kurze Funktionsbeschreibung "search-rsync.sh"
# ------------------------------------------------------------------------
# Das Script kann manuell oder automatisiert über den Aufgabenplaner     |
# als "root" ausgeführt werden, je nachdem ob der externe Datenträger    |
# temporär oder permanent mit der DS verbunden wird.                     |
# Nach dem Start des Scriptes werden alle USB- sowie SATA Anschlüsse der |
# DS nach extern angeschlossenen Datenträgern durchsucht um im jeweiligen|
# Wurzelverzeichnis das Script "rsync.sh" zu lokalisieren. Wird das      |
# rsync.sh Script gefunden, wird es ausgeführt und somit das eigentliche |
# Backupsystem angestoßen. Im Vorfeld muß natürlich noch das rsync.sh    |
# Script den jeweiligen Bedürfnissen angepasst werden.                   |
# ------------------------------------------------------------------------


# Durchsuche volumeUSB1
if find /volumeUSB1/usbshare/rsync.sh; then
	/volumeUSB1/usbshare/rsync.sh
fi

# Durchsuche volumeUSB2
if find /volumeUSB2/usbshare/rsync.sh; then
	/volumeUSB2/usbshare/rsync.sh
fi

# Durchsuche volumeUSB3
if find /volumeUSB3/usbshare/rsync.sh; then
	/volumeUSB3/usbshare/rsync.sh
fi

# Durchsuche volumeSATA
if find /volumeSATA/satashare/rsync.sh; then
	/volumeSATA/satashare/rsync.sh
fi


Script 2: rsync.sh (Liegt auf dem zu sichernden externen Datenträger)
Code:
#!/bin/sh

#Wichtiger Hinweis
#-------------------------------------------------------------------------
# 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 nutzt ihr dieses Script auf eigene Gefahr.                       |
# Aus diesem Grunde solltet ihr dieses System erstmal mit unwichtigen    |
# Testdaten auf seine Funktion hin testen, bevor ihr das ganze           |
# "produktiv" einsetzt.                                                  |
#-------------------------------------------------------------------------

#Kurze Funktionsbeschreibung "rsync.sh"
#-------------------------------------------------------------------------
# Das vorliegende Script, welches den Dateinamen "rsync.sh" tragen muss, |
# wird auf dem externen Datenträger in dessen Wurzelverzeichnis abgelegt,|
# auf dem die Datensicherung stattfinden soll. Entsprechend muß dieses   |
# Script im Vorfeld den Begebenheiten angepasst, werden indem man        |
# E-Mail-Adresse, Backupquellen und das Ziel definiert.                  |
#                                                                        |
# Nachdem das Script "search-rsync.sh" dieses Script gefunden und        |
# ausgeführt hat, wird der eigentlich Backupvorgang initiert.            |
#                                                                        |
# Im folgenden wird erstmal Anhand einer Abfrage erkannt, an welchen     |
# USB- oder SATA Anschluss sich der externe Datenträger befindet um die  |
# Pfade im Script entsrechend anpassen zu können. Der so ermittelte      |
# Laufwerkspfad wird dem Ziel-Ordner vorangestellt um so das Backup      |
# an der richtigen Stelle absetzen zu können.                            |
#                                                                        |
# Das Backup selber synchronisiert die Quellen mit dem Ziel. Dabei werden|
# die Ornderpfade relativ, nach Volume 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 etc. 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 enstammt    |
# hierbei den exit-codes von rsync und kann bei Bedarf ergooglet werden. |
# ------------------------------------------------------------------------


# 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"
	
	
# ------------------------------------------------------------------------
# Ab hier bitte nichts mehr ändern                                       |
# ------------------------------------------------------------------------

# Umgebungsvariablen definieren
  SSMTP="/usr/bin/ssmtp"
  RSYNC="/bin/rsync"
  MKDIR="/bin/mkdir"
  FIND="/bin/find" 
  ECHO="/bin/echo"
  PWD="/bin/pwd"
  DATE="/bin/date +%Y-%m-%d";
  TIMESTAMP="/bin/date +%d.%m.%Y_%H:%M:%S"
  SYNODSMNOTIFY="/usr/syno/bin/synodsmnotify"
  
# rsync-Optionen definieren    
  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

Ich hoffe ihr könnt damit etwas anfangen und entwickelt es vielleicht sogar weiter und perfektioniert es noch. Einen Eintrag ins Wiki spare ich mir erstmal, kann man ja immer noch machen... brennt ja nicht. Wir sind ja noch im DSM 6 Beta-Stadium und wer weiß wohin die Reise noch geht.

Ach ja, eins noch: Ihr nutzt dieses Script auf eigene Gefahr!

In diesem Sinne, hat Spaß gemacht!

Tommes
 
Zuletzt bearbeitet:

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
@raymond und @reiki

Es war mir eine Ehre!
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Hast du sehr gut gemacht.

Läuft alles super bei mir, auch per Aufgabenplaner.
Mit DSM 6 beta kann man nun auch im Aufgabenplaner Scripte beim hoch/runterfahren ausführen.
Habe beim runterfahren mal das search-rsync.sh eingestellt. Es wird dann das Script ausgeführt und danach geht die DS aus.
Klappte bei mir selbst mit mehreren/großen Dateien.



Allerdings muss beim search-rsync.sh Script noch ein sh vor jedem Befehl, sonst wird das rsync.sh Script nicht ausgeführt.

# Durchsuche volumeUSB1
if find /volumeUSB1/usbshare/rsync.sh; then
sh /volumeUSB1/usbshare/rsync.sh
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
Ah, Shit! Jetzt kann ich den Beitrag nicht mehr editieren... na, egal!

Komisch ist nur, das das search-rsync.sh bei mir eigentlich die ganze Zeit funktinoniert hat, auch ohne vorgestelltem sh. Linux ist manchmal seltsam.

Ja, das man Scripte beim hoch- und runterfahren ausführen kann ist mir auch schon aufgefallen und ich hab den Wunsch damals schon Synology gegenüber geäußert. Ob es deshalb implementiert wurde vermag ich jedoch nicht zu beurteilen. Es ist jedenfalls schön, das es jetzt da ist.

Tommes
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
Es gibt keinen Grund find zu verwenden, die Shell kann das schon selber.

Rich (BBCode):
if [ -x /volumeUSB1/usbshare/rsync.sh ]
then
   /volumeUSB1/usbshare/rsync.sh
fi
Neben -x gibt es auch noch diverse weitere: http://www.tldp.org/LDP/abs/html/fto.html. Die Datei muss dafür ausführbar sein (chmod +x ...). Alternativ -f, dann muss aber wie von PsychoHH beschrieben das sh mit rein.

Und hier sollte ein Anhängen erfolgen, für den Fall, dass es mal zwei Läufe an einem Tag gibt.
Rich (BBCode):
$ECHO "Sicherungsprotokoll vom `$TIMESTAMP` Uhr" > $LOG
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
Hallo Merthos

Ich danke dir für deine Tipps und Ratschläge und habe sie bereits umgesetzt. Jedoch habe ich mich für den Schalter -f und den Zusatz sh entschieden, damit unefahrene Benutzer sich nicht mit dem Rechtesystem (chmod...) auseinandersetzen müssen. Das ganze sieht bei mir jetzt so aus...

Code:
# 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

Ich habe das mit dem Anhängen weiterer Protokolle des selben Tages nur etwas anders gelöst. Und zwar habe ich einfach der Variabel $DATE noch die Uhrzeit %H%M mitgegeben, wodurch jetzt nach jedem Durchlauf ein eigenes Protokoll geschrieben wird was sich auch auf den Ordner /#Recycle auswirkt, da hier die Uhrzeit jetzt auch mitgegeben wird. Fand ich persönlich die elegantere Lösung, muß aber natürlich nicht jedem gefallen. Das sieht dann also so aus...

Code:
DATE="/bin/date +%Y-%m-%d_%H%M";
...
..
.
....... --backup-dir=@Recycle/`$DATE`)
..
.
LOG="$TARGET/@Logfiles/`$DATE`_Sicherungsprotokoll.log"

Darf ich dich als alter Hase, Profi und Vater von autorun mal nach deiner Meinung zu diesem Projekt hier fragen? Würde mich wirklich sehr interessieren. Gerne auch per PN!

Tommes
 

mehlbox

Benutzer
Mitglied seit
17. Nov 2015
Beiträge
119
Punkte für Reaktionen
0
Punkte
16
Gibt es eigentlich Interesse noch versioniertes Backup mit einzubauen? Ich könnte da ein paar Zeilen aus meinem persönlichen Script bereitstellen. Einbauen und testen überlasse ich euch.
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.885
Punkte für Reaktionen
1.171
Punkte
754
Es gibt ja diese Anleitung von silofonari zur Nutzung von rnapshot. Wenn Du einen anderen Ansatz verfolgst, wäre das sicherlich interessant. Aber vielleicht könntest Du dazu einen neuen Thread aufmachen.

Ansonsten auch mein Dank an Tommes!
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
Man könnte das Versionieren gerne als Option in diesem Script einbauen. Eigentlich sollte das ja über den entsprechenden rsync Schalter einfach umzusetzen sein. Du darfst hier natürlich auch gerne deine Codeschnipsel einbringen, oder sogar gleich das Script nach deinen Vorstellungen anpassen bzw. erweitern oder dein eigenes Script, wie dil88 bereits erwähnte, in einem eigenen Thread veröffentlichen. Ich kann kann dir nämlich grad nicht genau sagen, wann ich dazu komme, das mit der Versionierung umzusetzen...

@dil88
Ich habe zu danken. Schließlich hast du mir bei meiner ersten Kopfnuss geholfen, sodas ich dieses Projekt nicht gleich im Keim erstickt habe :D
 

mehlbox

Benutzer
Mitglied seit
17. Nov 2015
Beiträge
119
Punkte für Reaktionen
0
Punkte
16
bei rsnapshot haben mich die nichtsagenden Ordner daily48 oder so gestört.
Da habe ich mich selbst um eine Lösung bemüht.
rsnapshot basiert auf dem erstellen von Hardlinks statt einer vollständigen Kopie. Das machen meine scripte auch.
Im Endeffekt habe ich am Ende mehr erreicht wie rsnapshot in der Lage ist.
Aber erst mal von vorne. Hier mein Script auf das Wesentliche reduziert zum besseren Verständnis.
Dass alleine ist in der Lage versionierte Backups zu erstellen. (Hardlink basiert)
Rich (BBCode):
Source="/volume1/"
Target="/volumeUSB1/usbshare/"
Current="current/"

	#Backup
	rsync -av --delete --delete-excluded --exclude=@eaDir/ --exclude=#recycle/ $Source $Target$Current 2>&1 | tee -a $OP

	#Tagesabbild erstellen
	rsync -a --link-dest=$Target$Current $Target$Current $Target$(date +%Y-%m-%d_%a)/ 2>&1 | tee -a $OP

	
	# Alte Tagesabbild löschen
	Datum=$(date --date '90 days ago' +%Y-%m-%d_%a) # Funktioniert nicht bei jedem Linux!!!
		if [ ! -z $Datum ]; then # Abfrage ob Variable Datum leer ist. Würde dies der fall sein so würde das übergeordnete Verzeichnis gelöscht werden.
			if [ -d $Target$Datum ]; then
				echo "# altes Tagesabbild entfernen" 2>&1 | tee -a $OP
				rm -r $Target$Datum 2>&1 | tee -a $OP
			else
				echo "# keine altes Tagesabbild zum entfernen vorhanden" 2>&1 | tee -a $OP
			fi
		else
			echo "# Variable Datum ist leer. Nichts gelöscht." 2>&1 | tee -a $OP
		fi

Nachteil an jedem rsync Script ist dass rsync nicht erkennt wenn eine Datei oder ein Ordner nur umbenannt wurde. Das macht sich bei großen Dateien über USB bemerkbar... oder auch bei langsamen Internetverbindungen. Zudem wird unnötig Speicherplatz auf dem Backupmedium eingenommen da dort die selbe Datei mit unterschiedlichen Dateinamen liegt.
Auf der Suche nach eine Lösung bin ich über folgende Beitrag gestoßen: https://lincolnloop.com/blog/detecting-file-moves-renames-rsync/
Das auf meinen Anwendungsfall umgemünzt sieht dann wie folgt aus.

Rich (BBCode):
#!/opt/bin/bash
Source="/volume1/"
Target="/volumeUSB1/usbshare/USB_Backup/"
Current="current/"
Store="/volume1/scripts/backup/"
Double=".rsync_usbDrive.double"
includefile="/volume1/scripts/backup/settings/internal.include"
OP=$Store"logs/output_usbDrive-backup.txt"
LOCK=$Store"rsync_usbDrive.lockfile"

if [ -e $LOCK ]
then
	echo "# Starten des Scripts wird duch Lockfile blockiert" 2>&1 | tee -a $OP
	exit
else
	date 2>&1 | tee $OP
		echo "# Erstelle Lockfile" 2>&1 | tee -a $OP
		touch $LOCK 2>&1 | tee -a $OP
		echo "# sycnronisiere mit usbDrive" 2>&1 | tee -a $OP
		rsync -axXhHv --stats --no-inc-recursive --numeric-ids --delete --delete-after --delete-excluded --include=$Double --include-from=$includefile --exclude=@eaDir/ --exclude=#recycle/ --exclude=/* $Source $Target$Current 2>&1 | tee -a $OP
		status=$?
		if [ $status -eq 0 ]; then
			echo "# Schattenkopien lolal" 2>&1 | tee -a $OP
			rsync -a --delete 					--link-dest=$Source --include-from=$includefile --exclude=$Double --exclude=@eaDir/ --exclude=/* $Source $Source$Double 2>&1 | tee -a $OP
			echo "# Schattenkopien remote" 2>&1 | tee -a $OP
			rsync -a --delete 					--link-dest=$Target$Current --exclude=$Double --exclude=@eaDir/ --exclude=/* $Target$Current $Target$Current$Double    2>&1 | tee -a $OP
			echo "# Tagesabbild remote" 2>&1 | tee -a $OP
			rsync -a --delete --delete-excluded --link-dest=$Target$Current --exclude=$Double --exclude=@eaDir/ --exclude=/* $Target$Current $Target$(date +%Y-%m-%d)/ 2>&1 | tee -a $OP
		fi
		Datum=$(date --date='90 days ago' +%Y-%m-%d) # Funktioniert nicht immer.
		if [ ! -z $Datum ]; then # Abfrage ob Variable Datum leer ist. Würde dies der fall sein so würde das übergeordnete Verzeichnis gelöscht werden.
			if [ -d $Target$Datum ]; then
				echo "# altes Tagesabbild entfernen" 2>&1 | tee -a $OP
				#rm -r $Target$Datum 2>&1 | tee -a $OP
			else
				echo "# keine altes Tagesabbild zum entfernen vorhanden" 2>&1 | tee -a $OP
			fi
		else
			echo "# Variable Datum ist leer. Nichts gelöscht." 2>&1 | tee -a $OP
		fi
		rm $LOCK 2>&1 | tee -a $OP
		echo "# Lockfile entfernt" 2>&1 | tee -a $OP
fi
date 2>&1 | tee -a $OP
Das Prinzip dabei ist Folgendes. Nachdem beide Seiten vollständiges synchronisiert sind wird eine "Schattenkopie" auf beiden Seiten erstellt.
Rsync wird beim starten mit --no-inc-recursive angewiesen zuerst die ganze Verzeichnisstruktur zu übertragen bevor die eigentliche Übertragung beginnt. Mit der Option -H werden alle Hardlinks beibehalten.
Jetzt passiert folgendes. Eine umbenannte Datei ist immer noch mit dem Hardlink in der Schattenkopie verknüpft. Da die Schattenkopie auf beiden Seiten gleich sind wird auf dem Zielmedium zwar die Datei mit dem alten Dateinamen gelöscht, die neue Datei aber aus dem bestehenden Hardlink der Schattenkopie erstellt, somit nicht erneut übertragen.

Hab noch das Problem wenn z.B. ein Backup abgebrochen wurde, dass Schattenkopien erstellt werden die dann unterschiedlich sind da das Backup ja noch nicht fertig war. Das führt dazu dass die Erkennung nicht mehr funktioniert. Backups laufen dann auf herkömmliche weiße ab bis die Schattenkopien auf beiden Seiten identisch sind.
Mein Fehler liegt wohl irgendwo beim exit code. Hab mich aber nicht weiter darum gekümmert da es mich nicht weiter gestört hat.

Funktioniert nicht mit BTRFS da hardlinks nicht über die Grenzen von subvolume gehen können. Oder... Funktioniert nur innerhalb eines subvloume in BTRFS

Benutzung auf eigene Gefahr.!!!

Viel Spaß beim implementieren wenn denn gewünscht....
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.885
Punkte für Reaktionen
1.171
Punkte
754
Sehr cool, werde ich mir genau ansehen, wenn es die Zeit erlaubt! Vielen Dank dafür!
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.148
Punkte für Reaktionen
1.113
Punkte
314
Auch von mir erstmal ein dickes Dankeschön. Ich werd mir das mal zu Gemüte führen und schauen ob und inwieweit ich die Versionierung einbauen werde. In erster Linie geht es bei diesem Projekt ja um die Möglichkeit, dateibasierte Sicherungen unter DSM 6 anzulegen, daher würde ich eine Versionierung nur optional zur Auswahl einbinden wollen.

Mir stellt sich aber immer noch die Frage, wie und womit man so ein versioniertes Backup, welches mit Hardlinks arbeitet wiederherstellen kann. Das mag unter Linux vielleicht recht einfach umzusetzen sein (auch wenn ich nicht weiß wie), aber unter Windows scheind mir das dann bestimmt nicht mehr so einfach zu sein. Und dieses Projekt soll ja in erster Linie dazu dienen, das man auf seine Daten immer und überall, also Systemunabhängig zugreifen kann. Vielleicht kannst du mir hierzu noch etwas an die Hand geben...

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