동일한 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.