ubuntuusers.de

Skripte/Backup_mit_RSYNC

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels Skripte/Backup_mit_RSYNC.

JanMalte

Avatar von JanMalte

Anmeldungsdatum:
8. Oktober 2007

Beiträge: 291

Wohnort: Schwetzingen

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

Wohnort: 127.0.0.1

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

Wohnort: 127.0.0.1

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

Wohnort: 127.0.0.1

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: Zähle...

Wohnort: Augsburg

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

Avatar von freebirth_one

Anmeldungsdatum:
19. Juli 2007

Beiträge: 5051

Wohnort: Mönchengladbach

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

Avatar von freebirth_one

Anmeldungsdatum:
19. Juli 2007

Beiträge: 5051

Wohnort: Mönchengladbach

@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

Wohnort: Augsburg

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 Team-Icon

Ehemalige
Avatar von primus_pilus

Anmeldungsdatum:
8. Oktober 2007

Beiträge: 9144

Wohnort: NRW

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

Avatar von 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

Wohnort: 127.0.0.1

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.