동일한 tar 내용에 대한 다른 md5sum


15

동일한 디렉토리에서 두 개의 tar를 작성하는 테스트를 실행했는데 (파일은 변경되지 않은 상태로 유지됨) md5sum이 다르다는 것을 알았습니다. tar의 헤더에 타임 스탬프가 포함되어 있다고 가정하지만 재정의하는 방법을 찾지 못했습니다. 내 OS는 Ubuntu 9.1입니다. 어떤 아이디어?

감사.


사용중인 tar 명령 행을 표시하십시오. 파일을 수정하지 않으면 차이가 없어야합니다. 심지어 touch filename파일의 수정 시간을 변경하는 체크섬을 변경 충분하다.
— 추후 공지가있을 때까지 일시 중지되었습니다.

명령은 다음과 같습니다. tar czf one.tgz ./bin; tar czf two.tgz ./bin. 그러면 두 md5가 다릅니다.
— xain

타르 자체가 아니며 gzip 인 것 같습니다. 대신 bzip2에 j를 사용하면 동일한 md5sum이 제공됩니다. 버그 일 수 있습니다-Cygwin에서 시도하고 동일한 체크섬을 얻었습니다. (나도 우분투 9.10을 가지고 있으며, 당신과 같이 다른 결과를 얻었습니다.)
— 추가 통지가있을 때까지 일시 중지되었습니다.

답변:


13

Dennis가 위에서 지적했듯이 gzip입니다. gzip 헤더의 일부는 파일에서 압축 된 모든 것에 대한 모드 시간입니다. 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

이것은 tarfile 내부의 시간에는 영향을 미치지 않으며 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 옵션을 사용할 수 있습니다 . 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를 두 번 실행하여 생성 된)는 다르므로 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 사용을 고려 할 수 있습니다 (이 타르 것은 또한 함께 지원 --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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.