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.

kaputtnik

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9245

uname schrieb:

Eigentlich hatte ich gar keine großen Änderungen am Text selbst vorgenommen. Vielleicht kannst du oder jemand anderes die Formatierungen vornehmen.

Heinrich_Schwietering ist schon mal drüber gegangen... und ich jetzt auch noch mal 😉

Gruß
kaputtnik

Wolfgang.Klein

Anmeldungsdatum:
25. Juni 2007

Beiträge: 750

Hallo,

ich habe meine Version des Skripts noch mal überarbeitet, weil rsync Probleme macht, wenn ein zu sicherndes Verzeichnis Leerzeichen enthält. Anbei die neue Version von mir.

Die Funktionsweise ist ansonsten gleich geblieben: Tante Ruth kann dieses Skript täglich laufen lassen, und alle Benutzer, die etwas zu sichern haben, in die Variable BENUTZER eintragen. Dann kann jede(r) Benutzer(in) im eigenen Heimatverzeichnis eine Datei namens ".backup-list" anlegen, mit einem Verzeichnis oder einer Datei pro Zeile. Platzhalter sind erlaubt, also z.B.

.thunderbird
.fetchmailrc
.gnome*
.kde*
.openoffice.org*
Dokumente 
Desktop 
OpenOffice
Meine*

Alles, was darin erwähnt wird, wird dann von dem Skrip berücksichtigt, und root ist der einzige Benutzer, der Verweise auf Verzeichnisse außerhalb des eigenen Heimatverzeichnisses benutzen darf. Zeilen wie

/etc
/boot
/usr/local/bin
/usr/local/sbin

funktionieren also nur für root.

Nochmal danke an Uname für die Vorlage! ☺

backup-home.sh (2.6 KiB)
Download backup-home.sh

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Ich habe einen kleinen Fehler korrigiert. Wenn man die Paketlisten sichern wollte (Option PACKAGES) so wurden diese per E-Mail zugestellt (Option MAILREC). Wenn man einen lokalen Benutzer (@localhost) genutzt hat, so wurden diese nicht wirklich extern gesichert, es sei denn man hat den Mailordner (z.B. /var/mail) auch gesichert.

Die neue Version schreibt erst (falls PACKAGES gesetzt) die Paketliste in die Logdatei. Wenn der Ordner (z.B. /root) anschließend gesichert wird, so ist die Paketliste in der Sicherung bereits vorhanden. Nachteil ist vielleicht, dass nun in der E-Mail erst die Paketliste und dann die eigentlichen Synchronisationen vorkommen, ist mir aber persönlich egal. Natürlich kann man das auch in zwei Dateien schreiben. Ziel des Scriptes soll jedoch sein, dass es einfach ist. Durch die Änderung ist es im übrigen auch etwas kürzer geworden.

Skripte/Backup mit RSYNC

Daidalos27

Anmeldungsdatum:
3. Januar 2011

Beiträge: Zähle...

Hallo,

zuerst möchte ich euch, für das hervoragende Skript danken, dass es einem auch als relativ ungeübten Ubuntuanwender ermöglicht, ein versioniertes Backup zu erstellen.

Ich habe lediglich ein Problem. Ordner, die aktuell angelegt bzw. verwendet werden: Quelle: /media/share/ Ziel: /media/usb1/rsync/share/ Ordner mit Backup: /media/usb1/rsync/share/110104/media/share/backupordner gewünschter Ordner mit Backup: /media/usb1/rsync/share/110104/backupordner

Wie kann ich es einrichten, dass Rsync nur die relativen Pfade ab dem Quellornder kopiert und nicht die gesammte Ordnerstruktur abbildet?

Ich möchte die Ordner für verschiedene Personen mit unterschiedlichen Berechtigungen für einzelne Freigaben mittels Samba freigeben und deshalb ist es mir wichtig, erst die Unterteilung in Shares und dann das Datum zu haben. Ich würde dann einfach pro Share jeweils ein Skript laufen lassen.

Anbei mein Skript.

Freundliche Grüße

backup-server.sh (2.5 KiB)
Download backup-server.sh

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Entscheidend sind die rsync-Einträge:

$RSYNC -e "$S" -avR $FROMSSH:$SOURCE $RSYNCCONF $TARGET$TODAY $INC >> $LOG 2>> $LOG

Im Prinzip musst du nur das "R" bei allen rsync-Befehlen entfernen und das "$TODAY" auf "$TODAY$SOURCE" verlängern. Leider läuft das Programm dann nicht mehr, da fehlende Ordnerstrukturen nicht automatisch angelegt werden. Das geht soweit ich weiß dann nur mit "mkdir". Schau dir mal die uralten Versionen des Backupscriptes an, wo "mkdir" noch vorkommt. So in der Art vielleicht.

