[Projekt] rsync -Alternative dateibasierte Datensicherung

Status
Für weitere Antworten geschlossen.

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.240
Punkte für Reaktionen
1.180
Punkte
314
Aufgrund der mittlerweile sehr hohen Komplexität des Scripts werden selbst so banale Dinge wie ein einfaches Leerzeichen zu maskieren zur Mamut Aufgabe. Glaubt man, eine Lösung gefunden zu haben, tauchen gleich nebenan neue Probleme auf und alles geht von vorne los.

Wir tun aber unser Möglichstes das Problem in den Griff zu bekommen, aktuell können wir aber noch nichts versprechen. Wir müssen uns für jedes auftretende Problem auch erstmal das nötige Wissen aneignen um Lösungen finden zu können. Habt daher bitte ein wenig Nachsicht mit uns... und Geduld.

Tommes
 

AndiHeitzer

Benutzer
Sehr erfahren
Mitglied seit
30. Jun 2015
Beiträge
3.228
Punkte für Reaktionen
509
Punkte
174
Möchte echt zu gerne wissen was der Code dideldi, blah und fasel bewirkt :)

Automatisiertes, blödsinniges Geschwafel? :D ....... *duckundwech*

Ich finde es toll, die Arbeit hier mitverfolgen zu können.
Dieser Enthusiasmus wirkt fast schon ansteckend :eek:
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
1. Man sollte keine Leerzeichen am Ende haben .. kann ein großer Fehler sein.

Jetzt mal die Frage an die Profis.

Wie kriege ich es hin, beide Ordner zu testen, mit und ohne Leerzeichen?
Ich Speichere IFS und setze es zurück, so kann ich die ohne Leerzeichen abfragen.
Wie aber kann ich die mit Leerzeichen abfragen, findet wer den Fehler?



IFS=$'\n'
for SHARE in $SOURCES; do
SAVEIFS=$IFS
unset IFS
SOURCE="${SHARE#*/}"
SHARE_DECRYPT="${SOURCE%%/*}"
if [[ "$SHARE" = "${SHARE%[[:space:]]*}" ]];then
echo "$SHARE hat keine Leerzeichen" >> $LOG
else
echo "$SHARE hat Leerzeichen" >> $LOG
IFS=$SAVEIFS
echo
fi
if $SOURCE_TEST ! -d $SOURCE_PATH/"$SOURCE"; then
ERROR="1"
echo "ACHTUNG: Quellordner $SHARE nicht erreichbar..." >> $LOG
elif $SOURCE_TEST -d $SOURCE_PATH/"$SOURCE"; then
echo "Quellordner $SHARE erreichbar." >> $LOG
fi
done
 

AndiHeitzer

Benutzer
Sehr erfahren
Mitglied seit
30. Jun 2015
Beiträge
3.228
Punkte für Reaktionen
509
Punkte
174
Ohne nun Dein Script zu verstehen, weil da bin ich schlichtweg zu doof dazu ...
Ich würde die Länge des Strings nehmen und das letzte Zeichen gegen ein LEERZEICHEN prüfen?
Für Leerzeichen und/oder "White-Spaces" gibt es sicherlich Codierungen, die man nutzen kann?

