Qual é a diferença entre as opções de comando do dd bs = 1024 count = 1 e bs = 1 count = 1024

2

Considere os dois comandos a seguir, ambos criando um arquivo burro 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

O primeiro comando usa um tamanho de bloco de 1024 bytes e uma contagem de blocos de 1, o segundo faz o contrário.

Meu palpite é que não há diferença e limitar o tamanho do bloco é um problema relacionado à RAM: você não pode ter um tamanho de bloco maior do que a memória disponível.

Há casos especiais em que eu gostaria ou teria que usar o primeiro caso em relação ao segundo? E vice-versa?

golem
fonte

Respostas:

7

Como você parece basicamente entender, a primeira versão lê 1024 bytes, e depois grava quantos bytes retornam da leitura, enquanto a segunda versão faz 1024 leituras e escritas de um byte cada. Ao copiar arquivos comuns, o tamanho de bloco maior (resultando no menor número de E / Ss) pode ser um pouco mais eficiente. Isso provavelmente é verdade /dev/urandomtambém.

Mas você precisa ter cuidado ao usar ddarquivos especiais (ou seja, dispositivos). Por exemplo,

dd if = (qualquer entrada)   de = (um dispositivo de fita magnética)   bs = 1024 count = 1

irá escrever um bloco de fita de 1024 bytes; dd … bs=1 count=1024irá escrever 1024 blocos de um byte cada. Estes não são os mesmos; os 1024 blocos pequenos ocuparão mais espaço na fita do que o bloco grande, devido a intervalos entre registros, e podem causar problemas para a leitura da fita. Mais relevante para sua pergunta, se você ler ( if=) /dev/random, ele retornará apenas quantos bytes de entropia alta estiverem disponíveis. Então, na primeira versão, você pode ter menos de 1024 bytes. Mas, se você tentar ler um byte e o conjunto de entropia estiver vazio, a leitura será bloqueada (ou seja, aguardará) até que os dados estejam disponíveis, portanto a segunda versão garantirá 1024 bytes (embora possa demorar arbitrariamente) longo período de tempo).

Para ampliar o ponto sobre a unidade de fita:

dd if = (entrada apropriada)   de = (um dispositivo de fita magnética)   bs = 512 count = 2

vai escrever dois blocos de fita de 512 bytes. Um subseqüente

dd if = (dispositivo de fita magnética)   de = (qualquer que seja)   bs = 1024 count = 1

pode ler apenas o primeiro bloco; ou seja, os primeiros 512 bytes.

E os pipes (nomeados) podem exibir o mesmo problema que /dev/random- uma leitura grande retornará apenas como bytes, conforme disponíveis; Então, novamente, na primeira versão, você pode ter menos de 1024 bytes. Mas, se você tentar ler um byte de cada vez, a leitura esperará até que os dados estejam disponíveis, então a segunda versão teria a garantia de obter 1024 bytes (ou pelo menos ler até EOF).

G-Man
fonte
Como uma ilustração disso, tente fazer uma sequência de ambos os comandos dd. Ele mostrará claramente que um faz uma leitura / escrita enquanto o outro faz 1024 leituras / escritas conseqüentes.
agtoever