방금 작성한 이미지와 일치하도록 dd를 사용하여 이미지를 다시 읽으려면 어떻게 해야 합니까?

방금 작성한 이미지와 일치하도록 dd를 사용하여 이미지를 다시 읽으려면 어떻게 해야 합니까?

이 도구를 통해 8GB SD 카드에 쓰고 있는 약 1GB의 이미지가 있습니다 dd. 다시 읽고 해당 해시를 원래 해시와 비교하여 손상 없이 작성되었는지 확인하고 싶습니다.

dd분명히 결과 이미지의 크기로 다시 읽으면 내 SD 카드의 크기와 일치하므로 해시를 확인하는 것이 쓸모가 없습니다.

나는 어떻게든 출력을 해석해야 한다고 생각합니다.글쓰기올바르게 읽으려면 구성 skip/ 매개변수를 호출하세요 .count

이미지를 작성하는 데 사용하는 명령은 다음과 같습니다.

> sudo dd if=my.img of=/dev/sdc bs=1M 
8+50581 records in
8+50581 records out
3947888640 bytes (3.9 GB) copied, 108.701 s, 36.3 MB/s

이미지를 읽는 데 사용하는 명령은 다음과 같습니다.

> sudo dd if=/dev/sdc of=same_as_my.img
15523840+0 records in
15523840+0 records out
7948206080 bytes (7.9 GB) copied, 285.175 s, 27.9 MB/s

답변1

\ls -l my.img예를 들어 (아니요 ls -lh, 대략적인 크기를 제공하고 \ls와 같은 별칭을 방지함 ls='ls -h') 또는 를 사용하여 이미지의 크기를 결정합니다 stat -c %s my.img.

원본과 복사본을 한 번만 확인하려면 파일을 비교하면 됩니다. 해시를 사용하면 일회성 비교에는 쓸모가 없으며 작업 속도가 느려지고 더 많은 명령이 필요합니다. 주문하다cmp바이너리 파일을 비교해보세요. 이미지 파일과 SD 카드의 해당 부분을 전달해야 합니다. 사용headSD 카드의 시작 부분을 추출하십시오.

</dev/sdc head -c "$(stat -c %s my.img)" | cmp - my.img

해시는 해시를 계산하기 위해 각 인스턴스를 한 번만 읽어야 하기 때문에 다중 비교를 수행하려는 경우 유용합니다. 데이터 손상이 걱정되므로 어떤 해시든 가능합니다. 보안상의 이유로 파일이 수정되지 않았는지 확인해야 하는 경우 cksum및가 적합하지 않으므로 대신 또는를 md5sum사용해야 합니다 .sha256sumsha512sum

md5sum <my.img >my.img.md5sum
</dev/sdc head -c "$(stat -c %s my.img)" | md5sum >sd-copy.md5sum
cmp my.img.md5sum sd-copy.md5sum

첫 번째 명령의 입력 리디렉션에 유의하세요. 이렇게 하면 체크섬 파일에 파일 이름이 포함되지 않으므로 체크섬 파일을 비교할 수 있습니다. 체크섬 파일과 확인할 복사본이 있는 경우 직접 사용할 수 있습니다.

</dev/sdc head -c "$(stat -c %s my.img)" | md5sum -c my.img.md5sum

아, 그리고사용하지 마세요dd, 이는 느리고(또는 기껏해야 빠르지는 않지만) 복제 오류를 감지하지 않습니다.

답변2

우리가 하는 일은 md5um실제 파티셔닝입니다. 디스크를 사용하여 이미지를 체크섬하는 것을 정확하게 허용하지는 않지만, 디스크가 몇 개 있는 경우(우리처럼) "올바른" 체크섬을 설정할 수 있습니다.

예를 들어, 우리의 경우 파티션은 다음과 같습니다.

$ sudo fdisk -l /dev/sdc
Disk /dev/sdc: 7948 MB, 7948206080 bytes
245 heads, 62 sectors/track, 1021 cylinders, total 15523840 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

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sdc2          122880     7710719     3793920   83  Linux

그런 다음 간단히 파티션에 해시를 생성할 수 있습니다.

$ sudo md5sum /dev/sdc2

그러나 이는 다음을 가정합니다.

  • 테스트할 수 있는 SD 카드가 여러 개 있습니다.
  • 해시를 실행하기 전에 SD 카드를 마운트하지 않았습니다.

또한 SD 카드 속성에 따라 다른 해시 값이 제공되므로 전체 디스크(예: 위 예에서 "/dev/sdc")를 체크섬할 수 없다는 점에 유의하세요.

답변3

md5sum이미지 파일의 값과 SD 카드의 값을 비교하는 것이 좋은 해결책이 될 것입니다.

답변4

sudo sh -c '
     dd bs=64k if="$1" of="$2"
     ! cmp -- "$1" "$2" 2>&1 |
       grep -qvF "EOF on $1"
' -- my.img /dev/sdc

cmp두 파일은 바이트 단위로 비교되어 동일한지 여부에 따라 반환됩니다. 하나가 다른 것보다 짧지만 두 파일 중 더 짧은 파일의 전체 길이가 동일한 경우 cmp1이 반환되고 보고됩니다.EOF on <shorter file>...표준 오류로. 두 파일이 동일하면 cmp0을 반환하고 아무것도 보고하지 않지만, 서로 다른 경우 cmp1을 반환하고 다른 바이트를 보고합니다. 따라서 cmp위의 명령문은 stdout 또는 stderr에서 일치하지 않는 출력 행을 생성하는 모든 실행에 대해 1을 반환합니다.EOF on $1그렇지 않으면 0입니다.

관련 정보