[EDIT]
Wobei mir grade einfällt, dass ich manchmal auch anstelle der doppelten Gänsefüsschen (") gerne auch die einfachen Hochkommas (') nutze, wenn ich nicht gleich zum Ergebnis komme.
 
Zuletzt bearbeitet:

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.097
Punkte für Reaktionen
1.381
Punkte
804
Warum setzt Du IFS nicht einfach immer hart - also z.B. IFS=" ", um auf Leerzeichen zu testen? Funktioniert bei mir hier so.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Es geht ja eigentlich nicht darum am ende das Leerzeichen zu entfernen. Das habe ich nur als Ergänzung geschrieben zu welchen Problem es kommen kann. Da könnte man ja ganz einfach eine Meldung machen oder dies vorher entfernen.
' statt " bringt nichts habe ich alles schon durch.

dil88 das probiere ich morgen mal aus.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Warum setzt Du IFS nicht einfach immer hart - also z.B. IFS=" ", um auf Leerzeichen zu testen? Funktioniert bei mir hier so.


Das klappt bei mir auch nicht.
Hab jetzt sogar IFS komplett zwischengespeichert.


SOURCE_PATH="/volume*"

BACKIFS="$IFS"
IFS=$'\n'
for SHARE in $SOURCES; do
SAVEIFS=$IFS
IFS="$BACKIFS"
SOURCE="${SHARE#*/}"
SHARE_DECRYPT="${SOURCE%%/*}"
if [[ "$SHARE" = "${SHARE%[[:space:]]*}" ]];then
echo "$SHARE hat keine Leerzeichen" >> $LOG
else
echo "$SHARE hat Leerzeichen" >> $LOG
IFS="$SAFEIFS"
fi
if $SOURCE_TEST ! -d $SOURCE_PATH"$SHARE"; then
echo "ACHTUNG: Quellordner $SHARE nicht erreichbar..." >> $LOG
elif $SOURCE_TEST -d $SOURCE_PATH"$SHARE"; then
echo "Quellordner $SHARE erreichbar." >> $LOG
fi
done


Lokal klappt alles, aber nicht über SSH ..
Habe versucht $SHARE in "" oder '' zu packen aber es klappt nicht.
Woran kann es liegen?
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.401
Punkte für Reaktionen
1.213
Punkte
234
Warum setzt Du IFS nicht einfach immer hart - also z.B. IFS=" ", um auf Leerzeichen zu testen? Funktioniert bei mir hier so.

Entschuldigt, dass ich mich hier reinhänge. Aber ihr wollte doch gerade NICHT auf Leerzeichen testen, oder habe ich das falsch verstanden?
Ich konnte bei mir das Problem umgehen, in dem ich IFS einen Zeilenumbruch als Trenner gegeben habe.

IFS="
"
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.097
Punkte für Reaktionen
1.381
Punkte
804
Das wird jetzt auch schon über IFS=$'\n' getan. PsychoHH möchte in der Schleife aber gern auch nochmal prüfen, ob sich im Dateinamen noch Leerzeichen befinden.
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Das wird jetzt auch schon über IFS=$'\n' getan. PsychoHH möchte in der Schleife aber gern auch nochmal prüfen, ob sich im Dateinamen noch Leerzeichen befinden.

Jein ..

die echos sind erstmal nur für die Ausgabe um zu erkennen, ob die Leerzeichen erkannt werden.

Dann aber kommt eine Abfrage ob der Ordner existiert, bevor rsync ausgeführt wird und dies geht leider nicht über ssh durch, warum auch immer.


*

Habs geschafft, nun funktioniert der Befehl lokal und über ssh.

Wenn es fertig ist oder ich ein weiteres Problem habe, melde ich mich nochmal
 
Zuletzt bearbeitet:

PsychoHH

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


Bei einer lokalen Sicherung muss man die Quelle so angeben:

/NetBackup/Test 1234

Bei einer Netzwerksicherung aber so:

/NetBackup/Test\ 1234

also was machen?

Immer so angeben:
/NetBackup/Test\ 1234

und dann bei der lokalen Sicherung \ aus der Variable entfernen?

Wie kann ich einfach das Zeichen entfernen und die Variable ändern?

Geht das irgendwie so mit SOURCE="${sed 's/\//g}" ?

Brauche mal eure Hilfe :)
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.097
Punkte für Reaktionen
1.381
Punkte
804
Edit: Probiere es einmal mit

Rich (BBCode):
#!/bin/sh

SOURCES="/NetBackup/Test\ 1/Test\ 2"
echo $SOURCES
SOURCE=$(echo $SOURCES | sed -e 's/\\//g')
echo $SOURCE

Ersetzt auch mehrere Backslashes.

Alternativ der in meinen Augen intuitivere Ansatz, Leerzeichen in der Variablen für die Netzsicherung über ssh zu escapen:

Rich (BBCode):
#!/bin/sh

SOURCES="/NetBackup/Test 1/Test 2"
echo $SOURCES
SOURCE=$(echo $SOURCES | sed -e 's/ /\\ /g')
echo $SOURCE
 
Zuletzt bearbeitet:

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
So erstmal Ende Gelände..

716+ neugestartet und nun leuchtet sie nur noch blau.. trotz DSM 6 u4


