Como preencher um disco rígido no Linux

24

Estou testando um pedaço de código e quero preencher um disco rígido com dados. Descobri que ddpode criar arquivos enormes em um instante, mas dfdiscordo. Aqui está o que eu tentei:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lhmostra um arquivo 10G. No entanto, df -hmostra que a partição não encolheu. Então, o que eu preciso fazer para dfreconhecer que os dados já foram obtidos? Espero algo rápido que eu codifique em um teste de unidade.

Usuário1
fonte
Você terá mais sorte se perguntar em serverfault.com
BTW, 10 * 1024 * 1024 * 1024 é o mesmo que 10 * 2 ** 30, um pouco mais simples.
Deltaray

Respostas:

26

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, é tudo zeros), não se preocupa em alocar espaço para ele; portanto, como você ' Como já vimos, é possível 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 o espaço a ser alocado (por exemplo):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

o que levará muito mais tempo, mas realmente preencherá o disco. Eu recomendo aumentar o tamanho do bloco muito mais do que um, porque isso determinará quantas chamadas de sistema o ddprocesso faz - quanto menor o tamanho do bloco, mais syscalls e, portanto, mais lento será executado. (Embora além de 1 MB, provavelmente não fará muita diferença e pode até atrasar as coisas ...)

psmears
fonte
Eu normalmente uso bs = (seja qual for a metade do tamanho do cache da unidade que estou escrevendo). Isso funcionou bem até o momento ao criar partições de imagem em discos rígidos maiores para redimensionar posteriormente. ETA: a palavra crítica MEIO.
Atroon
20

Como outra opção, você pode usar o yes junto com uma única string e é cerca de 10 vezes mais rápida que executar o dd se = / dev / urandom of = largefile. Como isso

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
deltaray
fonte
Surpreendentemente, isso é tão rápido quanto usar dd se = / dev / zero de = nome do arquivo bs = 1M.
precisa saber é
A sintaxe também é fácil de lembrar.
AWT
7

Você criou o que é conhecido como "arquivo esparso" - um arquivo que, como a maioria está vazia (ou seja, lê como \ 0), não ocupa espaço no disco além do que está realmente escrito (1B, após 10 GB). de diferença).

Não acredito que você possa criar arquivos enormes, ocupando espaço em disco real em um instante - ocupar espaço físico significa que o sistema de arquivos precisa alocar blocos de disco ao seu arquivo.

Eu acho que você está preso com o antiquado "dd se = / dev / zero de = nome do arquivo bs = 100M count = 100", que é limitado pela velocidade de gravação seqüencial da sua unidade.

qdot
fonte
6

Se você está apenas testando casos com sistemas de arquivos cheios, talvez o fallocate seja bom o suficiente. E mais rápido também! por exemplo

fallocate -l 150G

uchihaangel
fonte
3
Esta precisa de um nome de arquivo para ser especificados: fallocate -l 150G foo. No entanto, +1 por mencionar a ferramenta.
Kamil Maciorowski
3

Pare de usar seeke use um muito grande bse / ou count. Como está, você está criando um arquivo esparso e, obviamente, não precisa fazer isso.

Ignacio Vazquez-Abrams
fonte
3

Se você deseja literalmente preencher o disco rígido, faça o seguinte:

dd if=/dev/zero of=zeros bs=1M

Opcionalmente, você pode especificar a contagem se quiser limitar o tamanho, mas se você omitir a contagem, ela será executada até você ficar sem espaço em disco.

dd if=/dev/zero of=zeros bs=1M count=10240

Como psmears mencionado, você obterá melhor desempenho se definir o tamanho do bloco como 1 MB (bs = 1M) em vez de 1 B (bs = 1). Isso ainda levará um tempo, mas se você quiser verificar o andamento do seu comando, abra um console separado e execute estes comandos:

ps aux | grep dd

Use o PID do dd neste comando (substitua o PID pelo PID do dd):

kill -USR1 PID

Então vá olhar para o seu terminal dd. Obviamente, isso é de uso limitado quando você está apenas tentando preencher a unidade (você pode usar df ou du para verificar o espaço livre em disco ou o tamanho do arquivo, respectivamente). No entanto, há outros momentos em que é útil fazer com que o dd output progrida.

Crédito extra: um uso prático para zerar o espaço livre é que, posteriormente, você poderá excluir os arquivos "zero" e copiar a partição inteira (ou disco, se você zerou todas as partições) em um arquivo de imagem de disco (por exemplo, , disk-backup.dd) e comprima o arquivo. O espaço livre agora é altamente compressível, portanto, sua imagem dd compactada será muito menor que o dispositivo de bloco original, cujo conteúdo contém.

Transtornos: feche um arquivo zeros grande e envie por e-mail para todos os seus amigos. Diga a eles que é algo muito legal.

roubar
fonte
2

Você cria um arquivo de 1 TB não esparso com o seguinte comando:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

Isso foi útil para testar o que acontece quando as cotas são atingidas ou um sistema de arquivos é preenchido.

df -h mostra o espaço disponível diminuindo.

user75112
fonte