rsync-Skript verstehen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
sergej2018
Beiträge: 90
Registriert: 19.09.2017 21:35:18

rsync-Skript verstehen

Beitrag von sergej2018 » 27.06.2018 08:09:34

Hallo zusammen,

habe hier von meinem Vorgänger ein rsync-Skript geerbt, das ich noch nicht verstehe.

Code: Alles auswählen

rsync -e ssh --delete --stats --no-human-readable --numeric-ids -avH -A --exclude-from=/exclude --sparse --partial-dir=/backup/.rsync-partial --link-dest=/backup/$DATUM FILESERVER:/ /backup/partial/
Wobei /backup eine Partition auf dem lokalen Server ist, der einen entfernten Server FILESERVER sichert.
Soweit ich es verstanden habe, sollte in /backup/$DATUM jeweils eine komplette Sicherung des jeweiligen Datums liegen... diese Verzeichnisse sind jedoch stets komplett leer, während die Daten richtigerweise nach /backup/partial gesichert werden.
Was läuft hier schief?

uname
Beiträge: 9542
Registriert: 03.06.2008 09:33:02

Re: rsync-Skript verstehen

Beitrag von uname » 27.06.2018 08:42:52

Der Eintrag "--link-dest=/backup/$DATUM" ist dafür gedacht, dass statt vollständiger Backups nur inkrementelle Backups durchgeführt werden. Hierbei schaut "rsync" beim Kopieren von Dateien, ob diese in der identischen Dateistruktur von "link-dest" schon unverändert existieren. Ist es der Fall wird anstatt der Kopie nur ein Hardlink auf die alte bzw. alle alten Sicherungen gesetzt (identische Inodes und Anzahl Hardlinks siehe Befehl "stat"). Insgesamt erscheint mir das alles ziemlich komisch. Sinn macht das nur, wenn /backup/partial irgendwann nach den Backup nach /backup/$DATUMNEU kopiert wird, welches dann bei der nächsten Generation als "link-dest" gesetzt wird.

Schau dir dieses Script an, welches ich vor einiger Zeit mit "link-dest" programmiert habe:
https://wiki.ubuntuusers.de/Skripte/Backup_mit_RSYNC/

sergej2018
Beiträge: 90
Registriert: 19.09.2017 21:35:18

Re: rsync-Skript verstehen

Beitrag von sergej2018 » 27.06.2018 08:56:48

Danke für deine fixe Antwort, das ergibt Sinn!
Dann ist das Skript vmtl. einfach unfertig...

Heißt: Ich lasse das Backup laufen, verschiebe den Inhalt von partial nach $DATUMNEU und $DATUMNEU wird im nächsten Backup-Durchlauf dann als --link-dest gesetzt?

uname
Beiträge: 9542
Registriert: 03.06.2008 09:33:02

Re: rsync-Skript verstehen

Beitrag von uname » 27.06.2018 09:58:37

Könnte sein. Am besten ein Backup machen und mal ausprobieren.

Du kannst nach den Backups für beliebige Dateien dir mal

Code: Alles auswählen

stat <filename>
anschauen.

Dort sollte bei unveränderten Dateien der Zähler für "Links" bei mehrfachen Durchläufen dann mehr als "1" stehen.

MSfree
Beiträge: 3554
Registriert: 25.09.2007 19:59:30

Re: rsync-Skript verstehen

Beitrag von MSfree » 27.06.2018 10:24:40

sergej2018 hat geschrieben: ↑ zum Beitrag ↑
27.06.2018 08:56:48
Dann ist das Skript vmtl. einfach unfertig...
Das ist mehr als unfertig, das ist eigentlich gar kein Skript sondern nur ein Aufrufbeispiel für rsync.

Der Aufruf verwendet z.B. die Umgebungsvariable $DATUM, die nirgends definiert ist. Das "Skript" sollte also irgendwo mal die Variable DATUM definieren, z.B. als

Code: Alles auswählen

