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

35

É bem conhecido que arquivos de texto vazios têm zero bytes:

Noentanto,cadaumdelescontém metadados , que, de acordo com minha pesquisa, são armazenados em inodes e usam espaço .

Perante isto, parece-me lógico que é possível preencher um disco criando simplesmente ficheiros de texto vazios. Isso está correto? Em caso afirmativo, quantos arquivos de texto vazios eu precisaria preencher em um disco de, digamos, 1GB?

Para fazer algumas verificações, executo df -i , mas isso aparentemente mostra a porcentagem de inodes 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
    
por luchonacho 13.07.2017 / 09:03

4 respostas

40

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

Explicação: no design original do sistema de arquivos * nix, o número máximo de inodes é definido no tempo de 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 padrão mais comum do Linux ext4 ainda tem essa limitação. Para obter informações sobre tamanhos de inode no ext4, veja a página de manual do mkfs.ext4.

O Linux suporta outros sistemas de arquivos sem essa limitação. Em btrfs , o espaço é alocado dinamicamente. "A estrutura do inode é relativamente pequena e não contém 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órios.

Pensando nisso, o tmpfs é outro exemplo onde os inodes são alocados dinamicamente. É difícil saber qual seria o número máximo de inodes reportados por df -i na prática para esses sistemas de arquivos. Eu não atribuo 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 mesmo acontece com o F2FS. Sistemas de arquivos Unix tradicionais alocam inodes estaticamente no mkfs time, assim como FSs modernos como ext4 que rastreiam sua herança de volta a ele. hoje em dia essa é a exceção, não a regra.

"BTW, o XFS permite que você defina um limite na porcentagem máxima de espaço usada por inodes, para que você possa ficar sem inodes antes de chegar ao ponto em que não é possível anexar aos arquivos existentes. (O padrão é 25 % para FSs com menos 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 em% normaldf -h "   - Peter Cordes em um comentário para esta resposta

    
por 13.07.2017 / 09:27
26

Criar arquivos vazios envolve o uso do 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 o Btrfs ou o XFS, alocam inodes dinamicamente). Isso é o que é medido por df -i . Quando você ficar sem inodes, não será possível criar novos arquivos ou diretórios, mesmo que tenha espaço em disco disponível.

As entradas do diretório ocupam espaço também, 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, talvez não seja capaz de criar novos arquivos ou diretórios em um diretório que esteja “cheio” ( ie , onde adicionar 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.

    
por 13.07.2017 / 09:30
6

Argumento de lógica pura:

Um nome de arquivo consiste em uma quantidade diferente de zero de bytes. Mesmo com 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 em seu disco físico. Provavelmente mais, mas "1 bit por arquivo" é o mínimo trivial.

Calcule a quantidade de bits que podem caber em seus discos, e esse é um 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, não importa o armazenamento que estiver usando, se continuar adicionando arquivos vazios. Obviamente, você vai se esgotar muito mais cedo do que o máximo calculado dessa maneira, mas acabe indo embora.

    
por 14.07.2017 / 15:38
0

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

você pode tentar algo assim em 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á fora de inodes muito rápido.

    
por 06.08.2017 / 14:04