Tamanho diferente do arquivo de / dev / zero e / dev / urandom [duplicado]

10

Estou tentando criar um arquivo de teste aleatório 1G via comando dd .

dd status=progress if=/dev/zero of=/tmp/testfile.zer bs=100M count=10
dd status=progress if=/dev/urandom of=/tmp/testfile1.ran bs=100M count=10
dd status=progress if=/dev/urandom of=/tmp/testfile2.ran bs=100M count=20

A saída é:

-rw-rw-r-- 1 dorinand dorinand  320M dub 21 12:37 testfile1.ran
-rw-rw-r-- 1 dorinand dorinand  640M dub 21 12:37 testfile2.ran
-rw-rw-r-- 1 dorinand dorinand 1000M dub 21 12:37 testfile.zer

Por que o arquivo de teste de saída gera /dev/urandom três vezes menor? Espero que o tamanho do testfile1.ran seja 1000M e o tamanho do testfile2.ran seja 2000M. Alguém poderia por que isso está acontecendo? Como devo gerar um testfile aleatório?

    
por dorinand 21.04.2018 / 13:20

1 resposta

18

Com blocos maiores, existe o risco de obter leituras incompletas. Isso também acontece muito ao ler de um pipe, em vez de um dispositivo de bloco.

Se você espera receber um determinado tamanho ( count * bs ), também precisa fornecer iflag=fullblock .

Pode não ser necessário para bs=1M ou menor, mas ainda é recomendado de qualquer forma.

dd também tentará mostrar quantas leituras incompletas foram obtidas. Copia n+m blocos, completos e incompletos. Ao copiar arquivos que não são múltiplos de blocos, é normal que o último bloco esteja incompleto.

Exemplo:

$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
536870896 bytes (537 MB, 512 MiB) copied, 2 s, 254 MB/s
0+20 records in
0+20 records out
671088620 bytes (671 MB, 640 MiB) copied, 2.64391 s, 254 MB/s

Nesse caso, ele recebeu apenas leituras incompletas e não um único bloco completo de 100M. Obviamente / dev / urandom não está disposto a servir tantos dados em uma única leitura. Minha versão do dd ainda diz para você usar iflag=fullbock diretamente.

Com o fullblock tudo está OK:

$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 iflag=fullblock
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8 s, 255 MB/s 
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8.22914 s, 255 MB/s

Leva mais tempo porque, na verdade, copia mais que o dobro da quantidade de dados.

    
por 21.04.2018 / 13:28

Tags