O que os dois números significam, respectivamente, nas estatísticas de "registros a + b" do dd?

16

As duas primeiras linhas nas ddestatísticas têm o seguinte formato:

a+b records in
c+d records out

Por que 2 valores numéricos? O que esse sinal de mais significa? Geralmente é a+0, mas às vezes quando eu uso blocos maiores, o dd imprime0+b records out

bacia
fonte

Respostas:

16

Significa blocos completos desse bstamanho, além de blocos extras com tamanho menor que o 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

Edit : a resposta de frostschutz menciona outro caso para gerar blocos não completos. Vale a pena ler. Consulte também /unix//a/17357/73443 .

Arthur2e5
fonte
10

0+b records outpois b>1geralmente são leituras incompletas durante a leitura de um canal ou outra fonte que não pode fornecer bs=Xdados com rapidez suficiente. Você pode forçar dda aguardar blocos completos de dados usando iflag=fullblock. Essa opção é particularmente útil se você também estiver usando count=Xcomo count, também conta blocos incompletos, portanto, não é confiável sem o bloqueio completo ...

frostschutz
fonte
4

Existem dezenas de utilitários de linha de comando padrão que podem ser pendurados em um descritor e aguardar a entrada. É assim que eles funcionam. ddé único, pois pode mostrar a aparência de um descritor agora .

Pessoalmente, eu realmente não entendo a utilidade por trás da iflag=fullblockopção GNU . Quero dizer, você pode apenas catdigitar sua entrada com a mesma facilidade e sem precisar se preocupar com o tamanho dos blocos de E / S.

Mas ddpode ter um parte de um fluxo - e pode fazê-lo em read()/ write()limites em um sistema razoavelmente 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

ddfaz um único read()por bloco de entrada. Se o arquivo que ele tenta read()não possui tantos dados quanto solicitados, não importa - o que read() conta como um bloco de entrada. É assim que funciona - essa é dda principal utilidade.

Quando ele faz seu trabalho, ddrelatórios sobre todos os blocos de entrada / saída com os quais ele lidou. Executando o comando acima novamente, mas eliminando stdout desta vez ...


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

A cada vez dd, o tempo read(0,&in,64) readera curto - porque seu descritor de arquivo stdin não tinha bytes suficientes esperando que ele cumprisse sua solicitação quando o fez. E assim, dd read()0 registros de entrada completos e 2 curtos. É isso que esses relatórios significam.

mikeserv
fonte