Você pode fazer com que o GNU dd mostre seu progresso - para citar a página do manual :
Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
$ dd if=/dev/zero of=/dev/null& pid=$!
$ kill -USR1 $pid; sleep 1; kill $pid
O dd de Schily ( sdd ) tem uma opção semelhante e usa SIGQUIT por padrão ( Ctrl+\ ).
Com relação à sua segunda pergunta: Sim, dd apenas copia todos os blocos se usados pelo sistema de arquivos ou não - o que leva DEVICE_CAPACITY / TRANSFER_RATE segundos.
Se você quiser evitar a cópia de blocos de disco não utilizados, use tar :
# cd /mnt/sda
# tar -c -f - . | tar -C /mnt/sdb -x -f -
O GNU tar também tem opções de tempo:
# tar -c -f - . --totals=SIGQUIT | tar -C /mnt/sdb -x -f - \
--totals --totals=SIGQUIT
Assim, você obtém estatísticas de leitura / gravação ao atingir Ctrl+\ e no final.
Outra possibilidade é usar parted ou gparted para copiar um sistema de arquivos - o que deve ser feito de maneira eficiente com os sistemas de arquivos que ele possui conhecimento suficiente. Pelo menos gparted deve exibir um belo diálogo de progresso gráfico.