Tại sao các thẻ SD trùng lặp này có sha1sums khác nhau cho nội dung của chúng?


17

Tôi có một loạt thẻ SD UHS-1 SDHC Class 10 từ các nhà sản xuất khác nhau. Tất cả đều được phân vùng như sau

 $ sudo fdisk -l /dev/sdj
Disk /dev/sdj: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0000de21

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdj1          2048  1050623  1048576  512M  c W95 FAT32 (LBA)
/dev/sdj2       1050624  2099199  1048576  512M 83 Linux
/dev/sdj3       2099200  3147775  1048576  512M 83 Linux
/dev/sdj4       3147776 31116287 27968512 13.3G 83 Linux

Tôi đã sử dụng một trình sao chép thẻ nhớ để sao chép hình ảnh. Tất cả các thẻ có cùng một nội dung.

Khi tôi gắn phân vùng thứ hai của bất kỳ hai thẻ SD nào và so sánh nội dung, chúng hoàn toàn giống nhau.

 $ sudo mount -o ro /dev/sdg2 /mnt/system-a/
 $ sudo mount -o ro /dev/sdj2 /mnt/system-b/
 $ diff -r --no-derefence /mnt/system-a /mnt/system-b/
 $ # prints nothing^

Tuy nhiên, nếu tôi so sánh sha1sum của các phân vùng, đôi khi chúng khác nhau

 $ sudo dd if=/dev/sdg2 | sha1sum
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.3448 s, 43.5 MB/s
ee7a16a8d7262ccc6a2e6974e8026f78df445e72  -

 $ sudo dd if=/dev/sdj2 | sha1sum
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.6412 s, 42.5 MB/s
4bb6e3e5f3e47dc6cedc6cf8ed327ca2ca7cd7c4  -

Thật lạ, nếu tôi so sánh hai ổ đĩa này bằng cách sử dụng một công cụ phân biệt nhị phân như thế nào radiff2, tôi sẽ thấy như sau

 $ sudo dd if=/dev/sdg2 of=sdg2.img
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.2378 s, 43.9 MB/s

 $ sudo dd if=/dev/sdj2 of=sdj2.img
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.2315 s, 43.9 MB/s

 $ radiff2 -c sdg2.img sdj2.img
767368

767368 thay đổi, mặc dù diffkhông thấy bất kỳ sự khác biệt nào trong nội dung!

Và để tỉnh táo, nếu tôi so sánh hai phân vùng có cùng sha1sum, tôi thấy như sau

 $ radiff2 -c sdj2.img sdf2.img
0

0 thay đổi!

Đây là bảng phân tích các sha1sums khác nhau mà tôi thấy từ các thẻ khác nhau. Có vẻ như nhà sản xuất thẻ có ảnh hưởng lớn đến những gì sha1sum tôi nhận được khi tôi sử dụng dd để đọc ổ đĩa.

nhập mô tả hình ảnh ở đây

Mặc dù có sự khác biệt về sha1sums, tất cả các thẻ này hoạt động cho mục đích của tôi. Tuy nhiên, việc kiểm tra tích hợp trở nên khó khăn vì tôi không thể so sánh sha1sums.

Làm thế nào có thể hai phân vùng thẻ SD có thể có sha1sums khác nhau, nhưng có cùng một nội dung khi được gắn?


Trả lời: Vì vậy, bây giờ nó hoạt động như mong đợi. Để làm rõ mọi thứ, sự không nhất quán được gây ra bởi trình sao chép SySTOR mà tôi đang sử dụng. Cài đặt sao chép tôi đã sử dụng nó sử dụng thông tin phân vùng và tệp đã sao chép, nhưng nó không cần thiết các bit để đảm bảo có sự trùng khớp một-một.


3
Những loại thử nghiệm bạn đang làm với một loạt các thẻ như vậy? :)
hjk

Nếu bạn đang so sánh chúng sau khi bạn gắn kết chúng, đó là vấn đề của bạn.
David Hoelzer

Câu trả lời:


18

Bạn đã so sánh nội dung của họ ngay sau khi viết nội dung trùng lặp? Nếu có, họ nên đi ra chính xác như nhau. Ví dụ,

# Duplicate
dd bs=16M if=/dev/sdg of=/dev/sdk

# Comparing should produce no output
cmp /dev/sdg /dev/sdk
# Compare, listing each byte difference; also no output
cmp -l /dev/sdg /dev/sdk

Điều này chỉ đúng nếu các thẻ có cùng kích thước. Đôi khi, ngay cả các lô thẻ khác nhau của cùng một nhà sản xuất và mẫu xuất hiện với kích thước hơi khác nhau. Sử dụng blockdev --getsize64để có được kích thước chính xác của thiết bị.

Ngoài ra, nếu cả hai thẻ có kích thước giống hệt nhau nhưng bạn đã viết một hình ảnh cho cả hai thẻ nhỏ hơn dung lượng của thẻ, thì rác xuất hiện sau khi kết thúc hình ảnh có thể gây ra sự khác biệt được báo cáo.

