Différentes sommes md5 pour le même contenu tar

15

J'ai exécuté un test en créant deux goudrons à partir du même répertoire (ses fichiers sont restés inchangés), et j'ai trouvé que leurs sommes md5 étaient différentes. Je suppose qu'il y a un horodatage inclus dans l'en-tête du tar, mais je n'ai pas trouvé le moyen de le remplacer. Mon système d'exploitation est Ubuntu 9.1. Des idées ?

Merci.

xain
la source
Affichez la ligne de commande tar que vous utilisez. Il ne devrait pas y avoir de différence à moins que les fichiers ne soient modifiés. Même touch filenamequi change l'heure modifiée d'un fichier suffit à changer la somme de contrôle.
pause jusqu'à nouvel ordre.
Voici la commande: tar czf one.tgz ./bin; tar czf two.tgz ./bin .Ensuite, les deux md5 sont différents.
xain
Ce n'est pas du goudron lui-même, il semble être gzip. Si vous utilisez j pour bzip2 à la place, cela donne la même somme md5. Ce pourrait être un bug - je l'ai essayé sur Cygwin et j'ai obtenu la même somme de contrôle. (J'ai également Ubuntu 9.10, et j'ai obtenu des résultats différents, tout comme vous.)
Pause jusqu'à nouvel ordre.

Réponses:

13

Comme Dennis l'a souligné ci-dessus, c'est gzip. Une partie de l'en-tête gzip est une heure de modification pour tout ce qui est compressé dans le fichier. Si vous avez besoin de gzip, vous pouvez compresser le fichier tar en tant qu'étape supplémentaire en dehors de tar plutôt que d'utiliser le gzip interne de tar. La commande gzip a un indicateur pour supprimer l'enregistrement de ce temps de modification.

tar -c ./bin |gzip -n >one.tgz
tar -c ./bin |gzip -n >two.tgz
md5sum one.tgz two.tgz

Cela n'affectera pas les heures à l'intérieur du fichier tar, seulement celle de l'en-tête gzip.

Jeff Snider
la source
4
Il est également possible de passer des options gzip à tar likeGZIP=-n tar -cz ...
oseiskar
6

Pour créer un fichier tar avec une somme de contrôle cohérente, ajoutez simplement GZIP=-nceci:

GZIP=-n tar -zcf myOutputTarball.tar /home/luke/directoryIWantToZip

Comment cela fonctionne: Tar peut accepter les options gzip en utilisant une GZIPvariable d'environnement temporaire , comme ci-dessus. Comme l'a dit Valter, tar utilise gzip, qui par défaut place un horodatage dans l'archive. Cela signifie que vous obtenez une somme de contrôle différente lorsque vous compressez les mêmes fichiers. L' -noption désactive cet horodatage.

Luc
la source
4

J'ai aussi eu ce problème, pour que gzip ne modifie pas l'horodatage, utilisez gzip -n

-n, --no-name ne pas enregistrer ou restaurer le nom et l'horodatage d'origine

[valter.silva@alog ~]$ gzip --help
Usage: gzip [OPTION]... [FILE]...
Compress or uncompress FILEs (by default, compress FILES in-place).

Mandatory arguments to long options are mandatory for short options too.

  -c, --stdout      write on standard output, keep original files unchanged
  -d, --decompress  decompress
  -f, --force       force overwrite of output file and compress links
  -h, --help        give this help
  -l, --list        list compressed file contents
  -L, --license     display software license
  -n, --no-name     do not save or restore the original name and time stamp
  -N, --name        save or restore the original name and time stamp
  -q, --quiet       suppress all warnings
  -r, --recursive   operate recursively on directories
  -S, --suffix=SUF  use suffix SUF on compressed files
  -t, --test        test compressed file integrity
  -v, --verbose     verbose mode
  -V, --version     display version number
  -1, --fast        compress faster
  -9, --best        compress better
    --rsyncable   Make rsync-friendly archive

With no FILE, or when FILE is -, read standard input.

Report bugs to <[email protected]>.

Exemple:

[valter.silva@alog ~]$ ls
renewClaroMMSCanaisSemanal.log.gz  s3

[valter.silva@alog ~]$ gunzip renew.log.gz 
[valter.silva@alog ~]$ gunzip s3/renew.log.gz 

[valter.silva@alog ~]$ md5sum renew.log 
d41d8cd98f00b204e9800998ecf8427e  renew.log

[valter.silva@alog ~]$ md5sum s3/renew.log 
d41d8cd98f00b204e9800998ecf8427e  s3/renew.log

[valter.silva@alog ~]$ gzip -n renew.log 
[valter.silva@alog ~]$ gzip -n s3/renew.log 

[valter.silva@alog ~]$ md5sum renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  renew.log.gz

[valter.silva@alog ~]$ md5sum s3/renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  s3/renew.log.gz
Valter Silva
la source
0

Je suis descendu dans un lapin après que les autres réponses m'ont échoué et j'ai réussi à comprendre que ma version de tar (1.27.1 du repo openSUSE 42.3 OSS) utilisait le paxformat d'archivage non déterministe par défaut, ce qui signifie que même sans compression, (et même en définissant explicitement le mtime) les archives créées avec tar à partir des mêmes fichiers seraient différentes:

$ echo hi > test.file
$ tar --create --to-stdout test.file # long form of `tar cO test.file`
./PaxHeaders.13067/test.file0000644000000000000000000000013213427447703012603 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
$ tar --create --to-stdout test.file
./PaxHeaders.13096/test.file0000644000000000000000000000013213427447703012605 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi

Notez que la sortie ci-dessus diffère, même si aucune compression n'est utilisée ; le contenu de l'archive non compressé (généré en exécutant tar deux fois sur le même contenu) est différent, de sorte que le contenu compressé sera également différent même lors de l'utilisation GZIP=-ncomme le suggèrent d'autres réponses

Pour contourner cela, vous pouvez spécifier --format gnu :

$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar  hartusershi
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar  hartusershi

Cela fonctionne avec la suggestion de gzip ci-dessus:

# gzip refuses to write to stdout, so we'll use the `-f` option to create a file
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75  test.file.tgz
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75  test.file.tgz

# without GZIP=-n we see a different hash
$ tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
682ce0c8267b90f4103b4c29903c5a8d  test.file.tgz

Cependant, en plus des raisons valables de préférer de meilleurs formats de compression à gzip , vous voudrez peut-être envisager d'utiliser xz à la place (que tar prend également en charge avec les drapeaux --xzou à la -Jplace de -z), car cela vous évite une étape ici; le comportement par défaut de xzest de générer la même sortie compressée lorsque le contenu non compressé est le même, il n'est donc pas nécessaire de spécifier une option comme GZIP=-n:

$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz 
dea99037d4b0ee4565b3639e93ac0930  test.file.txz
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz 
dea99037d4b0ee4565b3639e93ac0930  test.file.txz
Hart Simha
la source