Различные суммы md5 для одного и того же содержимого tar


15

Я запустил тест, создав два тара из одного и того же каталога (его файлы остались без изменений), и обнаружил, что их значения md5 разные. Я предполагаю, что в заголовке tar есть какая-то временная метка, но я не нашел способа ее переопределить. Моя ОС - Ubuntu 9.1. Есть идеи ?

Благодарю.


Покажите командную строку tar, которую вы используете. Не должно быть никакой разницы, если файлы не изменяются. Даже для touch filenameизменения времени изменения файла достаточно изменить контрольную сумму.
Приостановлено до дальнейшего уведомления.

Вот команда: tar czf one.tgz ./bin; tar czf two.tgz ./bin. Тогда оба md5s разные.
xain

Это не сам tar, похоже, это gzip. Если вместо этого вы используете j для bzip2, он дает ту же сумму md5. Это может быть ошибка - я попробовал это на Cygwin и получил ту же контрольную сумму. (У меня тоже есть Ubuntu 9.10, и я получаю разные результаты, как и вы.)
Приостановлено до дальнейшего уведомления.

Ответы:


13

Как Деннис указал выше, это gzip. Часть заголовка gzip - это время модификации того, что сжато в файле. Если вам нужен gzip, вы можете сжать tar-файл как дополнительный шаг вне tar вместо использования внутреннего gzip tar. Команда gzip имеет флаг, чтобы подавить сохранение этого времени модификации.

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

Это не повлияет на время внутри tar-файла, только на то, что указано в заголовке gzip.


4
Также возможно передать опции gzip в tar какGZIP=-n tar -cz ...
oseiskar

6

Чтобы создать tar-файл с непротиворечивой контрольной суммой, просто добавьте GZIP=-nследующий текст :

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

Как это работает: Tar может принимать параметры gzip, используя временную GZIPпеременную окружения, как указано выше. Как сказал Вальтер, tar использует gzip, который по умолчанию помещает метку времени в архив. Это означает, что вы получаете другую контрольную сумму при сжатии одних и тех же файлов. -nОпция отключает эту метку времени.


4

У меня тоже была эта проблема, чтобы gzip не менял метку времени, используй gzip -n

-n, --no-name не сохранять и не восстанавливать исходное имя и отметку времени

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

Пример:

[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

Я спустился в кроличью нору после того, как другие ответы меня не устроили, и мне удалось выяснить, что моя версия tar (1.27.1 из репозитория openSUSE 42.3 OSS) paxпо умолчанию использует недетерминированный архивный формат, что означает, что даже без сжатия (и даже без явной установки mtime) архивы, созданные с помощью tar из одних и тех же файлов, будут отличаться:

$ 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

Обратите внимание, что вывод выше отличается, даже если сжатие не используется ; несжатое содержимое архива (созданное при запуске tar дважды для одного и того же содержимого) отличается, поэтому сжатое содержимое также будет отличаться даже при использовании, GZIP=-nкак предлагают другие ответы

Чтобы обойти это, вы можете указать --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

Это работает с предложением о gzip выше:

# 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

Однако, в дополнение к уважительным причинам, предпочитающим более эффективные форматы сжатия, чем gzip , вы можете рассмотреть возможность использования вместо него xz (который tar также поддерживает с флагами --xzили -Jвместо -z), потому что это экономит вам здесь шаг; поведение по умолчанию xz- генерировать одинаковые сжатые выходные данные, когда несжатое содержимое одинаково, поэтому нет необходимости указывать такую ​​опцию, как 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.