Khi bạn gắn bất kỳ hệ thống tập tin nào trên thiết bị, bạn sẽ bắt đầu thấy sự khác biệt. Việc triển khai hệ thống tệp sẽ ghi nhiều thứ khác nhau vào hệ thống tệp, chẳng hạn như một tạp chí trống hoặc cờ / dấu thời gian để đánh dấu hệ thống tệp là sạch, và sau đó bạn sẽ không thấy nội dung giống hệt nhau nữa. Tôi tin rằng đây có thể là trường hợp trong một số trường hợp ngay cả khi bạn gắn hệ thống tập tin chỉ đọc.


OP có cần sử dụng blockdev --getsize64không? Có vẻ như ddlà thông báo số lượng dữ liệu mà nó đọc.
G-Man nói 'Phục hồi Monica'

3
EIBTI. Truy vấn kích thước làm cho nó thực sự rõ ràng. ddsẽ báo cáo bao nhiêu nó đã sao chép . Trong trường hợp kích thước không khớp giữa một tệp hình ảnh, kích thước của một thiết bị và kích thước của một thiết bị khác, v.v ... có thể là kích thước của nguồn, độ trễ hoặc cả hai.
Celada

Bạn đúng. Họ nên và họ là chính xác như nhau. Sau khi xem xét kỹ hơn, tôi thấy sự không nhất quán này là do cài đặt sao chép trên trình sao chép SySTOR của tôi. Khi tôi ddthẻ SD từ máy tính của tôi (như tôi đã làm với hình ảnh chính cho máy sao chép), tất cả các shasums đều khớp. Tôi đã thay đổi các cài đặt trên SySTOR từ "chỉ hệ thống và tập tin dữ liệu" để "toàn bộ phương tiện truyền thông" và shasums tại thẻ tất cả các đôi đã phù hợp
peskal

8

Để xây dựng câu trả lời của Celada: Một mặt, bạn đang thực hiện diff(đệ quy) giữa hai hệ thống tệp được gắn kết. Mặt khác, bạn đang thực hiện so sánh nhị phân giữa các thiết bị có hệ thống tệp trên chúng - rõ ràng, sau khi bạn đã gắn hệ thống tệp. Đó là táo và lựu.

Hoạt động ở cấp hệ thống tệp được gắn chỉ có thể thấy nội dung dữ liệu của các tệp trong hệ thống tệp. So sánh nhị phân giữa các thiết bị xem xét dữ liệu và siêu dữ liệu . Tôi hơi ngạc nhiên về sự khác biệt của 767368, nhưng tôi có thể đoán được một vài điều:

  • Khi bạn gắn kết một hệ thống tệp, nhân ghi thời gian hiện tại vào siêu khối hệ thống tệp là "thời gian gắn kết". Nếu bạn đã gắn kết cả hai thiết bị (và không phải ở chính xác cùng một thời điểm), trong các superblocks "lần gắn kết" sẽ khác nhau.
  • Nếu bạn thực hiện so sánh nhị phân cấp thiết bị sau hệ thống tệp đệ quy diff, mọi tệp trên mỗi thiết bị sẽ có thời gian truy cập (ở chế độ inode) được cập nhật.

PS Bạn có cần sử dụng ddnhiều không? Điều gì xảy ra nếu bạn làm radiff2 -c /dev/sdg2 /dev/sdj2 hoặc sha1sum /dev/sdg2?


Điều này có áp dụng ngay cả khi gắn ổ đĩa ở chế độ chỉ đọc không? Tôi đã thực hiện so sánh shasum trước khi gắn quá và chúng vẫn khác nhau. Tôi cũng chưa bao giờ thấy sự thay đổi của shasum sau khi lắp là chỉ đọc. - Ngoài ra, bạn cũng đúng, tôi sẽ giành được một giải thưởng dd vô dụng: p
peskal

(1) Không, như bạn nghi ngờ (nghĩa là phù hợp với kinh nghiệm của bạn), việc gắn một hệ thống tệp dưới dạng ro(chỉ đọc) sẽ không gây ra (hoặc cho phép) bất kỳ sửa đổi nào . (Mặc dù tôi đã thấy một hoặc hai trường hợp phần mềm làm việc gì đó khác với những gì nó nên làm.) (2) Sau khi đọc nhận xét của bạn (mỗi câu trả lời, tại thời điểm viết bài này), tôi vẫn không hiểu lắm đã xảy ra. Bạn sẽ làm hài lòng hoặc chỉnh sửa câu hỏi của bạn hoặc đăng một câu trả lời giải thích tình huống mà bạn đã thất bại so sánh (ví dụ, nó tìm thấy sự khác biệt) ngay sau khi sao chép (trước khi lắp đặt), ... (Tiếp theo)
G-Man Says 'Khôi phục Monica'

(Tiếp theo) và bạn đã làm gì để giải quyết nó? (3) Tôi thích nó, nhưng nó có nên được gọi là UUODD, UUODD, hay UUDDD không? Tôi bỏ phiếu cho nhóm UUDD, nhưng có lẽ chúng ta nên xem nó trên Meta. :-)
G-Man nói 'Phục hồi Monica'
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.