ich könnte kotzen.

**

So 20 Min später ging sie doch mal wieder an .. wow was für ein Mist.



So wow, bitte was war das für eine Herausforderung !

mit IFS?$'\n' hatte ich so meine Probleme, denn dann gingen keine Variablen mehr die ein Leerzeichen hatten.
Ich musste somit viel Code "doppelt" haben. Einmal für lokale Abfragen und einmal für Abfragen über ssh.

Daher war der "vermeintliche" Tipp von geimist auch Gold Wert.

Ich konnte somit das ganze auf Zeilen beschränken und ich spare mir den "doppelten" Code.

Es ist jetzt eine Mischung aus ..

BACKIFS="$IFS"IFS="
"
for SHARE in $SOURCES; do
S...=$(echo $SHARE | sed -e 's/ /\\ /g')
IFS="$BACKIFS"



Bis jetzt ist mir noch kein großer Patzer aufgefallen und es läuft fromssh, tossh und lokal.
Mal schauen was Tommes noch so findet, wenn er das morgen testet, wenn er denn noch will :)

Leerzeichen müssen nicht mehr escape werden.

Die Quellen werden einfach so angegeben:

SOURCES="/BetaTest/Max Mustermann
/Hans Wurst"



Also sage ich schon mal vielen Dank
 
Zuletzt bearbeitet:

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Ich denke mal es wird bald schon ein größeres Update geben, liegt halt daran wie gut es mit den Testläufen klappt.

Was wird es vermutlich neues geben..

- Optional: WOL Script um automatisch den entfernten Server/DS bei Bedarf hochzufahren.
- Optional: Shutdown um automatisch den entfernten Server/DS nach dem erfolgreichen Backup herunterzufahren.
- Leerzeichen können nun in der Quelle und Ziel genutzt werden.
- USB/SATA Festplatte kann auf das interne Volume oder auf den entfernten Server/DS kopiert werden.


Ich bin schon dabei einige Fehler auszubessern, allerdings schaffen wir es einfach nicht jedes Szenario durchzutesten.
Es ist einfach zu viel. Man man mehrere Quell/Ziel Ordner auf verschiedene Plattformen nutzen.

Wenn also einer Lust hat einen Teil zu testen, kann er sich gerne melden und er bekommt das Script dann per eMail.

Am besten einfach kurz schreiben, welche Geräte man hat und was man testen kann, z.B. lokal oder Netzwerksicherung.


Danke :)
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.240
Punkte für Reaktionen
1.180
Punkte
314
... allerdings schaffen wir es einfach nicht jedes Szenario durchzutesten. Es ist einfach zu viel...

Wie heißt es immer so schön - man soll den Tag nicht vor dem Abend loben :D

Wir sind nämlich fertig. Alle Tests sind abgeschlossen, jegliches Szenario wurde durchgespielt, alle gefundenen Fehler wurden eleminiert. Natürlich solltet ihr - wie immer - erstmal mit unwichtigen Testdaten das System auf Herz und Nieren testen bevor ihr es produktiv einsetzt. Ich will auch garnicht viele Worte verlieren, außer das ich an dieser Stelle PsychoHH nochmal meine Hochachtung ausprechen möchte da alles, was in den letzten Wochen in dieses Script eingeflossen ist, aus seiner Feder stammt.


Hier also wie immer die...

Release Notes vom 10.05.2016
  • Es wurde eine neue Variable (MAC) geschaffen um entfernte Server per WOL zu starten.
  • Es wurde eine neue Variable (SLEEP) geschaffen um dem entfernten Server ein Zeitfenster zum starten zu geben.
  • Es wurde eine neue Variable (SHUTDOWN) geschaffen um entfernte Server auszuschalten.
  • Anhand der drei grade genannten Variablen können demnach entfernte Server per WOL geweckt, die eigentliche Datensicherung ausgeführt werden um im Anschluss den entfernten Server bei Bedarf wieder auszuschalten.
  • Es wurde eine neue Variable (FROMTHISDEVICE) geschaffen um Inhalte eines USB/SATA-Datenräger auf eine Diskstation oder einem entfernten, RSync-kompatiblen Server zu sichern.
  • Quellen und Ziel können ab sofort auch Leerzeichen enthalten.

