Md5sums khác nhau cho cùng một nội dung tar


15

Tôi chạy thử nghiệm tạo hai tars từ cùng một thư mục (các tệp của nó không thay đổi) và tôi thấy rằng md5sums của họ là khác nhau. Tôi cho rằng có một số dấu thời gian được đưa vào tiêu đề của tar, nhưng tôi chưa tìm được cách ghi đè lên nó. Hệ điều hành của tôi là Ubuntu 9.1. Có ý kiến ​​gì không?

Cảm ơn.


Hiển thị dòng lệnh tar mà bạn đang sử dụng. Không nên có bất kỳ sự khác biệt nào trừ khi các tệp đang được sửa đổi. Ngay cả touch filenameviệc thay đổi thời gian sửa đổi của tệp cũng đủ để thay đổi tổng kiểm tra.
Tạm dừng cho đến khi có thông báo mới.

Đây là lệnh: tar czf one.tgz ./bin; tar czf hai.tgz ./bin. Sau đó cả hai md5 đều khác nhau.
xain

Bản thân nó không phải là tar, nó có vẻ là gzip. Nếu bạn sử dụng j cho bzip2 thay vào đó, nó sẽ cho cùng md5sum. Nó có thể là một lỗi - Tôi đã thử nó trên Cygwin và có cùng một tổng kiểm tra. (Tôi cũng có Ubuntu 9.10 và đã nhận được các kết quả khác nhau ở đó, giống như bạn.)
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


13

Như Dennis đã chỉ ra ở trên, đó là gzip. Một phần của tiêu đề gzip là thời gian mod cho bất cứ điều gì được nén trong tệp. Nếu bạn cần gzip, bạn có thể nén tarfile như một bước bổ sung bên ngoài tar thay vì sử dụng gzip bên trong của tar. Lệnh gzip có một cờ để chặn việc tiết kiệm thời gian sửa đổi đó.

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

Điều này sẽ không ảnh hưởng đến thời gian bên trong tarfile, chỉ có một lần trong tiêu đề gzip.


4
Cũng có thể chuyển các tùy chọn gzip sang tar nhưGZIP=-n tar -cz ...
oseiskar

6

Để tạo một tệp tar với tổng kiểm tra nhất quán, chỉ cần thêm vào GZIP=-nnhư sau:

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

Cách thức hoạt động: Tar có thể chấp nhận các tùy chọn gzip bằng cách sử dụng GZIPbiến môi trường tạm thời , như trên. Giống như Valter đã nói, tar sử dụng gzip, theo mặc định sẽ đặt dấu thời gian trong kho lưu trữ. Điều này có nghĩa là bạn nhận được một tổng kiểm tra khác nhau khi bạn nén cùng một tệp. Các -ntùy chọn vô hiệu hóa timestamp đó.


4

Tôi cũng gặp vấn đề này, để làm cho gzip không thay đổi dấu thời gian, hãy sử dụng gzip -n

-n, --no-name không lưu hoặc khôi phục tên gốc và dấu thời gian

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

Thí dụ:

[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

Tôi đã đi xuống một lỗ thỏ sau khi các câu trả lời khác làm tôi thất bại và tìm ra rằng phiên bản tar của tôi (1.27.1 từ repo openSUSE 42.3 OSS) đang sử dụng định paxdạng lưu trữ không xác định theo mặc định, điều đó có nghĩa là thậm chí không nén, (và thậm chí thiết lập lưu trữ rõ ràng mtime) được tạo bằng tar từ cùng một tệp sẽ khác nhau:

$ 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

Lưu ý rằng đầu ra ở trên khác nhau, mặc dù không sử dụng nén ; nội dung lưu trữ không nén (được tạo bằng cách chạy tar hai lần trên cùng một nội dung) là khác nhau, do đó, nội dung nén cũng sẽ khác nhau ngay cả khi sử dụng GZIP=-nnhư các câu trả lời khác đề xuất

Để giải quyết vấn đề này, bạn có thể chỉ định --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

Điều này hoạt động với gợi ý về gzip ở trên:

# 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

Tuy nhiên, ngoài các lý do hợp lệ để thích các định dạng nén tốt hơn cho gzip , bạn có thể muốn xem xét sử dụng xz thay thế (tar cũng hỗ trợ với các cờ --xzhoặc -Jthay vì -z), vì nó giúp bạn tiết kiệm một bước ở đây; hành vi mặc định của xzlà tạo ra cùng một đầu ra được nén khi nội dung không nén giống nhau, do đó không cần chỉ định một tùy chọn như 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.