Estou testando um trecho de código e quero preencher um disco rígido com dados. Descobri que dd
posso criar arquivos enormes em um instante, mas df
discordo. Aqui está o que eu tentei:
dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))
ls -lh
mostra um arquivo 10G. No entanto, df -h
mostra que a partição não diminuiu. Então, o que preciso fazer para df
reconhecer que os dados foram obtidos agora? Espero algo rápido que eu codifique em um teste de unidade.
Responder1
O problema com o seek=<big number>
truque é que o sistema de arquivos é (geralmente) inteligente: se parte de um arquivo nunca foi gravada (e, portanto, é toda zero), ele não se preocupa em alocar espaço para ele - então, como você ' Como vimos, você pode ter um arquivo de 10 GB que não ocupa espaço (isso é conhecido como "arquivo esparso" e pode ser muito útil em alguns casos, por exemplo, certas implementações de banco de dados).
Você pode forçar a alocação do espaço com (por exemplo):
dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))
o que levará muito mais tempo, mas na verdade preencherá o disco. Eu recomendo deixar o tamanho do bloco muito maior que um, porque isso determinará quantas chamadas de sistema o dd
processo fará - quanto menor o tamanho do bloco, mais syscalls e, portanto, mais lento ele será executado. (Embora além de 1 MB, provavelmente não fará muita diferença e pode até tornar as coisas mais lentas...)
Responder2
Como outra opção para isso, você pode usar sim junto com uma única string e é cerca de 10 vezes mais rápido do que executar dd if=/dev/urandom of=largefile. Assim
yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
Responder3
Você criou o que é conhecido como "arquivo esparso" - um arquivo que, porque a maior parte dele está vazio (ou seja, é lido como \0), não ocupa espaço no disco além do que está realmente escrito (1B, após 10GB de lacuna).
Não acredito que você possa criar arquivos enormes, ocupando espaço em disco em um instante - ocupar espaço físico significa que o sistema de arquivos precisa alocar blocos de disco para o seu arquivo.
Acho que você está preso ao antiquado "dd if=/dev/zero of=filename bs=100M count=100", que é limitado pela velocidade de gravação sequencial da sua unidade.
Responder4
Pare de usar seek
e use um arquivo muito grande bs
e/ou count
. Como é que você está fazendo umarquivo esparso, e obviamente você não precisa fazer isso.