Hier ist mein Problem: Ich muss große Dateien (normalerweise jeweils 30 bis 40 GB) archivieren, um Dateien zu tarieren (bis zu 60 TB). Ich möchte vor der Archivierung Prüfsummen (md5, sha1, was auch immer) dieser Dateien erstellen. Es ist jedoch mehr oder weniger notwendig, nicht jede Datei zweimal zu lesen (einmal für die Prüfsumme, zweimal für das Tarieren), um eine sehr hohe Archivierungsleistung zu erzielen (LTO-4 möchte, dass 120 MB / s erhalten bleiben, und das Backup-Fenster ist begrenzt).
Ich brauche also eine Möglichkeit, um eine Datei zu lesen, ein Prüfsummen-Tool auf der einen Seite einzuspeisen und einen Teer auf der anderen Seite zu erstellen.
tar cf - files | tee tarfile.tar | md5sum -
Abgesehen davon, dass ich nicht die Prüfsumme des gesamten Archivs (dieser Beispiel-Shell-Code macht genau das), sondern eine Prüfsumme für jede einzelne Datei im Archiv haben möchte.
Ich habe GNU Teer, Pax, Star Optionen studiert. Ich habe mir die Quelle von Archive :: Tar angesehen . Ich sehe keinen offensichtlichen Weg, um dies zu erreichen. Es sieht so aus, als müsste ich etwas in C oder ähnlichem von Hand bauen, um das zu erreichen, was ich brauche. Perl / Python / etc bringt es einfach nicht auf den Punkt, und die verschiedenen tar-Programme vermissen die notwendige "Plugin-Architektur". Kennt jemand eine bestehende Lösung für dieses Problem, bevor ich mit der Code-Umstellung beginne?
tar
7z
Ihnen können die Hash wählen und sie in einer Weise gedruckt , dasssha1sum
undsha256sum
verstehen können: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (und sami-lehtinen.net/blog/... ) Probieren Sie es aus:7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum
(getestet mit p7zip Version 15.09 Beta)Antworten:
Bevor Sie fortfahren und tar neu schreiben, sollten Sie die schnelle und einfache Methode zum zweimaligen Lesen der Daten kennenlernen, da sie möglicherweise nicht viel langsamer ist als in einem Durchgang.
Die Two-Pass-Methode ist hier implementiert:
http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/
mit dem Einzeiler:
Während es stimmt, dass md5sum jede Datei parallel mit tar von der Festplatte liest, anstatt die Daten durch die Pipe zu streamen, sollte das Zwischenspeichern der Linux-Festplatte diesen zweiten Lesevorgang zu einem einfachen Lesevorgang aus einem Speicherpuffer machen, der eigentlich nicht langsamer sein sollte als ein stdin gelesen. Sie müssen nur sicherstellen, dass Sie genug Speicherplatz in Ihrem Festplatten-Cache haben, um genug von jeder Datei zu speichern, die der 2. Reader immer aus dem Cache liest und nicht weit genug hinterher kommt, um von der Festplatte abrufen zu müssen
quelle
Hier ist ein Beispiel für ein Python-Skript. Es berechnet die Prüfsumme der Datei, wenn diese dem Archiv hinzugefügt wird. Am Ende des Skripts wird die Prüfsummendatei zum Archiv hinzugefügt.
Verwenden Sie beim Entpacken die Datei chksum_file, um die Prüfsumme zu überprüfen
quelle
Ich denke, dass Ihr Problem ein Design-Problem von tar ist, da tar keinen wahlfreien Zugriff / keine zufällige Positionierung innerhalb der Archivdatei über eine Inhaltstabelle erlaubt, daher werden alle Protokolle datei- und nicht pufferbasiert sein.
Sie können sich also verschiedene Formate wie PAX oder DAR ansehen, die den wahlfreien Zugriff ermöglichen.
quelle
Aktuelle Archivformate enthalten im Allgemeinen einige Hashes zur Dateiverifizierung, haben jedoch ein ähnliches Problem: Sie können nicht immer Ihre eigene Hashing-Funktion auswählen und auch keine lokale Kopie der Hashes aufbewahren.
Möglicherweise möchten Sie eine lokale Kopie der Hashes speichern, die sich von der im Archiv selbst enthaltenen unterscheidet. Dies kann beispielsweise der Fall sein, wenn das Archiv offline gespeichert ist (auf Bändern oder in einem Datenzentrum, dessen Lesen teuer ist), und Sie möchten Folgendes überprüfen: a lokale Kopie einer Datei / eines Verzeichnisses.
7zip hat verschiedene Optionen, wie zum Beispiel
7z h
mit benutzerdefiniertem Hash und7z l -slt
um alle Hashes aufzulisten und was nicht, aber was ist, wenn Sie eine Liste von md5- oder sha1-Hashes wollen? Sie können verwenden-bb
und-bs
Steuer Ausführlichkeit und die George Notaras Methode in der akzeptierte Antwort erwähnt verwendet werden können :quelle