DATUM = `date +%e-%m-%Y`
bevor rsync aufgerufen wird.

Benutzeravatar
Meillo
Moderator
Beiträge: 5093
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: rsync-Skript verstehen

Beitrag von Meillo » 27.06.2018 11:06:04

MSfree hat geschrieben: ↑ zum Beitrag ↑
27.06.2018 10:24:40
Der Aufruf verwendet z.B. die Umgebungsvariable $DATUM, die nirgends definiert ist. Das "Skript" sollte also irgendwo mal die Variable DATUM definieren, z.B. als

Code: Alles auswählen

DATUM = `date +%e-%m-%Y`
bevor rsync aufgerufen wird.
Uff, was ist denn das fuer ein Code-Vorschlag!? :roll:

Bitte so:

Code: Alles auswählen

DATUM=`date +%Y-%m-%d`
Gruende:

- In der Shell duerfen keine Leerzeichen um das Gleichheitszeichen sein
- `%e' ist space-padded, was zu Dateinamen mit fuehrendem Space fuehrt
- datumsbenannte Dateinamen sollte man stets hierarchisch absteigend (Jahr, Monat, Tag) bennennen, um eine sinnvolle Sortierung zu bekommen
- Datumsformate mit Minus als Stellentrenner sollten immer ISO 8601 (RFC 3339) sein, um nicht noch mehr Verwirrung in der Datumsformatshoelle zu schaffen
Use ed(1) once in a while!

sergej2018
Beiträge: 90
Registriert: 19.09.2017 21:35:18

Re: rsync-Skript verstehen

Beitrag von sergej2018 » 27.06.2018 11:55:04

Ja... natürlich geht das Skript noch ein wenig weiter, aber der für mich unverständliche Teil ist die rsync-Zeile.
Wie genau "DATUM" nun definiert ist, ist dafür ja erstmal egal...


Frage: Warum eigentlich mit Hardlinks arbeiten? Rsync arbeitet im Normallfall doch ohnehin inkrementell?
Wäre es da nicht sinnvoller, --delete mit --backup und --backup-dir zu kombinieren und die gelöschten/veränderten Dateien einfach in ein - z.B. auch wieder mit Datum versehenes - Verzeichnis kopieren zu lassen?

MSfree
Beiträge: 3554
Registriert: 25.09.2007 19:59:30

Re: rsync-Skript verstehen

Beitrag von MSfree » 27.06.2018 12:06:14

sergej2018 hat geschrieben: ↑ zum Beitrag ↑
27.06.2018 11:55:04
Frage: Warum eigentlich mit Hardlinks arbeiten? Rsync arbeitet im Normallfall doch ohnehin inkrementell?
Der Trick ist, daß du damit immer eine vollständige Kopie deines Datenbestandes hast.

Bei der ersten Sicherung wird selbstverständilich eine vollständige Kopie angefertigt. Die zweite Sicherung besteht dann aus Hardlinks der Dateien zur ersten Sicherung, ausser für die Dateien, die sich geändert haben, die werden echt kopiert.

Du kannst somit kontinuierlich inkrementelle Backups machen, behälts aber dennoch die vollständige Dateistruktur mit allen Unterverzeichnissen, ohne jeweils den kompletten Platz der vollständigen Kopie zu benötigen.

Falls du Apples Time Machine kennst, die funktioniert ganz ähnlich, hat aber mehr Eyecandy aussen rum.

sergej2018
Beiträge: 90
Registriert: 19.09.2017 21:35:18

Re: rsync-Skript verstehen

Beitrag von sergej2018 » 27.06.2018 12:28:05

Ah, das ergibt Sinn :-)
Aber dann wäre mein Ansatz von vorhin ja korrekt?

- komplette Sicherung erstellen ("partial")
- "partial" umbenennen in backup1
- beim nächsten Backup: --link-dest=backup1


Edit:
Wenn ich dann nach ner Weile ältere backups lösche funktioniert das trotzdem? Denn die Hardlinks müssten dann doch teilweise ins Leere zeigen?
Also ich könnte dennoch jederzeit ein Backup wiederherstellen, indem ich einfach "das letzte Datum" zurückkopiere?

Zusatzfrage: Wie bekomme ich denn in nem Skript jeweils das alte Datum raus?
Meine DATUMS-Variable sieht folgendermaßen aus:

DATUM=$(date +%Y-%m-%d_%H-%M)

uname
Beiträge: 9542
Registriert: 03.06.2008 09:33:02

Re: rsync-Skript verstehen

Beitrag von uname » 27.06.2018 13:32:06

Wenn ich dann nach ner Weile ältere backups lösche funktioniert das trotzdem?
ja
Also ich könnte dennoch jederzeit ein Backup wiederherstellen, indem ich einfach "das letzte Datum" zurückkopiere?
ja. Befindet sich Original und Backup auf derselben Partition ist jedoch rückwärts "rsync" mit "--link-dest" nicht nur schneller, sondern du sparst durch Hardlinks Speicherplatz.
Zusatzfrage: Wie bekomme ich denn in nem Skript jeweils das alte Datum raus?
Durch eine Sortierung und Auswahl der dann ersten oder letzten Version.
Ich habe mir mal mein damaliges Script angeschaut. Ich habe wohl nach dem Update einfach einen Link "last" gesetzt und den beim nächsten Durchlauf verwendet:

Code: Alles auswählen

$LN -nsf "$TARGET"$TODAY "$TARGET"$LAST  >> $LOG 2>&1 
Meine DATUMS-Variable sieht folgendermaßen aus:
DATUM=$(date +%Y-%m-%d_%H-%M)
Kannst ja mal schauen ob du mit "ls |head -n 1" oder "ls | tail -n 1" irgendwie an den Ordnernamen kommst. Darfst dann nur nicht andere Ordner dort ablegen, wobei sie nicht das Backup, sondern nur das inkrementelle Backup verhindern würden.

Am besten du schreibst dir nun dein eigenes Backup-Script.

MSfree
Beiträge: 3554
Registriert: 25.09.2007 19:59:30

Re: rsync-Skript verstehen

Beitrag von MSfree » 27.06.2018 13:50:14

sergej2018 hat geschrieben: ↑ zum Beitrag ↑
27.06.2018 12:28:05
Wenn ich dann nach ner Weile ältere backups lösche funktioniert das trotzdem?
Ja, das ist ebenfalls möglich. Sofern eine Datei mehrfach per Hardlink referenziert wird, wird nur die Referenz gelöscht. Erst, wenn eine Datei nur noch einmal referenziert wird, wird sie tatsächlich gelöscht.
Also ich könnte dennoch jederzeit ein Backup wiederherstellen, indem ich einfach "das letzte Datum" zurückkopiere?
Richtig.
Zusatzfrage: Wie bekomme ich denn in nem Skript jeweils das alte Datum raus?
Du könntest dir die Liste aller Verzeichnisse in deinem Backupordner nach Datum sortiert ausgeben und dann den letzten Eintrag aus der Liste nehmen.

Code: Alles auswählen

ls -rt /BackupOrdner
Gibt die Liste nach Zeit sortiert mit neuestem Eintrag zuletzt aus.
Mit

Code: Alles auswählen

ls -rt /BackupOrdner | tail -1
schneidet man den letzten Eintrag aus.

Man könnte also mit

Code: Alles auswählen

LETZTESBACKUP=`ls -rt /BackupOrdner | tail -1`
Und dann die Hardlinks auf $LETZTESBACKUP beziehen. Allerdings steckt dort nur der Name des letzten Verzeichniseintrags drin, nicht der komplette Pfad!

Ich baue zum Debuggen, bevor ich den "Ernstfall" ausprobiere, ganz gerne echo vor den eigentlichen Befehl in das Skript ein. Dann sehe ich nur den Befehl, der ausgeführt werden sollte in der Ausgabe statt gleich ein Terabyte großes Backup anzustossen. :wink:

Benutzeravatar
Tintom
Beiträge: 1464
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: rsync-Skript verstehen

Beitrag von Tintom » 28.06.2018 12:41:14

MSfree hat geschrieben: ↑ zum Beitrag ↑
27.06.2018 13:50:14
sergej2018 hat geschrieben: ↑ zum Beitrag ↑
27.06.2018 12:28:05
Wenn ich dann nach ner Weile ältere backups lösche funktioniert das trotzdem?
Ja, das ist ebenfalls möglich. Sofern eine Datei mehrfach per Hardlink referenziert wird, wird nur die Referenz gelöscht. Erst, wenn eine Datei nur noch einmal referenziert wird, wird sie tatsächlich gelöscht.
Zwischenfrage:
Angenommen folgendes Szenario besteht: sergej2018 führt jeden Tag mit dem o.g. rsync-Befehl die Sicherung durch.
Am 26.06. legt er die Datei example.log an. Am 28.06. löscht er die Datei versehentlich, hat aber das Backup vom 26.06. auch bereits gelöscht.
Nun spielt er das Backup vom 27.06. ein.
Ist die Datei example.log noch vorhanden? Der Hardlink zeigt ja in leere. Oder nicht?

Benutzeravatar
Meillo
Moderator
Beiträge: 5093
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: rsync-Skript verstehen

Beitrag von Meillo » 28.06.2018 13:00:57

Tintom hat geschrieben: ↑ zum Beitrag ↑
28.06.2018 12:41:14
Der Hardlink zeigt ja in leere. Oder nicht?
Hardlinks koennen nicht ins Leere zeigen. (Das geht nur bei Softlinks.)

Hardlinks sind zwei Verzeichniseintraege (Namen) fuer die gleiche Datei. Beim Loeschen in Unix werden stets nur Verzeichniseintraege aktiv geloescht. (Darum heisst der Systemcall fuer das Loeschen in Unix auch nicht `delete' oder so, sondern `unlink'.) Wenn der letzte Verzeichniseintrag einer Datei geloescht wird, werden auch die Datenbloecke der Datei automatisch (!) freigegeben. (Edit: Genauer gesagt, werden sie erst freigegeben, wenn die Datei auch nicht mehr geoeffnet ist.) Man muss hier die technischen Hintergruende verstehen.

