¿Cuál es la diferencia entre las opciones de comando de dd bs=1024 count=1 y bs=1 count=1024?

¿Cuál es la diferencia entre las opciones de comando de dd bs=1024 count=1 y bs=1 count=1024?

Considere los siguientes dos comandos, ambos crean un archivo tonto de 1 KB

dd if=/dev/urandom of=test.file bs=1024 count=1

dd if=/dev/urandom of=test.file bs=1 count=1024

El primer comando utiliza un tamaño de bloque de 1024 bytes y un recuento de bloques de 1, el segundo hace lo contrario.

Supongo que no hay diferencia y limitar el tamaño del bloque es un problema relacionado con la RAM: no se puede tener un tamaño de bloque mayor que la memoria disponible.

¿Hay algún caso especial en el que quisiera o tuviera que utilizar el primer caso en lugar del segundo? ¿Y viceversa?

Respuesta1

Como parece comprender básicamente, la primera versión realiza una lectura de 1024 bytes y luego escribe todos los bytes que surjan de la lectura, mientras que la segunda versión realiza 1024 lecturas y escrituras de un byte cada una. Al copiar archivos normales, el tamaño de bloque más grande (lo que da como resultado una menor cantidad de E/S) puede ser marginalmente más eficiente. Probablemente esto /dev/urandomtambién sea cierto.

Pero debe tener cuidado al utilizarlo dden archivos especiales (es decir, dispositivos). Por ejemplo,

dd si =(cualquiera que sea la entrada)  de =(un dispositivo de cinta magnética)  bs=1024 recuento=1

escribirá un bloque de cinta de 1024 bytes; dd … bs=1 count=1024escribirá 1024 bloques de un byte cada uno. Estos no son lo mismo; los 1024 bloques pequeños ocuparán más espacio en la cinta que el bloque grande, debido a los espacios entre registros, y pueden causar problemas al leer la cinta. Más relevante para su pregunta, si lee ( if=) de /dev/random, devolverá solo tantos bytes de alta entropía como estén disponibles. Entonces, en la primera versión, es posible que obtengas menos de 1024 bytes. Pero, si intenta leer un byte y el grupo de entropía está vacío, la lectura se bloqueará (es decir, esperará) hasta que los datos estén disponibles, por lo que se garantizará que la segunda versión le proporcione 1024 bytes (aunque puede tomar un tiempo arbitrario). mucho tiempo).

Para ampliar el punto sobre la unidad de cinta:

dd si =(entrada apropiada)  de =(un dispositivo de cinta magnética)  bs=512 recuento=2

escribirá dos bloques de cinta de 512 bytes. Un posterior

dd si =(dispositivo de cinta magnética)  de =(lo que sea)  bs=1024 recuento=1

podría leer sólo el primer bloque; es decir, los primeros 512 bytes.

Y las canalizaciones (con nombre) pueden presentar el mismo problema /dev/random: una lectura grande devolverá solo los bytes que estén disponibles; entonces, nuevamente, en la primera versión, es posible que obtenga menos de 1024 bytes. Pero, si intenta leer un byte a la vez, la lectura esperará hasta que los datos estén disponibles, por lo que se garantizará que la segunda versión le proporcione 1024 bytes (o al menos leerá hasta el EOF).

información relacionada