web-dev-qa-db-fra.com

Création d'un fichier tar avec des checksums inclus

Voici mon problème: j'ai besoin d'archiver aux fichiers de gare (jusqu'à 60 To) de gros fichiers (généralement de 30 à 40 Go chacun). Je voudrais faire des checksums (MD5, SHA1, peu importe) de ces fichiers avant l'archivage; Toutefois non lisant chaque fichier deux fois (une fois pour la chute de contrôle, deux fois pour tart'ing) est plus ou moins nécessaire pour obtenir une performance d'archivage très élevée (LTO -4 veut 120 Mo/s maintenu et la fenêtre de sauvegarde est limitée).

J'ai donc besoin d'un moyen de lire un fichier, de nourrir un outil de checkinguming d'un côté et de construire un goudron sur l'autre côté, sur quoi:

tar cf - files | tee tarfile.tar | md5sum -

Sauf que je ne veux pas que la somme de contrôle de l'archive entière (cet exemple de code shell ne fait que cela), mais une somme de contrôle pour chaque fichier individuel dans l'archive.

J'ai étudié =GNU Tar, Pax, Star Options. J'ai examiné la source de Archive :: Tar . Je ne vois aucune façon évidente de y parvenir. On dirait que je vais devoir construire quelque chose en C dans C ou similaire pour atteindre ce dont j'ai besoin. Perl/Python/etc ne coupe tout simplement pas la performance informatique-sage, et les différents programmes de goudron manquent l'architecture "plugin" nécessaire. Est-ce que quelqu'un connaît une solution existante à cela avant de commencer la barattage de code?

16
wazoox

Avant d'aller de l'avant et de réécriture de la goudron, vous pouvez envoler la méthode rapide et facile de lire les données deux fois, car il peut ne pas être beaucoup plus lent que de le faire en une seule passe.

La méthode des deux passes est impliquée ici:

http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-ffiles-within-a-tar-archive/

avec la doublure:

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

Bien que c'est vrai que MD5SUM lisait chaque fichier de disque en parallèle avec goudron, au lieu d'obtenir les données diffusées via le tuyau, la mise en cache de disque Linux doit rendre cette seconde lecture une lecture simple à partir d'une mémoire tampon de mémoire, ce qui ne devrait pas vraiment être plus longe que un stdin lu. Il vous suffit de vous assurer que vous disposez de suffisamment d'espace dans votre cache de disque pour stocker suffisamment de chaque fichier que le 2e lecteur est toujours en train de lire dans le cache et de ne pas aller assez loin derrière pour avoir à récupérer du disque

15
bk.

Voici un exemple Python script. Il calcule la somme de contrôle du fichier comme étant ajoutée à l'archive. À la fin du script, le fichier de contrôle est ajouté à l'archive.

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()

Lorsque vous endommagez, utilisez le chlkum_file pour vérifier la somme de contrôle

4
user37841

Je pense que votre problème est un problème de conception du goudron, car le goudron n'autorise pas l'accès/positionnement aléatoir dans le fichier d'archivage via une table de contenu, tous les protocoles seront donc basés sur la mémoire tampon.
Ainsi, vous pouvez regarder différents formats tels que PAX ou DAR qui permettent un accès aléatoire.

1
weismat

Les formats d'archives récents incluent généralement certains hachage pour la vérification des fichiers, mais ils ont un problème similaire: vous ne pouvez pas toujours choisir votre propre fonction de hachage, ni garder une copie locale des hatupes.

Vous voudrez peut-être enregistrer une copie locale des hachages, distincte de celle intégrée dans l'archive elle-même: par exemple si l'archive est stockée hors ligne (sur des cassettes ou un centre de données coûteux à lire) et vous souhaitez vérifier un Copie locale d'un fichier/répertoire.

7zip a plusieurs options telles que 7z h avec hachage personnalisé et 7z l -slt Pour répertorier tous les hatus et qu'est-ce que vous voulez une liste des hayes MD5 ou SHA1? Vous pouvez utiliser -bb et -bs Pour contrôler la verbosité et réutiliser la méthode George Notaras mentionnée dans la réponse acceptée:

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
0
Nemo