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?

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.