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
여러 가지 가능성:
더 작게 사용
bs
하되 아주 작지는 않게 사용하세요.dd if=/dev/sdb of=new_image.img bs=512k count=30387
이것은 보편적인 해결책이 아닙니다.
15931539456
그것은 인수분해될 수 있기 때문에 여기서 작동합니다 .원하는 것을 사용하고
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 -c
POSIX에는 주석이 필요하지 않습니다.원하는 것을 사용하고
bs
, 자세한 내용을 읽고 나중에 자릅니다.dd if=/dev/sdb of=new_image.img bs=4M count=3799 truncate -s 15931539456 new_image.img
truncate
휴대가 쉽지는 않지만.당신이 생각하는 것을 사용
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에서는 이를 요구하지 않으며 지원할 수도 있고 지원하지 않을 수도 있습니다.count
bs
1
fullblock
dd