Estou tentando criar um arquivo de teste 1G aleatório via dd
comando.
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 é gerado /dev/urandom
três vezes menor? Eu esperaria que o tamanho de testfile1.ran fosse 1000M e o tamanho de testfile2.ran fosse 2000M. Alguém poderia por que isso está acontecendo? Como devo gerar um arquivo de teste aleatório?
Com tamanho de bloco maior, 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 deve forneceriflag=fullblock
.Pode não ser necessário
bs=1M
ou menor, mas ainda é recomendado de qualquer maneira.dd
também tentará mostrar quantas leituras incompletas obteve. Copian+m
blocos, n completos e m incompletos. Ao copiar arquivos que não são múltiplos de tamanho de bloco, é normal que o último bloco esteja incompleto.Exemplo:
Nesse caso, obteve apenas leituras incompletas e nenhum bloco completo de 100M. Obviamente /dev/urandom não está disposto a servir tantos dados em uma única leitura. Minha versão do dd até diz para você usar
iflag=fullbock
diretamente.Com fullblock está tudo OK:
Leva mais tempo porque, na verdade, copia mais que o dobro da quantidade de dados.