dd를 어떻게 미세하게 제어할 수 있나요?

dd를 어떻게 미세하게 제어할 수 있나요?

64GB MicroSD 카드가 있습니다. 나는 16GB 크기의 이미지를 썼습니다.

$ sudo dd if=my_image.img of=/dev/sdb bs=4M
3798+1 records in
3798+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 657.848 s, 24.2 MB/s

이제 dd를 사용하여 동일한 64GB SD 카드의 첫 번째 15931539456바이트(16GB) 이미지를 촬영하고 시작했던 이미지와 동일한 체크섬을 가진 이미지를 만들고 싶습니다.

내가 이해한 바로는 위의 dd 결과(3798+1)는 소스 이미지의 크기가 4M 청크로 균등하게 나누어지지 않았기 때문에 소스 이미지에서 3798개의 전체 읽기와 1개의 부분 읽기가 있음을 나타냅니다. 그렇다면 dd에게 SD 카드의 15931539456바이트를 한 번에 4M씩 새 파일로 복사하도록 어떻게 지시합니까?

나는 다음과 같은 일을 할 수 있다고 가정합니다.

sudo dd if=/dev/sdb of=new_image.img bs=1 count=15931539456

그러나 이렇게 작은 버퍼를 사용하면 작업에 시간이 오래 걸릴 수 있습니다. 4M 버퍼를 사용하고 마지막에 짧은 읽기가 발생하더라도 X 바이트만 복사하도록 지시하는 방법이 있습니까?

답변1

여러 가지 가능성:

  1. 더 작게 사용 bs하되 아주 작지는 않게 사용하세요.

    dd if=/dev/sdb of=new_image.img bs=512k count=30387
    

    이것은 보편적인 해결책이 아닙니다. 15931539456그것은 인수분해될 수 있기 때문에 여기서 작동합니다 .

  2. 원하는 것을 사용하고 bs, 자세한 내용을 읽고, 즉석에서 잘라냅니다.

    dd if=/dev/sdb bs=4M | head -c 15931539456 >new_image.img
    

    여기서는 필요하지 않습니다 count=3799. 글쎄, 당신은 필요하지 않습니다 dd:

     head -c 15931539456 /dev/sdb >new_image.img
    

    나는 head건전한 내용을 읽고 올바르게 행동할 수 있기를 원합니다. head -cPOSIX에는 주석이 필요하지 않습니다.

  3. 원하는 것을 사용하고 bs, 자세한 내용을 읽고 나중에 자릅니다.

    dd if=/dev/sdb of=new_image.img bs=4M count=3799
     truncate -s 15931539456 new_image.img
    

    truncate휴대가 쉽지는 않지만.

  4. 당신이 생각하는 것을 사용 bs하고 덜 읽은 다음 나머지를 읽으십시오 bs=1.

     dd if=/dev/sdb of=new_image.img bs=4M count=3798
     offset=$((3798*4*1024*1024))
     remaining=$((15931539456-offset))
     dd if=/dev/sdb of=new_image.img bs=1 skip="$offset" seek="$offset" count="$remaining"
    

일반적으로 dd부분 블록을 읽을 수 있지만 여전히 개수가 증가합니다(비교이 답변). 블록 장치에서 읽을 때는 이런 일이 발생하지 않을 수 있지만 일반적인 해결책은 에 iflag=fullblock의존 할 때마다 항상 지정하는 것입니다 . 불행히도 POSIX에서는 이를 요구하지 않으며 지원할 수도 있고 지원하지 않을 수도 있습니다.countbs1fullblockdd

관련 정보