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

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

Considere os dois comandos a seguir, ambos criando um arquivo idiota 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 que a memória disponível.

Existem casos especiais em que eu gostaria ou teria que usar o primeiro caso em vez do segundo? E vice-versa?

Responder1

Como você parece entender basicamente, a primeira versão faz uma leitura de 1.024 bytes e, em seguida, grava quantos bytes retornaram da leitura, enquanto a segunda versão faz 1.024 leituras e gravações de um byte cada. Ao copiar arquivos comuns, o tamanho de bloco maior (resultando em um número menor de E/S) pode ser um pouco mais eficiente. Isso provavelmente /dev/urandomtambém é verdade.

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

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

gravará um bloco de fita de 1024 bytes; dd … bs=1 count=1024escreverá 1024 blocos de um byte cada. Estes não são iguais; os 1.024 blocos pequenos ocuparão mais espaço na fita do que um bloco grande, devido às lacunas entre gravações, e podem causar problemas na leitura da fita. Mais relevante para sua pergunta, se você ler ( if=) de /dev/random, ele retornará apenas quantos bytes de alta entropia estiverem disponíveis. Portanto, na primeira versão, você pode obter menos de 1.024 bytes. Mas, se você tentar ler um byte e o pool de entropia estiver vazio, a leitura será bloqueada (ou seja, esperará) até que os dados estejam disponíveis, portanto, a segunda versão teria a garantia de obter 1.024 bytes (embora possa levar um tempo arbitrário). longo período de tempo).

Para ampliar o assunto sobre a unidade de fita:

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

gravará dois blocos de fita de 512 bytes. Um subsequente

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

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

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

informação relacionada