Пакет tar содержит разные контрольные суммы для одного и того же содержимого - PullRequest
0 голосов
/ 05 октября 2018

Упаковка папки в системе SUSE Linux Enterprise Server 12 SP3 с использованием GNU tar 1.30 всегда дает разные контрольные суммы md5, хотя содержимое файла не изменяется.

Я запускаю tar, чтобы упаковать свою папку, содержащую простой текстовый файл:

tar cf package.tar folder

Тем не менее, несмотря на то, что содержимое точно такое же, результирующий tar всегда имеет другой md5 (или sha1) контрольная сумма:

$> rm -rf package.tar && tar cf package.tar folder && md5sum package.tar
e6383218596fffe118758b46e0edad1d  package.tar
$> rm -rf package.tar && tar cf package.tar folder && md5sum package.tar
1c5aa972e5bfa2ec78e63a9b3116e027  package.tar

Поскольку файловая система linux, кажется, доставляет файлы в произвольном порядке в tar, я попытался использовать опцию --sort.Но получающаяся команда не меняет проблему контрольной суммы для меня.Кроме того, опция tar --mtime здесь не помогает, поскольку даты создания точно совпадают.

Я ценю любую помощь по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Предоставленные вами архивы содержат расширенные заголовки pax .Беглый взгляд на их структуру показывает, что они различаются в этих двух полях:

  1. Идентификатор процесса процесса pax (как часть имени расширенного заголовка в блоке заголовка ustar, и, следовательно,контрольная сумма для этого блока заголовка ustar).
  2. atime (время доступа) в расширенном заголовке.

Одним из обходных путей, которые можно использовать для создания воспроизводимого архива, является принудительное использование старогоФормат unix ustar (вместо формата pax / posix):

tar --format=ustar -cf package.tar folder

Другой вариант - вручную установить расширенное имя и удалить atime, сохранив формат pax:

tar --format=pax --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime -cf package.tar folder

Теперь md5sum должно быть одинаковым для обоих архивов.

0 голосов
/ 05 октября 2018

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

Согласно этой статье возможно с помощью GNU tar произвести идентичный вывод для идентичного ввода, выполнив следующие действия:

# requires GNU Tar 1.28+
$ tar --sort=name \
      --mtime="2018-10-05 00:00Z" \
      --owner=0 --group=0 --numeric-owner \
      -cf product.tar build
...