同じtar内容の異なるmd5sum


15

同じディレクトリから2つのtarを作成するテストを実行し(ファイルは変更されませんでした)、md5sumが異なることがわかりました。tarのヘッダーにタイムスタンプが含まれていると思いますが、それをオーバーライドする方法が見つかりません。私のOSはUbuntu 9.1です。何か案は ?

ありがとう。


使用しているtarコマンドラインを表示します。ファイルを変更しない限り、違いはありません。でも、touch filenameファイルの更新日時を変更するには、チェックサムを変更するのに十分です。
追って通知があるまで一時停止します。

コマンドは次のとおりです。tar czf one.tgz ./bin; tar czf two.tgz ./bin。そして両方のmd5は異なります。
xain

それはtarそのものではなく、gzipのようです。代わりにbzip2にjを使用すると、同じmd5sumが得られます。バグの可能性があります-Cygwinで試したところ、同じチェックサムが得られました。(私もUbuntu 9.10を使用していますが、あなたと同じように異なる結果が得られています。)
追って通知があるまで一時停止します。

回答:


13

デニスが上で指摘したように、それはgzipです。gzipヘッダーの一部は、ファイルで圧縮されているもののmod時間です。gzipが必要な場合は、tarの内部gzipを使用するのではなく、tarの外部の追加ステップとしてtarfileを圧縮できます。gzipコマンドには、その変更時間の節約を抑制するフラグがあります。

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

これは、tarファイル内の時間には影響せず、gzipヘッダー内の時間にのみ影響します。


4
のようなタールにgzipのオプションを渡すことも可能であるGZIP=-n tar -cz ...
oseiskar

6

一貫したチェックサムでtarファイルを作成するには、次のように追加しますGZIP=-n

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

仕組み: TarはGZIP、上記のように一時的な環境変数を使用してgzipオプションを受け入れることができます。Valterが言ったように、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(openSUSE 42.3 OSSリポジトリからの1.27.1)がpaxデフォルトで非決定的アーカイブ形式を使用していることを理解しました。同じファイルからtarで作成されたアーカイブは、圧縮なしで(およびmtimeを明示的に設定することでも)異なります。

$ 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を2回実行することで生成される)は異なるため、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 or -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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.