2008-09-29 20 views
39

Supongamos que deseo clonar mi disco duro (hda) en otra unidad (hdb) en la misma computadora. Tal como lo veo, hay dos maneras fáciles, difíciles y do-it-yourself:¿Es mejor que dd cat?

cat /dev/hda > /dev/hdb

y

dd if=/dev/hda of=/dev/hdb

razones técnicas están ahí para que el último es a menudo/siempre dice que es mejor que el anterior?

en ningún caso tratar estos comandos en casa, o su UNIX es fubar'd

+0

ddrescue GNU es mejor que dd – endolith

Respuesta

25

La gran diferencia entre simplemente 'cat' y 'dd' es que dd asegura que todas las lecturas y escrituras se realizan con el tamaño que especifique. Esto puede ser significativo, dependiendo de qué dispositivo (y versión de * nix) esté usando.

+2

Muy significativo, si está hablando con una cinta. Menos significativo con dispositivos modernos. Pero a veces todavía quieres el control detallado que dd puede darte. – Darron

+14

* ¿Cuándo * es esto significativo? Esto es solo la mitad o menos de una respuesta. – endolith

4

Creo que podría haber una penalización de rendimiento para enviar todos sus datos a través de la tubería. dd lo hace todo en un solo programa, y ​​probablemente esté optimizado para lecturas y escrituras en bloque.

+0

1 ... pero tal vez ser claro ... sólo un programa participa dd, donde como con el gato de la concha está involucrado y los datos se pasa a través de una tubería IPC – epatel

+1

no hacer estar muy seguro de eso http://prstat.blogspot.com/2008/04/why-cat1-ran-faster-than-dd1m.html – olle

+0

interesante ... pero, están contando syscalls ...y, no los veo contando las llamadas que hace el shell, ya que es el shell el que escribe en el disco. – epatel

2

Si no recuerdo mal, dd es mucho más "bajo nivel" en el enfoque es, sin esperar este tipo de cosas de lujo como los sistemas de archivos y todas las campanas y silbatos :)

Una vez, dd, literalmente, salvó mi precioso, ehm, vida:

pegada con una caja de linux llena de "DATOS ABSOLUTAMENTE IRREJABLES" de un contratista, con waaaay a muchos sectores defectuosos que lo único utilizable era el shell de emergencia de linux. ¿Mencioné la imposibilidad de abrir la caja para obtener la unidad? Ah, sí, no usb y el tal ...

Y luego, la luz !!! dd y ftp trabajando !!! Ahhh, refrescando! El ahorro de su día (y la carrera) con un encantamiento línea de comandos ordenada para hacer un volcado de copia de seguridad en un disco remoto con ftp ...

Algo así como put |dd if=/dev/hda bs=4096 count= ???? o similares ...

gato ni de' trabajo para mí, entonces ...

-2

dd debería ser más rápido porque hace las E/S internamente, a diferencia de cat, que usa stdio y el shell para E/S.

+0

No, no es así. El intérprete de comandos solo se involucra cuando recibe texto en stdout, de lo contrario, en el caso de un 'cat foo> bar', la copia se maneja internamente. Es por eso que es mucho más rápido enviar un registro (por ejemplo, 2 MiB) a un archivo de texto y leerlo más tarde de lo que es para imprimirlo directamente en el shell. Considere 'cat/dev/cdrom' contra' cat/dev/cdrom> file.iso'; este último se ejecuta significativamente más rápido, y termina [incluso más rápido que dd] (http://stackoverflow.com/a/150989/1175714) cuando no se especifica bs –

+0

Aquí hay más: http://prstat.blogspot.com/2008/ 04/why-cat1-ran-faster-dd1m.html –

2

Ya no hay mucha diferencia práctica.
Internamente, ambos optan por usar casi las mismas calorías.

dd tiene una serie de características adicionales útiles para copias de datos más complejas y podría ser reconocido como más 'normal' para este tipo de tarea por otros usuarios. Pero el simple 'gato' está en la esencia de Unix,

0

Interesante ... He visto recomendaciones en el pasado para hacer este tipo de operación de copia con varias permutaciones de dd, cpio o tar, pero nunca cat.

sigo queriendo decir que es una cuestión de gato estar orientada a texto y los otros estando orientado de binario de datos o que dd puedo tratar más fácilmente con el espacio sin formato, pero * nix realmente no tiene un texto/La distinción binaria y la copia del archivo del dispositivo tomarán el sistema de archivos con la copia, por lo que el formateo no debería ser un problema.

dd tiene muchas opciones adicionales para la conversión de datos en el proceso de transferencia, pero no esperaría que sea particularmente relevante cuando transfiera el propio sistema de archivos en lugar de solo sus contenidos.

26

Algunos puntos.

ltrace cat </dev/zero >/dev/null sugiere que cat es más eficaz de forma predeterminada, ya que no memcpy y, lo que es más importante, utiliza los búferes 4KiB de forma predeterminada.

ltrace dd if=/dev/zero of=/dev/null muestra que los incumplimientos dd para el uso de tampones 512B que es muy ineficiente para la lectura de los discos modernos (aunque el núcleo debería aliviar esta un poco con varios programación disco). Sin embargo dd es mucho más configurable de gato y se puede usar algo como bs = 2M para reducir el número de llamadas al sistema

dd es problemático en la presencia de errores en el disco, y puede colgar o más importante ignorar los datos no legibles lo que corrompe el disco de destino. Considere dd_rescue o ddrescue para esta tarea.

+0

en ubuntu haciendo esa línea ltrace, parece que cat usa 64KB buffer – barlop

+0

Sí, eso se ha incrementado en versiones recientes de coreutils – pixelbeat

19

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'.

+1

sin duda el tamaño de bloque predeterminado de dd es pequeño y ridículamente lento, aunque puede cambiarse ... pero curiosamente, según este sitio http://prstat.blogspot.co.uk/2008/04/why-cat1-ran-faster-than-dd1m.html incluso cuando dile a dd que use un tamaño de bloque enorme, el gato es más rápido – barlop

0

Desea usar dd para que pueda especificar cosas como bsize, que es cuánto leer/escribir a la vez; sintonizando esto con un múltiplo de 4k va a ser mucho más rápido que cat, lo cual es, creo, limitado por las tuberías involucradas.

3

Estaba en Ubuntu 12.04 y mi experiencia fue que podía 'cat' una partición (/ dev/sda1) pero no todo el dispositivo (/ dev/sda). Solo pude clonar exitosamente un dispositivo usando `dd '. De alguna manera, la información de la partición y el sector de arranque se perdieron si cat/dev/sda.

+0

Bienvenido a SO ! Esto no parece ser una respuesta. Tenga en cuenta que SO es un sitio de preguntas/respuestas, no un foro. – Jacinda

+2

Creo que esta es una respuesta decente. La pregunta en sí es en gran parte subjetiva, por lo que establecer diferencias es de mucha mejor calidad, y esta es una diferencia importante. – MDMoore313