Por que o kernel do Linux relata "falta de espaço em disco" quando, na realidade, está fora dos nós-i

10

Um amigo meu que gosta de programar no ambiente Linux, mas não sabe muito sobre a administração do Linux, recentemente encontrou um problema em que seu SO (Ubuntu) estava relatando "falta de espaço em disco no volume XXX". Mas quando ele foi verificar o volume, ainda havia 700 GB. Depois de muito tempo perdido, ele conseguiu descobrir que estava sem inodes. (Ele estava armazenando muitas pequenas atualizações incrementais de um sistema de backup neste volume e gravando todos os seus inodes.)

Ele me perguntou por que o kernel do Linux relatou a mensagem de erro ("espaço insuficiente em disco") em vez de informar adequadamente ("falta de inodes"). Eu não sabia, então pensei em pedir ao StackExchange.

Alguém sabe por que isso acontece? e por que não foi corrigido depois de todos esses anos? (Lembro-me de um amigo diferente me falando sobre esse problema em 1995.)

Pretzel
fonte

Respostas:

18

Um único número de erro,, ENOSPCé usado para relatar as duas situações, portanto, a mesma mensagem de erro.

Para manter a conformidade com os padrões ISO Ce POSIX, os desenvolvedores do kernel não têm escolha a não ser usar um único número de erro para ambos os eventos. Adicionar um novo número de erro interromperia os programas existentes.

No entanto, como a aderência às mensagens de erro tradicionais não é obrigatória pelo AFAIK, nada deve proibir um desenvolvedor de tornar a mensagem única mais clara, como por exemplo out of disk/inode space

Tecnicamente, estar sem espaço para inode ou sem espaço para dados é o mesmo, ou seja, significa que não há espaço livre em disco suficiente para que a chamada do sistema seja bem-sucedida.

Eu acho que você não iria reclamar se o seu disco for relatado como cheio enquanto ainda houver slots de inodes livres.

Note-se que os sistemas de arquivos como JFS, XFS, ZFSe btrfsalocar inodes dinamicamente para fazer nada apresentam esse problema mais.

jlliagre
fonte
Sistemas de arquivos recentes incluem ext4?
Camilo Martin
@CamiloMartin Acho que não.
Jlliagre
@CamiloMartin Infelizmente, não, ext4aloca inodes no momento da criação do fs como ext2 / 3 e não pode ser modificado posteriormente.
Matt
@mindthemonkey Darn! Provavelmente isso é algo de compatibilidade com versões anteriores, eu acho. Que outro sistema de arquivos possui recursos interessantes, mas é estável o suficiente (o btrfs é estável)? ext4 parece ser algum tipo de "escolha padrão" (pelo menos da minha perspectiva iniciante).
Camilo Martin
1
Sim, os ext sempre foram extensões da versão anterior e compatíveis com versões anteriores, portanto não há grandes mudanças, mas isso significa que ela permaneceu bastante sólida e estável. Pessoalmente, faço todo o meu grande volume de armazenamento em caixas freebsd com ZFS. O BTRFS ainda é considerado "instável", embora a maioria das distribuições permita pelo menos usá-lo.
Matt
2

Suponho que seu amigo esteja usando um ext fs, porque é um dos poucos fs sensíveis que podem ficar sem inodes.

Parece que seu amigo mexeu com seu sistema de arquivos e o quebrou ou tem um volume ridiculamente grande de vários TB. Os inodes não são uma coisa de usar uma vez e jogar fora. Se ele realmente ficou sem inodes, significa que ele tem muitos arquivos e diretórios ridiculamente ... o que pode acontecer em um volume> 4 TB (palpite), onde "apenas" 700 GB são gratuitos. Para a família ext de fs, o número de inodes é determinado quando o fs é criado. Na mkfs.ext4página do manual:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Para encurtar o restante desta resposta: Isso significa que mkfsé fornecido com essa proporção ou assumirá uma. Se seu amigo usa o fs de maneira diferente do que se supõe, a proporção escolhida pode estar errada para o caso de uso dele e ele receber esse erro ... preencher um único volume multi-TB com toneladas de arquivos pequenos pode contar como tal.

Seu amigo usa algum ambiente de área de trabalho que implementa o conceito de "lixeira" para arquivos ou quaisquer outras formas de backup que possam criar grandes quantidades de arquivos? Talvez ele possa resolver seu problema simplesmente se livrando de arquivos desnecessários.

Lembro-me desse problema com o ext2 aproximadamente quando o kernel 2.4 era relativamente novo. Como regra geral, eu sempre uso o XFS para volumes muito grandes em comparação com o que é comum atualmente. Atualmente, eu diria que tudo entre 250 GB e 1 TB é comum para um único volume e podemos comprar HDs de 4 TB. Então, para tudo> 3TB, prefiro usar XFS do que ext. Apenas uma regra de ouro, mas não há inodes há muito tempo ...

Bananguin
fonte
1
Receio que você não esteja respondendo à pergunta.
Jlliagre
Verdadeiro. Eu estava tentando responder à primeira pergunta embutida que clicava "Alguém sabe por que isso acontece?", Mas não a do título.
Bananguin
Direita. Meu amigo sabe o que aconteceu. Ele estava fazendo algum tipo de sistema de backup onde armazenava alterações incrementais sem compactação (nem TAR), para que todos esses pequenos arquivos ocupassem espaço. Eu não acho que ele já tivesse um FS tão grande anteriormente, então ficar sem inodes era algo novo para ele. Portanto, ele ficou frustrado quando digitou "df -h" e pensou: "huh, ainda tenho muito espaço sobrando" - Francamente, concordo com ele. Para o kernel dizer "fora do espaço", quando na verdade ele deve ter uma mensagem separada "fora dos inodes" é muito confuso.
Pretzel
@Banguanguin - Você sabe qual é a proporção padrão de bytes / inodes?
Pretzel
@ Pretzel: Acho que me lembro que o padrão é um inode para cada 4K. Acabei de verificar meu computador ( tune2fs -l /dev/sda1) e, por acaso, tenho uma proporção de 1 inode para cada quatro blocos e cada bloco tem 1k de tamanho. Quanto isso pode ser considerado "padrão", no entanto, eu não sei.
Bananguin