Wenn also eine Datei in zwei Verzeichnissen auftaucht (Backup von vorgestern von gestern), und man loescht ein Verzeichnis (und damit den einen Link auf die Datei), dann existiert die Datei weiterhin, aber nur noch mit einem Namen an einer Stelle im Dateisystem.



Softlinks sind eine ganz andere Sache.


Edit: Man beachte, dass das Ueberschreiben oder sonstiges Aendern der Inhalte einer Datei alle ihre Hardlinks betrifft, denn die Daten sind nur einmal vorhanden. Ein altes Backup zu loeschen ist also fuer das neue Backup irrelevant, aber wenn man im alten Backup Daten veraendert, dann kann das das neue Backup veraendern.
Use ed(1) once in a while!

Benutzeravatar
Tintom
Beiträge: 1464
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: rsync-Skript verstehen

Beitrag von Tintom » 28.06.2018 13:08:36

Danke!

sergej2018
Beiträge: 90
Registriert: 19.09.2017 21:35:18

Re: rsync-Skript verstehen

Beitrag von sergej2018 » 29.06.2018 08:21:26

Guten Morgen zusammen,

ah, danke Tintom! Interessant war jetzt zu erfahren, dass man alte Backups dann besser nicht verändern sollte!
Habe es mit "last" nun hinbekommen, vielen Dank dafür!
Wenn ich das richtig sehe kann ich derart erstellte Backups dann doch wiederum mit rsync auch auf weitere Datenträger synchronisieren?
Teilweise funktioniert die Datenhaltung / das Backup bei uns hier stufenweise...

Antworten