Erstellen einer TAR-Datei mit eingeschlossenen Prüfsummen

16

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?

Wazoox
quelle
2
tar
1
Ihre Frage nicht, aber mit 7zIhnen können die Hash wählen und sie in einer Weise gedruckt , dass sha1sumund sha256sumverstehen 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)
Nemo

Antworten:

14

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:

  tar -cvpf mybackup.tar myfiles/| xargs -I '{}' sh -c "test -f '{}' && 
  md5sum '{}'" | tee mybackup.md5

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

bk.
quelle
2
Es funktioniert eigentlich ganz gut, es sieht begrenzt aus durch die CPU-Fähigkeit, md5 (~ 280MB / s auf einem Kern) zu zermahlen.
Wazoox
4

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.

import hashlib,os
import tarfile
def md5(filename):
    ''' function to get md5 of file '''
    d = hashlib.md5()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()

root="/home"
outtar=os.path.join(root,"path1","output.tar")
path = os.path.join(root,"path1")
chksum_file=os.path.join(root,"path","chksum.txt")
tar = tarfile.open(outtar, "w")
o_chksum=open(chksum_file,"w")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest="%s:%s"%(md5(filename) , filename)
        o_chksum.write(digest+"\n")
        tar.add(os.path.join(r,files))

tar.add(chksum_file)
tar.close()
o_chksum.close()

Verwenden Sie beim Entpacken die Datei chksum_file, um die Prüfsumme zu überprüfen

user37841
quelle
1
Ja, das ist so etwas, worüber ich nachgedacht habe, aber in der Regel laden solche Bibliotheken die Datei im RAM, bevor sie
bearbeitet werden
1

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.

weismat
quelle
1
Leider ist die Teerausgabe obligatorisch, da der Workflow darauf basiert.
Wazoox
0

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 hmit benutzerdefiniertem Hash und 7z l -sltum alle Hashes aufzulisten und was nicht, aber was ist, wenn Sie eine Liste von md5- oder sha1-Hashes wollen? Sie können verwenden -bbund-bs Steuer Ausführlichkeit und die George Notaras Methode in der akzeptierte Antwort erwähnt verwendet werden können :

7z a -bsp1 -bb3 dir.7z dir 2>&1 \
| grep "^+" | sed 's,^+ ,,g' | xargs -d "\n" -I § -P 1 sh -c "test -f '§' && sha1sum '§'" \
| tee dir.sha1
Nemo
quelle