Posso ficar sem espaço em disco criando um número muito grande de arquivos vazios?

35

É sabido que os arquivos de texto vazios possuem zero bytes:

insira a descrição da imagem aqui

No entanto, cada um deles contém metadados , que, de acordo com minha pesquisa, são armazenados em inodes e usam espaço .

Diante disso, parece-me lógico que é possível preencher um disco criando puramente arquivos de texto vazios. Isso está correto? Em caso afirmativo, quantos arquivos de texto vazios eu precisaria preencher em um disco de, por exemplo, 1 GB?


Para fazer algumas verificações, eu corro, df -imas isso aparentemente mostra a% de inodes que estão sendo usados ​​(?) E não o quanto eles pesam.

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho
luchonacho
fonte
Relacionados: unix.stackexchange.com/q/62049
moooeeeep

Respostas:

40

Esta saída sugere 28786688inodes em geral, após o qual a próxima tentativa de criar um arquivo no sistema de arquivos raiz (dispositivo /dev/sda2) retornará ENOSPC("Não resta espaço no dispositivo").

Explicação: no design original do sistema de arquivos * nix, o número máximo de inodes é definido no momento da criação do sistema de arquivos. Espaço dedicado é alocado para eles. Você pode ficar sem inodes antes de ficar sem espaço para dados ou vice-versa. O sistema de arquivos Linux mais comum ext4ainda possui essa limitação. Para obter informações sobre tamanhos de inode no ext4, consulte a página de manual do mkfs.ext4.

O Linux suporta outros sistemas de arquivos sem essa limitação. Ativado btrfs, o espaço é alocado dinamicamente. "A estrutura do inode é relativamente pequena e não conterá dados de arquivos incorporados ou dados de atributos estendidos." (ext3 / 4 aloca algum espaço dentro de inodes para atributos estendidos ). É claro que você ainda pode ficar sem espaço em disco criando muitas entradas de metadados / diretório.

Pensando nisso, o tmpfs é outro exemplo em que os inodes são alocados dinamicamente. É difícil saber o que o número máximo de inodes relatados por df -irealmente significaria na prática para esses sistemas de arquivos. Eu não atribuiria nenhum significado ao valor mostrado.


"O XFS também aloca inodes dinamicamente. O mesmo acontece com o JFS. O mesmo aconteceu com o reiserfs. O F2FS. Os sistemas de arquivos Unix tradicionais alocam os inodes estaticamente no momento do mkfs, e os FSes modernos, como o ext4, que remetem à sua herança, mas atualmente a exceção, não a regra.

"BTW, o XFS permite que você defina um limite para a porcentagem máxima de espaço usada pelos inodes, para que você possa ficar sem inodes antes de chegar ao ponto em que não pode anexar aos arquivos existentes. (O padrão é 25% para FSes abaixo de 1 TB, 5% para sistemas de arquivos de até 50 TB, 1% para maiores que isso.) De qualquer forma, esse uso de espaço em metadados (inodes e mapas de extensão) será refletido regularmente df -h"- Peter Cordes em um comentário a esta resposta

sourcejedi
fonte
Então, você está dizendo que, se eu criar 28786688-667980=28118708arquivos vazios, ficarei sem inodes e "quebrarei meu sistema"?
Luchonacho
1
O XFS também aloca inodes dinamicamente. O JFS também. O mesmo fez / reiserfs. O mesmo acontece com o F2FS . Os sistemas de arquivos Unix tradicionais alocam inodes estaticamente no momento do mkfs, assim como os FSes modernos, como o ext4, que remontam à sua herança, mas atualmente essa é a exceção, não a regra. (A menos que você peso coisas por instalou-base, em que provavelmente é preciso dizer que a maioria dos sistemas de arquivos atualmente no disco em sistemas * nix em estado selvagem têm alocado estaticamente inodes.)
Peter Cordes
BTW, o XFS permite definir um limite para a porcentagem máxima de espaço usada pelos inodes, para que você possa ficar sem inodes antes de chegar ao ponto em que não pode anexar aos arquivos existentes. (O padrão é 25% para FSes com menos de 1 TB, 5% para sistemas de arquivos com até 50 TB, 1% para maiores que isso.) De qualquer forma, esse uso de espaço nos metadados (inodes e mapas de extensão) será refletido no df -h@luchonacho regular .
Peter Cordes
26

Criar arquivos vazios envolve o seguinte:

  • inodes, um por arquivo;
  • entradas de diretório adicionais, também uma por arquivo, mas agregadas.

