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/urandom
também é verdade.
Mas você precisa ter cuidado ao usar dd
arquivos 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=1024
escreverá 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).