Hallo (K)Ubuntu-Freunde,
vielleicht habt ihr euch auch schon öfter mit dem Problem herumschlagen müssen, dass ihr einen Berg von Daten sichern wolltet und diese jetzt irgendwie auf mehrere BackUp-Medien verteilen müsst...
Ich habe mir deswegen gestern mal einen Nachmittag Zeit genommen, ein automatisiertes Python-Skript für dieses Problem zu schreiben. Dieses Programm findet ihr im Anhang zur freien Verwendung. Ich freue mich über Kommentare/Wünsche/Anregungen, sobald ihr es ausprobiert habt.
ANMERKUNG: Weil die Dateiendung '.py' hier im Forum verboten ist, habe ich die Endung '.txt' angehängt. Entfernt diese zum Starten einfach.
Das Programm funktioniert folgendermaßen: - Ihr stellt anfangs im kommentierten Block ein, welches Verzeichnis ihr sichern wollt und an welchem Ort die BackUp-Container erstellt werden sollen. Dann wählt ihr noch die maximal erlaubte Größe eines Containers und ob ihr das Verzeichnis rekursiv (mit Unterverzeichnissen) sichern wollt und wie viele Ausgaben ihr sehen möchtet [zum Testen/Fehler suchen]. Anschließend überlegt ihr euch noch, ob ihr [z.B. bei besonders großen Datenmengen] die Dateien nicht kopieren, sondern stattdessen lieber verlinken wollt [Befehl 'ln- s' von den Containern aus auf die Daten]. - Das Programm startet ihr mittels 'python DataSplit.py'. Aufgrund der ersten Zeile ("SheBang") sollte auch die gewohnte Ausführung mittels './DataSplit.py' möglich sein. [Eventuell müsst ihr vorher das Programm noch ausführbar machen: 'sudo chmod +x DataSplit.py'.] - Das Programm liest anschließend alle Dateien im Verzeichnis [und eventuell den Unterverzeichnissen, wenn rekursiver Ablauf gewünscht] ein und merkt sich deren Dateigrößen. - Anschließend erstellt es eine sortierte Liste mit allen auftretenden Größen. - Wenn alle Dateigrößen bekannt sind, testet das Programm, ob einzelne Dateien vielleicht schon größer als die maximale Containergröße sind und eine Sicherung daher unmöglich wird. - Diese Liste geht es der Größe nach durch und verteilt die Dateien auf die Container. Werden dabei mehrere Dateien mit der gleichen Größe angetroffen, so wird die Liste mit den Dateigrößen aktualisiert [, da mehrere Dateien mit gleicher Größe nicht eindeutig über ein Dictionary in dieser Richtung angesprochen werden können]. [ANMERKUNG: Hier bestünde eventuell noch Optimierungsbedarf, wenn jemand eine bessere Lösung weiß, aber das Programm sortiert meine Eigenen Dateien mit knapp 60 GB in 21.000 Einzeldateien bereits in ca. 15 Sekunden, wobei das Einlesen mit 10 Sekunden den Löwenanteil des Programms ausmacht - daher sollte dieses "umständliche, aber sichere" Vorgehen wohl verschmerzbar sein! 😉 ] - Wenn alle Dateien der Liste abgearbeitet sind, habt ihr am BackUp-Ort mehrere Unterverzeichnisse, in denen die Daten möglichst platzsparend untergebracht sind.
Ich wünsche euch viel Spaß beim Ausprobieren und freue mich auf Rückmeldungen!
Mit freundlichen Grüßen, Markus Groß.
Hier noch einige Anmerkungen zum Programm, für alle, die es genauer wissen wollen:
Das Programm ist in Python und nicht in Bash geschrieben, weil: - es somit problemlos in Windows funktionieren sollte [im Programm findet ihr eine Anmerkung, welche Einstellung dort sicher nicht funktionieren werden], - Bash keine sinnvolle [mir bekannte] Möglichkeit bietet, eine eindeutige Zuordnung Dateiname ←> Dateigröße zu verwalten, - Python effektiv arbeitet, - und ich meine Python-Kenntnisse einfach gerne mal in die Praxis umsetzen wollte. 😉
Das Programm erstellt immer erst sämtliche Unterverzeichnisse und teilt Dateien danach einzeln auf die Container auf. Eventuell werden so mehrere Daten eines Verzeichnisses auf verschiedene Container verteilt und das Verzeichnis mitunter auch leer in einem Container erstellt. Das ist vielleicht nicht die optimale Vorgehensweise, aber definitiv die Platzsparendste. Wenn ihr die Dateien lieber am Stück Sichern wollt, könnt ihr diese immer noch vorher Packen und somit Verzeichnisweise sichern. Das wäre aber je nach Dateianzahl wohl recht Zeitaufwendig. Derzeit arbeite ich an einer Option, die Daten erst einzeln oder Verzeichnisweise zu packen und anschließend auf die Verzeichnisse zu verteilen.
Die Dateien kommen ungepackt in die Container, um eine direkte Rücksicherung zu erlauben. Wie gesagt arbeite ich zur Zeit noch an einer optionalen Komprimierungs-Option, um weiteren Platz zu sparen. Allerdings steigt damit das Risiko, dass einzelne Archive die maximale Containergröße überschreiten und das Programm dadurch fehlschlägt.
!!! WICHTIG: Alle Dateien im gewählten BackUp-Ziel werden derzeit gelöscht !!! Ihr solltet daher UNBEDINGT ein leeres Verzeichnis wählen !!!
Es ist leider [noch?] nicht möglich, mehrere Verzeichnisse gleichzeitig aufzuteilen. Diese "Manko" lässt sich aber durch einen einfachen "Trick" ganz leicht umgehen: Da mein Programm auch symbolische Links auf Verzeichnisse auflöst, könnt ihr einfach ein Verzeichnis erstellt, dass ihr sichern wollt und in diesem Links auf alle zu sichernden Unterverzeichnisse erstellen. Wenn ihr im Programm die Option 'BACKUP_RECURSIVELY=True' setzt, könnt ihr damit diese Einschränkung umgehen.
Die Verzeichnisse im BackUp-Container werden genauso gewählt wie im Verzeichnis mit den Daten, falls Unterverzeichnisse vorhanden sind [und diese gesichert werden sollen].
So, das waren vorerst alle Bemerkungen zu meinem Programm. Bei Wünschen, Fragen und gewünschten Zusatzoptionen einfach antworten.
Vielen Dank, Markus Groß.
Hallo (K)Ubuntu-Gemeinde,
wie versprochen gibt es hier als zweiten Teil meines Weihnachtsgeschenkes an euch das erweiterte Skript mit Packmöglichkeit. Ihr habt nun die Wahl, ob ihr die Dateien - direkt aufteilen wollt, - sie erst Datei-weise packen möchtet und anschließend sichern [aus welchen Gründen auch immer 😉], - oder erst sämtliche Daten Verzeichnisweise packen möchtet, bevor das Skript sich um die Aufteilung der Daten auf die Container kümmert.
Es wird in den letzten beiden Fällen erst geprüft, ob die gepackten Daten schon vorhanden sind (und vorher das Archiv gelöscht) und ob es eventuell weitere Archive gibt, die nicht zu einer Datei/Verzeichnis gehören. Es sollte somit jeder Fall berücksichtigt werden.
War gerade im Fall mit dem Verzeichnis-weise packen eine ziemlich Fummelei, daher der späte Beitrag. Ich hoffe ihr verzeiht, dass in letzterem Fall das Einlesen nicht hundertprozentig optimiert ist, aber für die Sicherheit, wirklich alle Daten zu sichern scheint mir das gewählte Vorgehen unumgänglich. Aber wie gesagt: Falls jemand Verbesserungsmöglichkeiten sieht, kann er diese gerne posten. Ich würde mich freuen.
Dann Frohe (Rest-)Weihnachten und einen guten Rutsch ins neue Jahr, euer QuantenPhysiker.