저는 여러 제조업체의 Class 10 UHS-1 SDHC SD 카드를 많이 가지고 있습니다. 모든 파티션은 다음과 같습니다
$ 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
나는 하나를 사용했다메모리 카드 복사기이미지를 복사하세요. 모든 카드의 내용은 동일합니다.
두 개의 SD 카드 중 두 번째 파티션을 마운트하고 내용을 비교해 보면 동일합니다.
$ 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^
하지만 파티션의 sha1sum을 비교해 보면 가끔 다를 때가 있습니다.
$ 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 -
낯선 분, 바이너리 비교 도구(예:)를 사용하여 이 두 드라이브를 비교하면 radiff2
다음이 표시됩니다.
$ 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개의 변경 사항이 있지만 diff
내용에는 차이가 없습니다!
제정신을 위해 동일한 sha1sum을 사용하여 두 개의 파티션을 비교하면 다음이 표시됩니다.
$ radiff2 -c sdj2.img sdf2.img
0
변경사항이 없습니다.
다음은 다양한 카드에서 본 다양한 sha1sum에 대한 분석입니다. dd를 사용하여 드라이브를 읽을 때 얻는 sha1sum에 카드 제조업체의 영향이 큰 것 같습니다.
sha1sum의 차이에도 불구하고 이 모든 카드는 내 목적에 잘 작동합니다. 그러나 sha1sum을 비교할 수 없기 때문에 온전성 확인이 어렵습니다.
두 개의 SD 카드 파티션의 sha1sum이 다르지만 설치 시 내용이 정확히 동일한 것이 어떻게 가능합니까?
답변:이제 예상대로 작동합니다. 명확히 말하자면, 불일치는 제가 사용하고 있는 SySTOR 복제기로 인해 발생합니다. 복사된 파티션 정보와 파일의 복사 설정을 사용했지만 일대일 일치를 보장하기 위해 비트를 추가하지 않았습니다.
답변1
내용을 비교해 보셨나요?곧반복적인 내용을 작성한 후? 그렇다면 그들이 나와야 한다정확히같은. 예를 들어,
# 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
이는 카드의 크기가 정확히 동일한 경우에만 발생합니다. 때로는 동일한 제조업체와 모델의 카드 배치가 다르더라도 크기가 약간 다를 수 있습니다. blockdev --getsize64
장치의 정확한 크기를 가져오는 데 사용됩니다 .
또한 두 카드의 크기가 정확히 같지만 카드 용량보다 작은 이미지를 두 카드에 모두 쓰는 경우 이미지 끝 부분에 쓰레기가 표시되면 보고 차이가 발생할 수 있습니다.
장치에 파일 시스템을 설치하자마자 차이점이 나타나기 시작합니다. 파일 시스템 구현은 파일 시스템을 깨끗한 것으로 표시하는 빈 로그 또는 플래그/타임스탬프와 같은 다양한 항목을 파일 시스템에 기록하며, 그런 다음에는 동일한 항목이 다시 표시되지 않습니다. 어떤 경우에는 파일 시스템을 읽기 전용으로 마운트하더라도 이런 일이 발생할 수 있다고 생각합니다.
답변2
Serada의 답변을 바탕으로: 한편으로는 diff
마운트된 두 파일 시스템 간에 (재귀) 작업을 수행하고 있습니다. 반면에 이진 비교를 수행하고 있습니다.파일 시스템이 있는 장치- 당연히 파일 시스템을 마운트한 후입니다. 바로 사과와 석류입니다.
마운트된 파일 시스템 수준의 작업에서는 파일 시스템에 있는 파일의 데이터 콘텐츠만 볼 수 있습니다. 데이터를 보기 위한 장치 간 바이너리 비교및 메타데이터. 767368의 차이점에 조금 놀랐지만 몇 가지를 추측할 수 있습니다.
- 파일 시스템을 마운트하면 커널은 현재 시간을 "마운트 시간"으로 파일 시스템 슈퍼블록에 기록합니다. 이미 두 개의 장치가 설치되어 있고 해당 장치에 있지 않은 경우정밀한같은 시간), 슈퍼블록의 "마운트 시간"은 달라집니다.
- 재귀 파일 시스템 이후에 장치 수준 바이너리 비교를 수행하면
diff
모든 장치의 모든 파일에 대한 액세스 시간이 업데이트됩니다(inode에서).
PS를 dd
그렇게 많이 사용해야 합니까 ? 만약 당신이 이렇게 하면 radiff2 -c /dev/sdg2 /dev/sdj2
어떻게 될까요 sha1sum /dev/sdg2
?