Por que o kernel do Linux relata “espaço em disco insuficiente” quando, na realidade, ele está fora dos i-nodes?

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 onde o seu sistema operacional (Ubuntu) estava relatando "espaço insuficiente em disco no volume XXX". Mas quando ele foi verificar o volume, ainda restavam 700 GB. Depois de muito tempo desperdiçado, ele finalmente foi capaz de descobrir que ele estava fora de inodes. (Ele estava armazenando muitas pequenas atualizações incrementais de um sistema de backup neste volume e gravado através de todos os seus inodes.)

Ele me perguntou por que o kernel do Linux relatou a mensagem de erro ("sem espaço em disco") em vez de reportar corretamente ("fora de inodes"). Eu não sabia, então pensei em perguntar ao StackExchange.

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

    
por Pretzel 14.01.2014 / 23:24

2 respostas

18

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

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

No entanto, como aderir às mensagens de erro tradicionais não é obrigatório no AFAIK, nada deve proibir um desenvolvedor de tornar a mensagem mais clara, como por exemplo out of disk/inode space

Tecnicamente, estar fora do espaço inode ou fora do espaço de dados é o mesmo, ou seja, 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 reportado como cheio enquanto ainda houver slots livres para inodes.

Observe que os sistemas de arquivos como JFS , XFS , ZFS e btrfs alocam inodes dinamicamente, portanto, não exiba mais esse problema.

    
por 14.01.2014 / 23:47
2

Eu suponho que seu amigo está usando um ext fs, porque é um dos poucos fs sensíveis que podem ficar sem inodes.

Parece que seu amigo mexeu em seu sistema de arquivos e o quebrou ou tem um volume ridiculamente grande de vários TB. 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 de > 4TB (conjectos educados), em que "apenas" 700GB são gratuitos. Para a família ext de fs, o número de inodes é determinado quando o fs é criado. Na página mkfs.ext4 man:

-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 o seu amigo usa o fs de forma diferente do suposto, a proporção escolhida pode estar errada para seu caso de uso e ele recebe esse erro ... preencher um único volume multi-TB com toneladas de arquivos pequenos pode ser considerado como tal.

Seu amigo usa algum ambiente de desktop que implementa o conceito de "lixeira" para arquivos ou qualquer outra forma de backup que possa criar grandes quantidades de arquivos? Talvez ele consiga resolver seu problema simplesmente livrando-se de arquivos desnecessários.

Lembro-me deste problema com o ext2 desde quando o kernel 2.4 era relativamente novo. Como regra geral, eu sempre uso o XFS para volumes que são muito grandes em comparação com o que é comum atualmente. Atualmente eu chamaria tudo entre 250GB a 1TB comum para um único volume e podemos comprar 4TB HDDs. Então, para tudo > 3TB, prefiro usar o XFS do que o ext. Apenas uma regra, mas não ficou sem inodes por um longo tempo ...

    
por 15.01.2014 / 00:21