Diferentes md5sums para el mismo contenido de alquitrán

15

Ejecuté una prueba creando dos tars desde el mismo directorio (sus archivos permanecieron sin cambios), y descubrí que sus md5sums eran diferentes. Supongo que se incluye una marca de tiempo en el encabezado del tar, pero no he encontrado la manera de anularlo. Mi sistema operativo es Ubuntu 9.1. Algunas ideas ?

Gracias.

xain
fuente
Muestra la línea de comando tar que estás usando. No debería haber ninguna diferencia a menos que los archivos se modifiquen. Incluso lo touch filenameque cambia el tiempo modificado de un archivo es suficiente para cambiar la suma de verificación.
Pausado hasta nuevo aviso.
Aquí está el comando: tar czf one.tgz ./bin; tar czf two.tgz ./bin .Los dos md5 son diferentes.
xain
No es alquitrán en sí, parece ser gzip. Si usa j para bzip2, le da el mismo md5sum. Puede ser un error: lo probé en Cygwin y obtuve la misma suma de verificación. (También tengo Ubuntu 9.10, y he estado obteniendo resultados diferentes allí, como tú).
Pausó hasta nuevo aviso.

Respuestas:

13

Como Dennis señaló anteriormente, es gzip. Parte del encabezado gzip es un tiempo de modificación para lo que esté comprimido en el archivo. Si necesita gzip, puede comprimir el archivo tar como un paso adicional fuera de tar en lugar de usar el gzip interno de tar. El comando gzip tiene una bandera para suprimir el ahorro de ese tiempo de modificación.

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

Esto no afectará los tiempos dentro del archivo tar, solo el del encabezado gzip.

Jeff Snider
fuente
44
También es posible pasar opciones gzip tar comoGZIP=-n tar -cz ...
oseiskar
6

Para hacer un archivo tar con una suma de verificación consistente, simplemente anteponga GZIP=-nasí:

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

Cómo funciona esto: Tar puede aceptar las opciones de gzip utilizando una GZIPvariable de entorno temporal , como se indicó anteriormente. Como dijo Valter, tar usa gzip, que por defecto coloca una marca de tiempo en el archivo. Esto significa que obtienes una suma de comprobación diferente cuando comprimes los mismos archivos. La -nopción deshabilita esa marca de tiempo.

Luke
fuente
4

También tuve este problema, para hacer que gzip no altere la marca de tiempo, use gzip -n

-n, --no-name no guarda ni restaura el nombre original y la marca de tiempo

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

Ejemplo:

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

Bajé por una madriguera de conejo después de que las otras respuestas me fallaran, y logré darme cuenta de que mi versión de tar (1.27.1 del repositorio openSUSE 42.3 OSS) estaba usando el paxformato de archivo no determinista por defecto, lo que significa que incluso sin compresión, (e incluso configurando el mtime explícitamente) los archivos creados con tar a partir de los mismos archivos serían 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

Tenga en cuenta que la salida anterior difiere, aunque no se esté utilizando compresión ; el contenido del archivo sin comprimir (generado al ejecutar tar dos veces en el mismo contenido) es diferente, por lo que el contenido comprimido también diferirá incluso cuando se use, GZIP=-ncomo sugieren otras respuestas

Para evitar esto, puede 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

Esto funciona con la sugerencia sobre gzip anterior:

# 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

Sin embargo, además de razones válidas para preferir mejores formatos de compresión a gzip , es posible que desee considerar usar xz en su lugar (que tar también admite con las banderas --xzo en -Jlugar de -z), porque le ahorra un paso aquí; El comportamiento predeterminado de xzes generar la misma salida comprimida cuando el contenido sin comprimir es el mismo, por lo que no es necesario especificar una opción 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
fuente