Мало возможностей:
Используйте меньший 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
всякий раз, когда вы полагаетесь на count
и bs
больше, чем 1
. К сожалению, fullblock
не требуется POSIX,так что ваш dd
может не поддерживать его.