JanMalte
Anmeldungsdatum: 8. Oktober 2007
Beiträge: 291
|
Hallo zusammen, erstmal vorweg, das Skript ist super. Jetzt habe ich nur ein Problem festgestellt. Wenn das Skript zweimal am Tag laufen sollte, weil man manuell das Backup nochmal erneuern will, dann versucht er das aktuelle Backup mit sich selbst zu verlinken.
/usr/bin/rsync -e "" -av /tmp/remote-folder-malte/public_html/cms/ --delete --link-dest=/home/janmalte/Daten/Backup/Server/MalteGerth/FTP/100117/cms "/home/janmalte/Daten/Backup/Server/MalteGerth/FTP/100117/cms"
Wie kann ich jetzt in das Skript eine Abfrage machen, die, wenn das Backup für den aktuellen Tag schon vorhanden ist, das eins ältere Backup zum verlinken benutzt?
|
uname
Anmeldungsdatum: 28. März 2007
Beiträge: 6030
|
Solange das Backup beim ersten Mal am Tag korrekt durchgelaufen ist, ist es im Prinzip egal, ob man mit dem aktuellen Backup oder dem Backup vom Vortag vergleicht. Probleme treten auf, wenn das Backup abgebrochen wurde. Dann fehlen Dateien bzw. Hardlinks. Beim Kopieren würde auf eine falsche Version (die von heute) zugegriffen. Es müssten viele Daten neu kopiert werden. Das Backup wäre nicht mehr wirklich inkrementell. Für das Backupverfahren ist es aber egal. Alle Daten liegen korrekt vor. Nur die Datenmenge kann stark ansteigen, im schlimmsten Fall müssen alle Daten tatsächlich neu kopiert werden. Ich empfehle das Backup vollständig laufen zu lassen, dann ist es egal, wie oft es am Tag läuft. Sollte das Backup mal abgebrochen werden, so am besten den ganzen neuen Ordner einfach löschen und neu durchlaufen lassen.
|
dorwadt675
Anmeldungsdatum: 27. Januar 2008
Beiträge: 84
|
Ich habe neulich ein Backup abgebrochen, weil ich gemerkt habe, dass das Backup zu groß geworden wäre. Anschließend habe ich den Ordner des letzten Backups manuell gelöscht und einige Pfade aus Sources entfernt, damit das Backup zukünftig nicht so groß wird. Da das Backupprogramm allerdings mit Hardlinks etc. arbeitet und ich das letzte Backup manuell gelöscht habe, fürchte ich jetzt, dass es möglicherweise zu Schwierigkeiten kommt ? Wie funktioniert dass ganze eigentlich generell ?
Wird einfach der letzt vorhandene Ordner mit dem aktuellen Datenbestand verglichen oder lest das Skript nur die log Datei aus ? Hoffe ihr könnt mir helfen ?!
|
uname
Anmeldungsdatum: 28. März 2007
Beiträge: 6030
|
Da das Backupprogramm allerdings mit Hardlinks etc. arbeitet und ich das letzte Backup manuell gelöscht habe, fürchte ich jetzt, dass es möglicherweise zu Schwierigkeiten kommt ?
Da du das Backup von Hand gelöscht hast, kommt es gerade nicht zu Problemen. Du kannst beliebige Versionen löschen, ist dem Programm vollkommen egal. Nur wenn kein anderes Backup mehr auf die Daten verweist (z.B. tagesindivuelle Änderung), dann ist die Änderung eben weg.
Wie funktioniert dass ganze eigentlich generell ? Wird einfach der letzt vorhandene Ordner mit dem aktuellen Datenbestand verglichen oder lest das Skript nur die log Datei aus ?
Beim "Kopieren" per "rsync" wird geschaut, ob die Datei in der letzten Version (z.B. Vortag) noch identisch ist. Wenn ja, dann wird nur ein "Hardlink" auf die gemeinsame Datei gelegt. Ist es eine geänderte oder neue Datei, so ist sie für sich selbst erst mal einmal vorhanden. Bleibt die Datei gleich so zeigen zwei Dateien auf die selben Daten. Wird eine Datei gelöscht, so ist der Hardlink-Zähler immer noch größer als "0" und wird noch nicht gelöscht. Erst wenn der letzte Verweis verschwindet, wird die Datei wirklich gelöscht. http://de.wikipedia.org/wiki/Harter_Link
|
dorwadt675
Anmeldungsdatum: 27. Januar 2008
Beiträge: 84
|
uname schrieb: Da das Backupprogramm allerdings mit Hardlinks etc. arbeitet und ich das letzte Backup manuell gelöscht habe, fürchte ich jetzt, dass es möglicherweise zu Schwierigkeiten kommt ?
Da du das Backup von Hand gelöscht hast, kommt es gerade nicht zu Problemen. Du kannst beliebige Versionen löschen, ist dem Programm vollkommen egal. Nur wenn kein anderes Backup mehr auf die Daten verweist (z.B. tagesindivuelle Änderung), dann ist die Änderung eben weg.
Wie funktioniert dass ganze eigentlich generell ? Wird einfach der letzt vorhandene Ordner mit dem aktuellen Datenbestand verglichen oder lest das Skript nur die log Datei aus ?
Beim "Kopieren" per "rsync" wird geschaut, ob die Datei in der letzten Version (z.B. Vortag) noch identisch ist. Wenn ja, dann wird nur ein "Hardlink" auf die gemeinsame Datei gelegt. Ist es eine geänderte oder neue Datei, so ist sie für sich selbst erst mal einmal vorhanden. Bleibt die Datei gleich so zeigen zwei Dateien auf die selben Daten. Wird eine Datei gelöscht, so ist der Hardlink-Zähler immer noch größer als "0" und wird noch nicht gelöscht. Erst wenn der letzte Verweis verschwindet, wird die Datei wirklich gelöscht. http://de.wikipedia.org/wiki/Harter_Link
Vielen Dank für die Informationen.
Das Prinzip von hardlinks ist mir bekannt und das habe ich auch verstanden. Ich wollte nur sicher gehen, dass das Skript sich nicht auf Angaben in der Log Datei verlässt.
Denn das Skript lest ja unter anderem das Datum vom letzten Backup aus dem Log aus - oder täusche ich mich da ? Könnte ich das Logfile theoretisch einfach löschen oder verändern und dies hätte keine Auswirkungen auf das Skript ?
|
uname
Anmeldungsdatum: 28. März 2007
Beiträge: 6030
|
Denn das Skript lest ja unter anderem das Datum vom letzten Backup aus dem Log aus - oder täusche ich mich da ?
Da täuscht du dich. Das Datum wird wie folgt ermittelt:
LASTBACKUP=$(/bin/ls -d $TARGET[[:digit:]]* 2>> $LOGFILE | /usr/bin/sort -r | /usr/bin/head -1)
Es schaut im Verzeichnis $TARGET nach den Einträgen: ls -d /pfad/zum/ziel (ok muss aus Zahlen (digit) bestehen
und nimmt dort aufgrund der Sortierung (sort -r) den ersten (neusten) Eintrag (head -1) Der Eintrag für das Logfile ist nur dafür, damit wenn kein Verzeichnis vorhanden ist die Fehlermeldung nicht auf die Konsole, sondern ins Logfile geschrieben wird. Der Ordner wird trotzdem angelegt und dann gibt es beim ersten Backup eben kein Verweis auf ein altes Backup. Das Logfile ist unnötig, kannst es auch gleich nach /dev/null (Mülleimer ohne Boden) schreiben. Musst nur oben im Script das $LOGFILE auf "/dev/null" setzen.
|
dorwadt675
Anmeldungsdatum: 27. Januar 2008
Beiträge: 84
|
uname schrieb: Denn das Skript lest ja unter anderem das Datum vom letzten Backup aus dem Log aus - oder täusche ich mich da ?
Da täuscht du dich. Das Datum wird wie folgt ermittelt:
LASTBACKUP=$(/bin/ls -d $TARGET[[:digit:]]* 2>> $LOGFILE | /usr/bin/sort -r | /usr/bin/head -1)
Es schaut im Verzeichnis $TARGET nach den Einträgen: ls -d /pfad/zum/ziel (ok muss aus Zahlen (digit) bestehen
und nimmt dort aufgrund der Sortierung (sort -r) den ersten (neusten) Eintrag (head -1) Der Eintrag für das Logfile ist nur dafür, damit wenn kein Verzeichnis vorhanden ist die Fehlermeldung nicht auf die Konsole, sondern ins Logfile geschrieben wird. Der Ordner wird trotzdem angelegt und dann gibt es beim ersten Backup eben kein Verweis auf ein altes Backup. Das Logfile ist unnötig, kannst es auch gleich nach /dev/null (Mülleimer ohne Boden) schreiben. Musst nur oben im Script das $LOGFILE auf "/dev/null" setzen.
Stimmt, vielen Dank !
Ist wirklich ein tolles Skript !
|
rudi86
Anmeldungsdatum: 1. März 2010
Beiträge: 4
|
Hallo Leute, ich benutze das Skript um bei jedem Herunterfahren ein Backup auf eine externe HDD zu machen. Dies funktioniert auch alles so weit ganz gut, bis auf die Überprüfung auf den "Mountpoint". Bei:
MOUNTPOINT="/media/Backup"
schreibt es, bei nicht vorhandener ext. Festplatte, das Backup auf die root-Partition nach /media/Backup. Und Bei:
MOUNTPOINT="/media/Backup/"
schreibt es gar kein Backup, auch wenn die Festplatte eingebunden ist. Hier mal noch alle Variablen:
SOURCES="/root/ /etc/ /home/ /boot/"
TARGET="/media/Backup/"
MOUNTPOINT="/media/Backup"
LOGFILE="/root/backup.log"
EXPIREDAYS=0
RSYNC="--delete Ich habe schon Stunden im Forum und im Internet gesucht, aber keine Lösung gefunden und selber habe ich (noch) nicht viel Ahnung von Skripten. Ich hoffe mir kann jemand helfen. Gruß Rudi
|
freebirth_one
Anmeldungsdatum: 19. Juli 2007
Beiträge: 5051
|
Msl ne Frage zu ntfs-3g: im Artikel steht, dass damit kein inkrementelles Backup mögkich ist, da keine Hardlinks davon unterstützt werden. Gilt das noch? insbesondere, da:
Bin mir nicht ganz sicher, ob und wie man das dann jetzt ändern sollte
|
freebirth_one
Anmeldungsdatum: 19. Juli 2007
Beiträge: 5051
|
@rudi86: Mache für diese Frage am besten einen eigenen Thread auf; Programme bedeinen würde sich da anbieten ☺
|
rudi86
Anmeldungsdatum: 1. März 2010
Beiträge: 4
|
Danke, habe ich gemacht –> Problem mit rsync-Backupskript freebirth one schrieb: @rudi86: Mache für diese Frage am besten einen eigenen Thread auf; Programme bedeinen würde sich da anbieten ☺
|
bloch
Anmeldungsdatum: 16. Oktober 2007
Beiträge: 55
|
Hallo, ich habe - bevor ich das Skript entdeckt habe (wirklich super! Danke!) - manuell mit rsync meine Backups gemacht. Dabei habe ich die Zusätze -avp aktiviert (siehe http://wiki.ubuntuusers.de/rsync#Optionen). Jetzt habe ich versucht, dass auch in das Skript einzutragen: RSYNC="-avp --exclude=/home/bsp/ordner1 /home/bsp/ordner2 /home/bsp/ordner3" Leider sehe ich während das Skript läuft den Effekt der Option -v nicht. Das wäre allerdings sehr praktisch, da man so abschätzen kann, wie lange das Skript noch läuft, bei welcher Datei es gerade ist, etc. Ist es irgendwie möglich diese Option zu integrieren? Das Eintragen von -a ist wahrscheinlich überflüssig, oder? Danke! bloch
|
primus_pilus
Ehemalige
Anmeldungsdatum: 8. Oktober 2007
Beiträge: 9144
|
bloch schrieb: Leider sehe ich während das Skript läuft den Effekt der Option -v nicht.
Dann schau mal in das Logfile.
Das Eintragen von -a ist wahrscheinlich überflüssig, oder?
-a wird doch standardmäßig verwendet. Grüße Thomas
|
moonloop
Anmeldungsdatum: 23. November 2005
Beiträge: 36
|
Besteht Bedarf an einer E-Mail Benachrichtigung?
MAILREC="root@system"
...
if [ -n "$MAILREC" ];then
/bin/echo -e 'Backup is finished.\n'$(/bin/date) | /usr/bin/mutt -s "Backup" -a $LOGFILE -- $MAILREC
/bin/rm $LOGFILE
fi
Dafür müsste man mutt installiert haben. Ansonsten sichere ich noch ein Liste der installierten Pakete:
PACKAGES="/tmp/packages.list"
...
if [ -n "$PACKAGES" ]; then
echo "dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > $PACKAGES " >> $LOGFILE 2>> $LOGFILE
`dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > $PACKAGES 2>> $LOGFILE`
echo "/bin/mv $PACKAGES $TARGET$TODAY" >> $LOGFILE 2>> $LOGFILE
`/bin/mv $PACKAGES $TARGET$TODAY 2>> $LOGFILE`
fi Und zuletzt: eine Kopie des Logfiles in den jeweiligen Backupordner schadet doch auch nicht.
/bin/cp $LOGFILE $TARGET$TODAY Wollte mal nachfragen, ob für die Vorschläge Interesse vorhanden ist. Gruß, Moonloop
|
uname
Anmeldungsdatum: 28. März 2007
Beiträge: 6030
|
Die Ausgaben werden wie oben schon geschrieben in das Logfile geschrieben, welches man entsprechend im Script angibt. Die Parameter an der von dir genannten Stelle einzutragen ist falsch und vor allem unnötig. die Protokollierung im Logfile finde ich praktisch, da mich eigentlich nicht interessiert, was das Programm gerade backupt. Wenn man wissen will was passiert, so kann man ja nebenbei: sudo tail -f /root/backup.log
laufen lassen. Die weiteren Ideen sind nicht schlecht. Könnte man vielleicht im Wiki optional aufnehmen. Vielleicht ganz unten als Zusatzinformation einbauen.
|