Es realmente histórico, y no tan importante si todo lo que vas a hacer es clonar un disco en otro.
En Unix tradicional, se podía acceder a los discos a través de dispositivos de bloque y dispositivos de caracteres, y cada uno tenía diferentes requisitos. 'dd' era necesario para interactuar con los dispositivos de bloque, porque 'cat' solo sabía sobre la E/S de caracteres. (La E/S de bloques fue particularmente importante para manejar eficientemente cosas como unidades de cinta.)
dd puede ser útil si necesita reiniciar una copia de larga ejecución, debido a sus opciones de omisión y búsqueda.
A menos que esté en un sistema que todavía tenga la distinción bloque/carácter para el acceso al disco (que Linux no), ya menos que necesite hacer algo como swap bytes, 'cat' estará bien (y probablemente más rápido, porque tendrá un tamaño de bloque más grande que dd).
Tenga en cuenta que, a menos que alguien haya realizado algunos cambios importantes en el diseño de la carcasa desde la última vez que miré, 'cat foo> bar' no no haga la escritura en 'barra' a través del shell; todo lo que hace el shell es 'barra' abierta para escribir con truncamiento, luego pasa el descriptor de archivo abierto a 'cat' a través de un fork/exec como descriptor de archivo 1 (stdout). En ese punto, el shell está fuera del ciclo, y no se involucra nuevamente, más allá de ser notificado del estado de salida de 'cat'.
ddrescue GNU es mejor que dd – endolith