O número de inodes disponíveis geralmente é determinado quando um sistema de arquivos é criado e não pode ser alterado (alguns sistemas de arquivos como Btrfs ou XFS alocam inodes dinamicamente). Isso é o que é medido df -i. Ao ficar sem inodes, não é possível criar novos arquivos ou diretórios, mesmo se houver espaço em disco disponível.

As entradas do diretório também ocupam espaço, a partir do espaço em disco disponível. Você pode ver isso observando o tamanho de um diretório: é sempre um múltiplo do tamanho do bloco e, quando um diretório contém muitos arquivos, seu tamanho aumenta. Se você ficar sem espaço em disco, poderá não conseguir criar novos arquivos ou diretórios em um diretório "cheio" ( ou seja , onde a adição de um novo arquivo envolveria a alocação de um novo bloco), mesmo se você tiver inodes disponíveis.

Então, sim, é possível ficar sem espaço em disco usando apenas arquivos vazios.

Stephen Kitt
fonte
Então, eu precisaria criar arquivos vazios suficientes para chegar a 100% de uso de inodes?
Luchonacho
@luchonacho sim, efetivamente um arquivo vazio por inode.
Stephen Kitt
Observe também atributos estendidos que podem adicionar espaço além disso. Por exemplo, se o diretório tiver muitas ACLs padrão, a criação de um arquivo nele precisará de espaço para armazenar essas ACLs.
Stéphane Chazelas
OK, estou corrigido. O problema é que isso me parece estranho com as fontes renderizadas e de largura fixa no meu navegador. Por curiosidade, como você os insere? Seu teclado possui uma tecla diferente para esse caractere e o U + 0022?
Stéphane Chazelas
Obrigado, por curiosidade, verifiquei se eles estavam no meu layout de teclado no Reino Unido e, de fato, estão no AltGr + Shift + V / B (aspas duplas sem turno). Eu vou ficar com U + 0022 embora.
Stéphane Chazelas
7

Argumento lógico puro:

Um nome de arquivo consiste em uma quantidade diferente de zero de bytes. Mesmo com a compactação máxima teórica em um sistema de arquivos hipotético projetado para permitir a quantidade máxima absoluta de nomes de arquivos, cada nome de arquivo ainda consumirá pelo menos um bit em algum lugar do disco físico. Provavelmente mais, mas "1 bit por arquivo" é o mínimo trivial.

Calcule a quantidade de bits que pode caber nos pratos e esse é o número máximo teórico de arquivos (vazios ou não vazios) que você pode armazenar nele.

Então a resposta é sim. Eventualmente, você ficará sem espaço, independentemente do armazenamento que estiver usando, se continuar adicionando arquivos vazios. Obviamente, você acabará muito mais cedo do que o máximo calculado dessa maneira, mas acabará.

AnoE
fonte
0

Simplesmente não, mas você pode ficar sem os inodes no linux, que serão os mesmos que ficar sem espaço.

você pode tentar algo assim no seu shell n=0; while :; do touch $n; let n=n+1; done

Apenas certifique-se de executá-lo na máquina virtual ou você estará sem inodes muito rápido.

in1t3r
fonte
O que esse comando está fazendo?
Luchonacho
Começa enquanto o loop infinito verdadeiro, que a cada passo cria um nome de arquivo que é um número inteiro a partir de 0 e 1 2 3 ... acabará criando arquivos suficientes para usar todos os inodes do sistema de arquivos.
in1t3r
1
Se executar esse comando em sua partição / home, se for independente, então / partition você não terá problemas, apenas não pôde escrever mais na sua partição / home. Minha sugestão é criar um diretório chamado inodetest cd nele e, em seguida, executar o comando depois de ver os erros que você não pode mais criar arquivos no sistema de arquivos, pressione ctrl + C e execute rm -fr inodetestpara se livrar de todos esses arquivos vazios e trabalhar normalmente novamente. :)
in1t3r
0

Você não pode preencher o disco criando arquivos vazios - o disco ainda terá muito espaço para novos arquivos. Mas sim, você pode esgotar o fornecimento finito de inodes gratuitos do sistema de arquivos - nesse ponto, você não pode criar novos arquivos (mesmo que seu disco - até onde o espaço usado seja usado - esteja praticamente vazio). É apenas a lista de inodes do sistema de arquivos que já foi usada, não o disco ... então o sistema de arquivos está cheio, enquanto o disco está praticamente vazio. A tabela inode usa espaço no disco, mas a tabela não cresce quando você adiciona arquivos - assim como uma folha de papel não cresce quando você escreve nas linhas.

(uma resposta em um comentário de Baard Kopperud)

luchonacho
fonte
Não tem certeza de que precisamos de outra resposta que diga a mesma coisa ?
Jeff Schaller