Diferentes md5sums para o mesmo conteúdo de alcatrão

15

Executei um teste criando dois alcatrões do mesmo diretório (seus arquivos permaneceram inalterados) e descobri que os md5sums deles eram diferentes. Suponho que haja algum carimbo de data / hora sendo incluído no cabeçalho do alcatrão, mas não encontrei o caminho para substituí-lo. Meu sistema operacional é o Ubuntu 9.1. Alguma ideia ?

Obrigado.

xain
fonte
Mostre a linha de comando do tar que você está usando. Não deve haver nenhuma diferença, a menos que os arquivos estejam sendo modificados. Mesmo o touch filenameque altera a hora modificada de um arquivo é suficiente para alterar a soma de verificação.
Pausado até novo aviso.
Aqui está o comando: tar czf one.tgz ./bin; tar czf two.tgz ./bin. Então os dois md5s são diferentes.
Xain
Não é o próprio tar, parece ser gzip. Se você usar j para bzip2, ele fornecerá o mesmo md5sum. Pode ser um bug - tentei no Cygwin e obtive a mesma soma de verificação. (Eu tenho o Ubuntu 9.10 também e tenho obtido resultados diferentes, assim como você.)
Pausado até novo aviso.

Respostas:

13

Como Dennis apontou acima, é gzip. Parte do cabeçalho gzip é um tempo de modificação para o que estiver compactado no arquivo. Se você precisar do gzip, poderá compactar o arquivo tar como uma etapa extra fora do tar, em vez de usar o gzip interno do tar. O comando gzip possui um sinalizador para suprimir a economia desse tempo de modificação.

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

Isso não afetará os tempos dentro do arquivo tar, apenas o do cabeçalho gzip.

Jeff Snider
fonte
4
Também é possível passar opções gzip de piche comoGZIP=-n tar -cz ...
oseiskar
6

Para criar um arquivo tar com uma soma de verificação consistente, basta acrescentar GZIP=-nassim:

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

Como isso funciona: O Tar pode aceitar opções gzip usando uma GZIPvariável de ambiente temporária , como acima. Como Valter disse, o tar usa gzip, que por padrão coloca um carimbo de data e hora no arquivo. Isso significa que você obtém uma soma de verificação diferente ao compactar os mesmos arquivos. A -nopção desativa esse carimbo de data / hora.

Lucas
fonte
4

Eu também tive esse problema, para fazer o gzip não alterar o carimbo de data e hora, use gzip -n

-n, --no-name não salva ou restaura o nome e a data e hora originais

[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]>.

Exemplo:

[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
fonte
0

Desci na toca do coelho depois que as outras respostas falharam e consegui descobrir que minha versão do tar (1.27.1 do repositório openSUSE 42.3 OSS) estava usando o paxformato de arquivo não determinístico por padrão, o que significa que mesmo sem compactação (e até mesmo definindo o mtime explicitamente) os arquivos criados com tar dos mesmos arquivos seriam diferentes:

$ 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

Observe que a saída acima difere, mesmo que nenhuma compactação esteja sendo usada ; o conteúdo do arquivo descompactado (gerado pela execução do tar duas vezes no mesmo conteúdo) é diferente; portanto, o conteúdo compactado também será diferente mesmo quando usado GZIP=-ncomo outras respostas sugerem

Para contornar isso, você pode especificar --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

Isso funciona com a sugestão sobre o gzip acima:

# 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

No entanto, além de razões válidas para preferir melhores formatos de compactação do que o gzip , você pode considerar usar o xz (que tar também suporta com os sinalizadores --xzou em -Jvez de -z), porque você economiza um passo aqui; o comportamento padrão de xzé gerar a mesma saída compactada quando o conteúdo não compactado for o mesmo; portanto, não há necessidade de especificar uma opção como 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
fonte