Tommes & PsychoHH
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.240
Punkte für Reaktionen
1.180
Punkte
314
Noch etwas in eigener Sache.

Dieses Projekt begleitet mich jetzt bereits eine ganze Weile und ich habe verdammt viel Zeit, Arbeit und Herzblut darin investiert. Ich komme aber langsam an einen Punkt wo das Script anfängt, meine Kompetenzen zu übersteigen und es wird mit jeder Erweiterung und Verbesserung auch immer schwieriger für mich, mir das alles zu erarbeiten und umzusetzen. Am meisten fehlt mir jedoch die Zeit, dieses Projekt mit der Intensität fortzuführen wie ich es bisher getan habe. Wer hätte auch gedacht, das aus diesem Projekt mal so etwas großes wird? Daher würde ich gerne so langam mal einen Strich unter die Sache machen wollen. Klar bleib ich auch weiterhin für Probleme, Supportanfragen, Hilfestellungen und Bugfixes in diesem Projekt involviert. Ich bitte nur um euer Verständnis, wenn ich nicht immer gleich Antworte oder auch nicht auf jedes Problem gleich eine Lösung bieten kann. Ich brauch einfach mal eine Pause.

Tommes
 

elastico

Benutzer
Mitglied seit
31. Okt 2014
Beiträge
15
Punkte für Reaktionen
0
Punkte
0
Das Skript ließ sich wirklich supereinfach einrichten! DICKES LOB für diese Arbeit! Die Variablen im Code sind gut beschrieben und es war zumindest am Mac ein leichtes, den Code aufzubereiten (Ich habe TextMate benutzt, Copy-Paste von der Wiki-Seite um den Code in den Editor zu holen, E-Mail-Adresse und Sicherungsquelle eingetragen, über das Netzwerk auf die Synology gespeichert mit Extension .sh und dann eine Aufgabe auf der Synology angelegt mit Pfad zu diesem Skript)

Die erste Sicherung dauerte einige Stunden - logisch, wird ja alles kopiert.
Beim folgenden Backup ging das in Sekunden oder Minuten. Dank rsync :)

Ein Problem habe ich allerdings: Das Logfile wirft mir einen Fehler:

IO error encountered -- skipping file deletion

Number of files: 77520
Number of files transferred: 71
Total file size: 401.59G bytes
Total transferred file size: 33.72K bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 2.15M
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 2.17M
Total bytes received: 17.32K

sent 2.17M bytes received 17.32K bytes 18.14K bytes/sec
total size is 401.59G speedup is 183719.88

RSync Fehlermeldung (Exit Code): 23
------------------------------------------------------------------------------------------------
RSync-Datensicherung unvollstaendig oder fehlgeschlagen - Sicherungsziel: /volume1/Backups/rsyncTimeCapsule/RSync Backup
------------------------------------------------------------------------------------------------

HINWEIS: Daten aus dem Ordner /@Recycle, die mehr als 90 Tage alt waren, wurden geloescht.

HINWEIS: Daten aus dem Ordner /@Logfiles, die mehr als 60 Tage alt waren, wurden geloescht.

Was für ein Fehler kann das sein?

Ich habe in die SYNCOPT schon ein v voran oder auch mal hinten an gestellt, das Log-File hat sich aber nicht geändert?! (also "-ahRv" oder "-vahR" ändert nichts am Inhalt des Logfiles - was mich wundert - und ja, es ist wirklich genau das Skript, dass ich auch aufrufe, es gibt nur dieses eine auf der Synology in meinem Backup-Verzeichnis :))
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.240
Punkte für Reaktionen
1.180
Punkte
314
Hi!

Ich mach es mir mal grad einfach, denn der Exit Code 23 besagt *klick*

Ein weiterer Fehler könnte sein, das du das Script evtl. nicht im UTF-8 Format gespeichert hast.

Um das Logfile zu erweitern musst du einmal das v in SYNCOPT einfügen, also so wie du es bereits getan hast -avhR, dann musst du aber noch eine Zeile darunter den Wert für LOGSTAT leeren, also so LOGSTAT="", dann sollte es klappen.