Daidalos27

Anmeldungsdatum:
3. Januar 2011

Beiträge: 2

Ich danke Dir vielmals für den schnellen Hinweis. Nachdem ich den Parameter R aus den Aufrufen entfernt habe, wurden die Pfade im Datumsordner nur relativ von der Quelle abgebildet; alles wie gewünscht! Vielen Dank und Dir noch einen schönen Tag.

Soulboater

Anmeldungsdatum:
30. Dezember 2010

Beiträge: Zähle...

Handelt es sich wirklich um die Version vom 01.02.2010 ??? Oder vielleicht eher 01.02.2011 ? Ersteres wäre irgendwie nicht mit den Diskussionen zusammen zu bringen.

Die alte Version läuft bei mir zufriedenstellend. Einzig habe ich es bisher nicht hinbekommen einen Pfad, der Leerzeichen enthält, auszuschließen. Verschiedenste Kombinationen, die Leerzeichen zu escapen etc, haben leider nicht zum Erfolg geführt. Die Variante

RSYNC="--exclude=\"No Backup/\"

liefert im Logfile

/usr/bin/rsync -n -e "" -av /home/user/Desktop/Backup-Test/source/ --exclude="No Backup/" /home/user/Desktop/Backup-Test/target/110221/home/user/Desktop/Backup-Test/source/
...
rsync: change_dir "/home/user/Desktop/Backup-Test/No" failed: No such file or directory (2)

und das Verzeichnis "No Backup" wird trotzdem kopiert. (Meinen wahren Username habe nich natürlich hier überall durch 'user' ersetzt.)

Irgendwelche Hinweise, wie es funtionieren könnte? Oder wird die Variable im Skript irgendwo nicht ganz korrekt interpretiert? Eine gewisse Erfahrung im Umgang mit Skripten habe ich, aber an dieser Stelle würde ich mir im Wiki einen Hinweis zur korrekten Syntax wünschen.

Mit der neuen Skript-Version bekomme ich nur den Fehler

~/Desktop/Backup-Test$ ./backup-new.sh 
bash: ./backup-new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Auch hier habe ich leider keine Ahnung woran es liegen könnte. Das Skript in der getesteten Konfiguartion noch mal im Anhang. Vielleicht sollte man die neue Version auch wieder mit den Kommentaren aus der älteren Version versehen:

# sources and target MUST end WITH slash
...
# mountpoint must end WITHOUT slash
...
backup-new.sh (2.9 KiB)
Download backup-new.sh

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Handelt es sich wirklich um die Version vom 01.02.2010 ??? Oder vielleicht eher 01.02.2011 ? Ersteres wäre irgendwie nicht mit den Diskussionen zusammen zu bringen.

Natürlich von 2011. Habe ich geändert

1
bash: ./backup-new.sh: /bin/bash^M:

Oh, das ist scheinbar ein Problem mit der Textdatei. Bitte versuch es noch einmal.

Sebastian_S

Avatar von Sebastian_S

Anmeldungsdatum:
2. Mai 2006

Beiträge: 215

Wohnort: Oberursel

Hallo,

das Script bricht auch ab, wenn im Zielpfad ein Leerzeichen ist.

1
2
3
4
5
6
Fri Feb 25 17:40:54 CET 2011
/usr/bin/rsync -avR /home/me/ --delete --link-dest=../last /media/FREECOM HDD/backup/home/me_lucid/25
sending incremental file list
rsync: link_stat "/media/FREECOM" failed: No such file or directory (2)
rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32)
rsync: mkdir "/home/me/bin/backup-skript/HDD/backup/home/me_lucid/25" failed: No such file or directory (2)

Wie muss ich das Leerzeichen escapen?

Gruß, seb

Sebastian_S

Avatar von Sebastian_S

Anmeldungsdatum:
2. Mai 2006

Beiträge: 215

Wohnort: Oberursel

wäre es nicht hilfreich, das Script und ggf. README in ein git bzw. bzr repository zu schieben?

Vielleicht wurde das schon diskutiert, ich habe nicht alle Kommentare gelesen.

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Naja, so groß sind die Änderungen ja nun auch nicht und das Wiki hat ja auch eine Art Versionierung. Das mit den Leerzeichen weiß ich nicht. Pfade haben bei mir nie Leerzeichen. Da es jedoch eigentlich nur ein RSYNC-Befehl in einem Bash-Script ist würde ich mal in die Richtung suchen.

Soulboater

Anmeldungsdatum:
30. Dezember 2010

Beiträge: 2

Bezüglich des Posts http://forum.ubuntuusers.de/post/2790994/: Das Skript läuft nun durch.

Nun gibt es jedoch folgende Probleme mit dem Skript: Trotz Option

