¿Qué significan los dos números respectivamente en las estadísticas de "registros a + b" de dd?

16

Las primeras 2 líneas en las ddestadísticas tienen el siguiente formato:

a+b records in
c+d records out

¿Por qué 2 valores numéricos? ¿Qué significa este signo más? Por lo general a+0, pero a veces cuando uso un tamaño de bloque más grande, las impresiones dd0+b records out

cuenca
fuente

Respuestas:

16

Significa bloques completos de ese bstamaño más bloques adicionales con un tamaño menor que el bs.

pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1

Editar : la respuesta de frostschutz menciona otro caso para generar bloques no completos. Vale la pena leer. Consulte también /unix//a/17357/73443 .

Arthur2e5
fuente
10

0+b records outPor b>1lo general, son lecturas incompletas mientras se lee desde una tubería u otra fuente que no puede proporcionar bs=Xdatos con la suficiente rapidez. Puede forzar dda esperar bloques completos de datos usando iflag=fullblock. Esta opción es particularmente útil si también la está utilizando, count=Xya que el recuento también cuenta los bloques incompletos, por lo que no es confiable sin el bloqueo completo ...

Frostschutz
fuente
4

Hay docenas de utilidades de línea de comandos estándar que pueden colgarse en un descriptor y esperar la entrada. Así es como funcionan todos. ddes único en el sentido de que puede mostrarle cómo se ve un descriptor en este momento .

Personalmente, realmente no entiendo la utilidad detrás de la iflag=fullblockopción GNU . Quiero decir, puede simplemente catingresar su entrada al menos con la misma facilidad y sin tener que preocuparse por el tamaño de los bloques de E / S.

Pero ddpuede tomar parte de una secuencia, y puede hacerlo en read()/ write()límites en un sistema razonablemente moderno.

{ (     sleep 1                     #don't write() til dd is definitely setup
        printf 123                  #write() 3  bytes
        printf %-30s\\n 456         #write() 31 bytes
        printf you\ there\?         #write() 10 bytes
)|      dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
        od -vtc                     #show it with octal radices
}       2>/dev/null                 #drop stderr

0000000   1   2   3  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000060  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000100   4   5   6
0000120                                                          \n  \0
0000140  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000160  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000200

ddhace un solo read()por bloque de entrada. Si el archivo que intenta read()no tiene tantos datos como ha solicitado, no importa, el que read() cuenta como un bloque de entrada. Así es como funciona: esa es ddla utilidad principal.

Cuando ha hecho su trabajo, ddinforma sobre todos los bloques de entrada / salida con los que se ha ocupado. Ejecutando el comando anterior nuevamente, pero esta vez soltando stdout en su lugar ...


dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s

Cada vez que ddse read(0,&in,64) readvolvió corta - debido a su descriptor de archivo de entrada estándar no tenía suficientes bytes esperando a que se cumpla su petición cuando lo hizo. Y así dd read()0 registros de entrada completos y 2 cortos. Eso es lo que significan esos informes.

mikeserv
fuente