You can make GNU
dd show you progress - to quote the man page:
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
dd (sdd) has a similar option and uses SIGQUIT by default (
Regarding your second question: Yes,
dd just copies all the blocks if used by the filesystem or not - which takes DEVICE_CAPACITY/TRANSFER_RATE seconds.
If you want to avoid copying unused disk blocks you can use
# cd /mnt/sda
# tar -c -f - . | tar -C /mnt/sdb -x -f -
tar also has timing options:
# tar -c -f - . --totals=SIGQUIT | tar -C /mnt/sdb -x -f - \
Thus you get read/write statistics when hitting
Ctrl+\ and at the end.
Another possibility is to use
gparted for copying a filesystem - which should be done in a efficient way with filesystems it has enough knowledge of. At least
gparted should display a nice graphical progress dialog.