A maneira mais eficiente de fazer isso é retomar a transferência de onde parou.
#!/bin/bash
source_disk=/dev/sda
host=1.2.3.4
host_image=/foo/bar.img
bytes_transferred() {
if ! ssh "$host" "test -e '$host_image'"; then
echo 0
return
fi
ssh "$host" "stat '%s' '$host_image'"
}
bytes_total() {
echo $(( $(blockdev --getsz $source_disk) * 512 ))
}
while (( $(bytes_transferred) < $(bytes_total) )); do
( dd bs=1 skip=$(bytes_transferred) count=0 2>/dev/null && cat ) < $source_disk | ssh "$host" "cat >> '$host_image'"
done
Isso não foi testado, mas deve funcionar. Basicamente continua loop enquanto o tamanho do arquivo de destino é menor que o tamanho do disco local. Cada vez que o loop é reiniciado, ele inicia a transferência de onde parou anteriormente