Maneira de encher / usar instantaneamente muito espaço em disco?

45

Em uma VM Linux, gostaria de testar o NAGIOS monitorando mais profundamente do que apenas desligar a VM ou desconectar a NIC virtual; Eu gostaria de testar ou "aplicar um alarme de espaço em disco" ocupando vários% do espaço livre por um curto período de tempo.

Eu sei que eu poderia apenas usar um

dd if=/dev/zero of=/tmp/hd-fillup.zeros bs=1G count=50

ou algo assim ... mas isso leva tempo e carrega o sistema e requer tempo novamente ao remover os arquivos de teste com o rm.

Existe uma maneira rápida (quase instantânea) de preencher uma partição que não carrega o sistema e leva muito tempo? estou pensando em algo que aloca espaço, mas não o "preenche".

Axel Werner
fonte
desculpe, esqueci de mencionar que é um sistema de arquivos >> ext3.
Axel Werner
Você precisa atualizá-lo para ext4 para suportar fallocate.
Rui F Ribeiro
1
Zip bomba funciona sempre
galois
1
@jaska Faça uma resposta. Foi a primeira ideia que eu tenho ao ler o título ...
Crowley
Por que você não usa /dev/full? (Supondo que exista). Experimente o echo 'test' > /dev/fullDebian.
Ismael Miguel

Respostas:

63

A maneira mais rápida de criar um arquivo em um sistema Linux é usando fallocate:

fallocate -l 50G file 

Do homem:

fallocate é usado para manipular o espaço em disco alocado para um arquivo, para desalocá-lo ou pré-alocá-lo.
Para sistemas de arquivos que suportam a chamada do sistema fallocate, a pré-alocação é feita rapidamente alocando blocos e marcando-os como não inicializados, não exigindo E / S para os blocos de dados. Isso é muito mais rápido do que criar um arquivo preenchendo-o com zeros.
Suportado para XFS (desde o Linux 2.6.38), ext4 (desde o Linux 3.0), Btrfs (desde o Linux 3.7) e tmpfs (desde o Linux 3.5).

Rui F Ribeiro
fonte
1
Por que você está passando por isso sudo?
gerrit
1
@gerrit Adicionado esse ponto à resposta.
Rui F Ribeiro
3
" fallocateprecisa de privilégios de root" Não está no meu sistema (Linux Mint 17.3, downstream do Ubuntu, portanto Debian). (sistema de arquivos ext4)
TJ Crowder
1
+1, embora o OP tenha mencionado explicitamente que seu sistema de arquivos é ext3.
syneticon-dj 30/06
1
@RuiFRibeiro, obrigado! for sles11sp4, foi possível criar um arquivo, formatá-lo com ext4, mas não foi possível montá-lo no modo RW. Mais tarde, encontrei uma mensagem do kernel em / var / log / messages que dizia que o ext4 é suportado apenas como somente leitura. : /
Axel Werner
13

Outras alternativas incluem:

  1. alterar os limites de alarme para algo próximo ou abaixo do uso atual ou
  2. para criar uma partição de teste muito pequena com inodes, tamanho ou outros atributos limitados.

Ser capaz de testar coisas como executar a porcentagem reservada raiz, se houver, também pode ser útil.

agitar
fonte
a porcentagem reservada de raiz normalmente é de 10%, a menos que você a ajuste - isso acaba desperdiçando muito o sistema em grandes partições / discos modernos. Ao definir alarmes, é melhor já levar isso em consideração.
Rui F Ribeiro
+1 na primeira coisa. cem vezes verdade. por que diabos eu realmente deveria criar algo no disco da máquina? e se algo (como coredump, trabalho em lotes que gera grandes arquivos temporários, ...) acontecer no momento dos meus testes e todo o disco for acidentalmente consumido?
Fiisch
2
@Fisch - Por quê? Para garantir que seu limite de alerta esteja correto e que você não esteja fazendo algo acidentalmente como definir a porcentagem livre de inode em vez da porcentagem livre de espaço em disco (o que eu já vi antes). Se algo falhar porque você preencheu um disco com o limite de alerta, seu limite de alerta é muito baixo - o ponto principal do alerta é que ele deve alertá-lo antes que as coisas comecem a quebrar.
31416 Johnny
Gato, bom argumento. Mas não há solução para mim. Não tenho controle sobre a configuração da VM (não é possível alterar partições ou discos virtuais), nem tenho controle sobre o servidor NAGIOS.
Axel Werner
2
@AxelWerner Você pode montar um arquivo em loopback como partição "falsa"? Isso ainda permitirá que você teste sem afetar seriamente nada. Formate-o com um dos sistemas de arquivos suportados e você também pode brincar com fallocate.
Tonny
9
  1. fallocate -l 50G big_file

  2. truncate -s 50G big_file

  3. dd of=bigfile bs=1 seek=50G count=0

Como essas três maneiras, todas podem preencher uma partição rapidamente.

Se você gosta de usar dd , geralmente você pode experimentá-lo com procuram . Basta definir seek=file_size_what_you_neede definir count=0. Isso informará ao sistema que há um arquivo e seu tamanho é o que você definiu, mas o sistema não o criará realmente. E usado dessa maneira, você pode criar um arquivo maior que o tamanho da partição.


Exemplo, em uma partição ext4 com menos de 3G disponível. Use o dd para criar um arquivo 5T que exista como metadados - exigindo praticamente nenhum espaço em bloco.

df -h . ; dd of=biggerfile bs=1 seek=5000G count=0 ; ls -log biggerfile ; df -h .

Resultado:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home
0+0 records in
0+0 records out
0 bytes copied, 4.9296e-05 s, 0.0 kB/s
-rw-rw-r-- 1 5368709120000 Jun 29 13:13 biggerfile
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home
Sete
fonte
1
você pode adicionar mais algumas informações à sua resposta?
cat
Acabei de adicionar mais pensamentos em uma pergunta finalizada para pessoas que pesquisam a mesma pergunta de outra maneira. ignorá-lo e se você não for.
Se ven
Este count=0método é bastante interessante, eu adicionei um exemplo.
AGC
7
Observe que o ddexemplo acima pode muito bem alocar um arquivo esparso. Nesse caso, o tamanho do arquivo é 50G, na verdade, ele está apenas usando um bloco (ou nem mesmo) e, portanto, o disco não está ficando cheio. YMMV.
MAP
2
Testei sua sugestão no meu sistema de arquivos ext3. não funcionou como esperado. truncate e dd criaram um arquivo com um tamanho grande, mas "df -h" não o reconheceu. ainda mostra o mesmo espaço livre em hd.
Axel Werner
0

Você também pode aproveitar a ferramenta stress-ng suportada em um grande número de sistemas baseados em Linux:

stress-ng --fallocate 4 --fallocate-bytes 70% --timeout 1m --metrics --verify --times
theosophe74
fonte