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.

Existe algum caso especial em que eu queira ou tenha que usar o primeiro caso em relação ao segundo? E vice-versa?

    
por golem 16.08.2014 / 01:27

1 resposta

6

Como você parece basicamente entender, a primeira versão lê 1024 bytes, e depois escreve quantos bytes retornaram da leitura, enquanto a segunda versão faz 1024 leituras e gravações de um byte cada. Ao copiar arquivos comuns, o tamanho de bloco maior (resultando no menor número de E / Ss) pode ser marginalmente mais eficiente. Isso provavelmente vale para /dev/urandom também.

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

dd  if=(whatever input)  of=(a magnetic tape device)  bs=1024  count=1

irá escrever um bloco de fita de 1024 bytes; dd … bs=1 count=1024 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 pode causar problemas para a 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. Então, na primeira versão, você pode ter menos de 1024 bytes. Mas, se você tentar ler um byte e o pool de entropia estiver vazio, a leitura será bloqueada (ou seja, espere) até que os dados estejam disponíveis, então a segunda versão teria a garantia de obter 1024 bytes (embora possa demorar um tempo arbitrariamente longo).

Para ampliar o ponto sobre a unidade de fita:

dd  if=(appropriate input)  of=(a magnetic tape device)  bs=512  count=2

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

dd  if=(magnetic tape device)  of=(whatever)  bs=1024  count=1

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

E os pipes (nomeados) podem apresentar o mesmo problema que /dev/random - uma leitura grande retornará apenas como bytes conforme a disponibilidade; Então, novamente, na primeira versão, você pode obter 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).

    
por 16.08.2014 / 01:54

Tags