dd was modeled after the command
DDR (Disk Dump and Restore) from IBM mainframes from the 1960s and is mainly intended to convert and reblock block oriented I/O from/to block oriented disks. This is however not what you intend to do here.
The important problem in your use case is than you have an unreliable network pipe in the middle that does not grant to read specific block sizes.
If you are using a real
dd program (not sure what you use since your output is incompatible to the standard) you should get output like this:
"%u+%u records in\n", <number of whole input blocks>,
<number of partial input blocks>
"%u+%u records out\n", <number of whole output blocks>,
<number of partial output blocks>
You need to use
dd in a way that makes sure that you only get numbers > 0 before the plus sign and a 0 after the plus sign.
Since there is no grant to get a specific amount of data when reading from the
ssh output pipe, you need to make sure to always try to read less than you would get. You could still use the following command to read from the source disk:
dd if=/dev/xxx bs=16x1024k
without problems, but you need to use this command to read from the pipe and to write to the destination disk:
dd ibs=1b obs=16x1024k of=/dev/yyy
Do not user other options (in special none of the non-standard option you are using). If the
dd command that writes to the destination disk finally writes:
nnnn+0 records in
mmmm+0 records out
you have been successful and
dd did never read less than 512 bytes from the input and thus could correctly reblock the output.
If you see partial blocks (> 0 to the right of the plus sign) for the input blocks, you need to repeat the copy process.
Note that because of the large output blocksize, you of course may get one partial block written to the destination dist at the end. So the summary message for the
dd that writes to the destination disk may alternatively be:
nnnn+0 records in
mmmm+1 records out