Diversi md5sums per lo stesso contenuto di catrame


15

Ho eseguito un test creando due tars dalla stessa directory (i suoi file sono rimasti invariati) e ho scoperto che i loro md5sums erano diversi. Presumo che ci sia un po 'di timestamp incluso nell'intestazione del tar, ma non ho trovato il modo di sovrascriverlo. Il mio sistema operativo è Ubuntu 9.1. Qualche idea ?

Grazie.


Mostra la riga di comando tar che stai utilizzando. Non ci dovrebbero essere differenze a meno che i file non vengano modificati. Anche ciò touch filenameche modifica il tempo modificato di un file è sufficiente per cambiare il checksum.
In pausa fino a ulteriore avviso.

Ecco il comando: tar czf one.tgz ./bin; tar czf two.tgz ./bin .Quindi entrambi gli md5 sono diversi.
xain,

Non è catrame stesso, sembra essere gzip. Se invece usi j per bzip2, dà lo stesso md5sum. Potrebbe essere un bug: l'ho provato su Cygwin e ho ottenuto lo stesso checksum. (Anch'io ho Ubuntu 9.10 e ho ottenuto risultati diversi lì, proprio come te.)
Messo in pausa fino a nuovo avviso.

Risposte:


13

Come ha sottolineato Dennis sopra, è gzip. Parte dell'intestazione gzip è un tempo mod per tutto ciò che è compresso nel file. Se hai bisogno di gzip, puoi comprimere il tarfile come un passaggio extra al di fuori di tar piuttosto che usare il gzip interno di tar. Il comando gzip ha un flag per sopprimere il salvataggio di quel tempo di modifica.

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

Ciò non influirà sui tempi all'interno del tarfile, ma solo su quello nell'intestazione gzip.


4
È anche possibile passare le opzioni gzip a tar likeGZIP=-n tar -cz ...
oseiskar il

6

Per creare un file tar con un checksum coerente, basta anteporre in GZIP=-nquesto modo:

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

Come funziona: Tar può accettare le opzioni gzip usando una GZIPvariabile di ambiente temporanea , come sopra. Come ha detto Valter, tar usa gzip, che per impostazione predefinita inserisce un timestamp nell'archivio. Ciò significa che ottieni un checksum diverso quando comprimi gli stessi file. L' -nopzione disabilita quel timestamp.


4

Ho avuto anche questo problema, per fare in modo che gzip non modifichi il timestamp, usare gzip -n

-n, --no-name non salva o ripristina il nome e il timestamp originali

[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 <bug-gzip@gnu.org>.

Esempio:

[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

0

Sono andato in una tana di coniglio dopo che le altre risposte mi hanno fallito e sono riuscito a capire che la mia versione di tar (1.27.1 dal repository OSS openSUSE 42.3) utilizzava il paxformato di archivio non deterministico di default, il che significa che anche senza compressione (e persino l'impostazione esplicita di mtime) gli archivi creati con tar dagli stessi file differirebbero:

$ 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

Si noti che l'output sopra differisce, anche se non viene utilizzata alcuna compressione ; il contenuto dell'archivio non compresso (generato eseguendo tar due volte sullo stesso contenuto) è diverso, quindi anche il contenuto compresso differirà anche quando lo si usa GZIP=-ncome suggeriscono altre risposte

Per ovviare a questo, è possibile specificare --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

Questo funziona con il suggerimento su gzip sopra:

# 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

Tuttavia, oltre a validi motivi per preferire migliori formati di compressione a gzip , potresti prendere in considerazione l'uso di xz invece (che tar supporta anche con i flag --xzo -Janziché -z), perché ti fa risparmiare un passaggio qui; il comportamento predefinito di xzè generare lo stesso output compresso quando i contenuti non compressi sono gli stessi, quindi non è necessario specificare un'opzione come 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.