Schau mal, ob dich das weiter bringt.

Tommes
 

elastico

Benutzer
Mitglied seit
31. Okt 2014
Beiträge
15
Punkte für Reaktionen
0
Punkte
0
Also 23 = Partial… ist soweit klar :) Irgendwas konnte er also nicht kopieren etc.

Ich habe nun mal folgendes gemacht:
- Das Skript manuell im Terminal gestartet und siehe da, die -v Option liefert eine Reihe von "file has vanished"-Meldungen… Nun, die sind ja nicht verschwunden, ich vermute, dass die Dateinamen nicht konform sind und er einfach nicht damit klar kommt. Ähnliche Probleme hatte mich Synologys eigener Versions-Backup-Lösung auch, weshalb ich einige Verzeichnisse aus dem Backup ausgeschlossen hatte… dürfte hier also ähnliche sein.

- Allerdings landeten diese Meldungen auf der Konsole und nicht im Log-File, trotz des ">> $LOG"

- wenn man das LOGSTAT leert (noch nicht ausprobiert), dürfte die Statistik am Ende fehlen, richtig?

Ich habe daher mal folgendes gebaut:
Statt ">> $LOG" mache ich jetzt ein "--log-file=$LOG" (diese Option soll es seit 2006 geben, dürfte also inzwischen bei jeder Synology enthalten sein)

Da ich im Grunde ein lokales Backup mache, ist nur der letzte Blog betroffen, der sieht jetzt so aus bei mir:
# RSync- Lokale Datensicherung auf Volume, USB- oder SATA-Datentr?ger
#-------------------------------------------------------------------------
elif [ -z "$SSH_TO" ] && [ -z "$SSH_FROM" ] && [ -n "$DESTINATION" ]; then
echo "$HR" >> $LOG
echo "Starte Datensicherung (lokal auf Volume): $REMOTEHOST$SHARE nach $DESTINATION" >> $LOG
echo "$HR" >> $LOG
if [ $SOURCEDS -eq 1 ] && [ $FROMTHISDEVICE -ne 1 ]; then
rsync $SYNCOPT /volume*"$SOURCE" $LOGSTAT --log-file=$LOG $EXCLUDE $RECYCLE "$DESTINATION"
RSYNC_EXIT="$?"
elif [ $SOURCEDS -ne 1 ] || [ $FROMTHISDEVICE -eq 1 ]; then
rsync $SYNCOPT "$SOURCE" $LOGSTAT --log-file=$LOG $EXCLUDE $RECYCLE "$DESTINATION"
RSYNC_EXIT="$?"
fi
fi
echo "" >> $LOG
if [ $RSYNC_EXIT -ne 0 ]; then
RSYNC_CODE="$RSYNC_EXIT"
fi
fi
(Geändert wurden nur die zwei rsync-Aufrufe - --log-file statt >> $LOG)

Nun landen alle Ausgaben im Logfile (und wenn man in den SYNCOPT ein v ergänzt, dann eben ggf. sehr viele Zeilen)
Die Statistik am Ende bleibt ebenfalls drin.

Ich gehe nun mal analysieren, welche Dateien er mir als "vanished" markiert hat und warum… und wie ich damit umgehe :) (ein Verzeichnis muss ich mit ins exclude aufnehmen, das ist mir schon klar… bei den anderen Dateien muss ich mal gucken, ob ich die umbenennen kann oder mit ins exclude-Verzeichnis verschiebe)
 
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 

 
 
  AdBlocker gefunden!

Du bist nicht hier, um Support für Adblocker zu erhalten. Dein Adblocker funktioniert bereits ;-)

Klar machen Adblocker einen guten Job, aber sie blockieren auch nützliche Funktionen.

Das Forum wird mit hohem technischen, zeitlichen und finanziellen Aufwand kostenfrei zur Verfügung gestellt. Wir zeigen keine offensive Werbung und bemühen uns um eine dezente Integration.

Bitte unterstütze dieses Forum, in dem du deinen Adblocker für diese Seite deaktivierst.

Du kannst uns auch über unseren Kaffeautomat einen Kaffe ausgeben oder ein PUR Abo abschließen und das Forum so werbefrei nutzen.

Vielen Dank für Deine Unterstützung!