Encontrei sua postagem enquanto investigava um problema semelhante ao tentar gravar uma imagem em um cartão SD (via leitor / gravador USB). Usando pv, ele mostrará 100% quase imediatamente, mas levará alguns minutos depois para ser concluído.
Eu encontrei uma solução para o meu problema usando dd, pv e pipes, e definindo o write dd para o modo direto. Isso também teve o efeito de melhorar bastante a velocidade de gravação. Eu não sei se há algum lado negativo de usar este método (eu li a imagem de volta e executei uma soma de verificação - e tudo parece ok).
Meu exemplo é usar uma imagem de raspbian (2017-09-07-raspbian-stretch-lite.img), que tem 1854590976 bytes (1.8GB) de tamanho. Mostrei alguns outros métodos e você pode ver as diferenças de tempo.
Então, usando dd | pv | dd com o modo direto, levou apenas 2 minutos e 57 segundos:
dd if=2017-09-07-raspbian-stretch-lite.img ibs=1M status=none | pv -s 1854590976 | dd of=/dev/sdX obs=1M oflag=direct status=none
(a configuração do status para nenhum interrompe o funcionamento da exibição pv)
Usar o pv por si só mostra 100% imediatamente, mas levou 8 minutos e 28 segundos para ser concluído:
pv 2017-09-07-raspbian-stretch-lite.img > /dev/sdX
Usando dd por si só, sem qualquer visualização de progresso, demorou 8 minutos e 15 segundos:
dd if=2017-09-07-raspbian-stretch-lite.img of=/dev/sdX bs=1M
Usando o mesmo dd acima, mas adicionando oflag = direct faz com que seja 2 minutos 54:
dd if=2017-09-07-raspbian-stretch-lite.img of=/dev/sdX bs=1M oflag=direct
Eu tentei várias combinações diferentes, que são muito mais lentas (algumas demoram até 12 minutos!) ou mostram 100% imediatamente.
Uma ressalva de usar pv desta forma é que você precisa descobrir o tamanho da imagem primeiro e especificá-la com a opção -s. Se você está escrevendo coisas como eu, é fácil determinar o tamanho do arquivo ao mesmo tempo.
Espero que ajude alguém.