MONTHROTATE=0

(ich entscheide gerne selbst was wann gelöscht wird) wird bei mir ein Ordner "02" angelegt. (Da heute der 02.03. ist.) Also habe ich am 02.04. ein Problem.

Das Logfile heißt des weiteren genauso wie das Skript +".log" also z.B. "backup.sh.log" und wird nicht mehr mit in den Zielordner kopiert und somit beim nächsten Lauf des Skriptes überschrieben.

Zur Exclude-Option von Rsync: Verschiedene Varianten der Angabe funktionieren auf der Konsole einwandfrei.

rsync -avp --exclude="No Backup/" source/ target/

funktioniert genauso wie

rsync -avp --exclude='No Backup/' source/ target/

Im Skript jedoch weder noch. Ich habe desweiteren alle Varianten die unter http://samba.anu.edu.au/rsync/FAQ.html#9 aufgeführt sind erfolglos mit dem Skript getestet.

Datei, Ordner oder Muster auszuschließen, funktioniert im Skript bei mir einzig und allein, wenn man die Option "--exclude-from=full_absolute_path_to_file" verwendet und in der Datei pro Zeile die Dateien oder Ordner angibt.

Ich konnte in ein Zielpfad mit Leerzeichen rsyncen, z.B. "/home/user/Backup Ziel", wenn man in den Rsync-Befehlen

$TARGET

durch

"$TARGET"

ersetzt. Damit ist man das Problem für das Zielverzeichnis los. Analog sollte es für das Quellverzeichnis funktionieren. Edit: Dann muss man sich möglicherweise für die Angabe des Quellpfades etwas überlegen, falls man mehrere Verzeichnisse backupen möchte. /Edit

Das selbe Vorgehen für

$RSYNCCONF

hat mich allerdings nur genauso weit gebracht, wie das Verwenden der oben verlinkten Escape-Varianten. Der Befehl erscheint korrekt im Logfile, wird aber nicht korrekt ausgeführt und alle Dateien kopiert.

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Ich habe das Script aktualisiert. Nur bei

1
MONTHROTATE=1

sowie

1
PACKAGES=1

werden die Parameter nun wirklich genutzt. Das mit den Anführungszeichen für $RSYNCCONF konnte ich noch nicht realisieren, das Script läuft dann auf einen Fehler. Vielleicht kann ja sonst jemand das Problem mit den Leerzeichen in Pfaden sowohl bei $SOURCES, $TARGET als auch $RSYNCCONF lösen. Ich selbst nutze niemals Leerzeichen in Pfaden.

Für das Speichern des Logfiles könntest du den Namen um das Datum erweitern. Bei mehreren Backups pro Tag musst du noch die Uhrzeit hinten dranhängen (man date).

1
LOG=$0.$($DATE +%y%m%d).log  

Logfile wäre dann backup.110302.log. Gefällt mir jedoch nicht, da es sinnlosen Datenmüll produziert. Standardmäßig lass ich mir das Logfile per E-Mail schicken, so dass ich keine Sicherung brauche.

bauwan

Avatar von bauwan

Anmeldungsdatum:
6. Januar 2009

Beiträge: 241

Wohnort: Bielefeld

Hallo,

ganz herzlichen Dank erst einmal für die Erstsellung und Weiterentwicklung dieses Skriptes. Funktioniert jetzt wunderbar bei mir zu Hause. Ich hatte ein ähnliches Problem wie bereits hier erwähnt mit Verzeichnissen mit Leerzeichen. Dummerweise nennt Virtualbox zB seinen Ordner per Standard "Virtualbox VMs". Ich habe selbst keine Ahnung aber ein Freund hat für mich an dem Skript was verändert und nun kann ich Ordner mit Leerzeichen ausschließen. Ich habe das jetzt nur mit den einen Ordner (habe ihn zu Anschaulichkeit im Skript stehen gelassen) getestet und es läuft. Vielleicht kann ja jemand, der anders als ich Ahnung hat, das noch mal anschauen und evtl. in die Vorlage hier einbauen. Es muss irgendwas mit "Definition der Optionen als String ersetzt durch ein Array" verändert worden sein, was mir ungefähr so viel sagt wie Kants ursprüngliche synthetische Einheit der Apperzeption... 😉.

Grüße, Timo

backup_bauwan.sh (2.9 KiB)
Backup Skript Ordner mit Leerzeichen
Download backup_bauwan.sh

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

Wollte nur kurz mitteilen, dass ich das Skript mal ein wenig überarbeitet habe. Nun kann man sowohl in SOURCES, TARGET als auch RSYNCCONF Pfade mit Leerzeichen angeben. Auch muss man TARGET nicht mehr mit einem Slash abschließen.