PostHeaderIcon A lição nossa de cada dia… quando o espaço não é tudo.

Seu telefone toca durante a madrugada. Um dos sistemas mais importantes para um cliente parou subitamente de funcionar. É preciso tomar uma ação imediata. Ao tentar verificar qual foi o problema, uma rápida olhada nos logs do sistema revela algo que parece comum e, aparentemente, fácil de resolver: problemas no sistema de arquivos com a messagem “no space left on device“. Pronto… logo mais você estará com o problema resolvido e dormindo novamente. Na certeza da vitória, você executa um df, mais ou menos dessa maneira:

# df -m

Uma rápida passada de olho procurando confirmar o óbvio: alguma partição está com 100% de ocupação. Diante disso, aumenta-se o tamanho da partição ou move-se alguns arquivos para outras partições… Mas, para sua surpresa e para a infelicidade de sua noite de descanso, nenhuma das partições do sistema apresenta ocupação máxima:

[root@amhsnode01-br ~]# df -m
Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/sda1                 9920      3433      5975  37% /
/dev/sda2                  961        20       892   3% /tmp
/dev/sda3                 3968       320      3444   9% /var
/dev/sda4                  996        40       905   5% /boot

O nervosismo toma conta… mais telefones irão tocar em breve. Ainda em busca da verdade e sem saber no que acreditar, você monta o sistema de arquivos que provocou o problema e tenta criar um arquivo:

# touch /var/nightmare/teste

E a mensagem aparece novamente: “no space left on device“. E agora?

Situações como essa podem complicar a vida de um administrador de sistemas, não é mesmo? De fato, na grande maioria dos casos, quando se vê a mensagem do tipo “no space left on device” trata-se do esgotamento do espaço disponível em uma partição para armazenar novos dados. Entretanto, o “espaço não é tudo”, como o próprio nome desse post sugere.

Cada arquivo em um sistema de arquivos Unix tem um identificador único dentro de sua partição chamado inode. Não, o objetivo não é discutir essas questões referentes à arquitetura de um sistema de arquivos. Entretanto, é necessário, ao menos, algumas informações mais triviais para desvendar essa situação que, para muitos, pode ser pra lá de estranha e repleta de emoções. Durante o processo de formatação de uma partição é gerado um número pré-determinado de inodes que serão utilizados conforme novos arquivos vão sendo criados. Para a grande maioria dos casos, o número padrão de inodes criado é suficiente para que você nunca passe por uma situação como essa. Porém, é possível acontecer um cenário onde muitos arquivos pequenos foram criados de forma que, ainda tenha espaço de armazenamento disponível em uma partição mas não se tenha mais inodes disponíveis para a criação de novos arquivos nela. Eis o mistério do problema…

Para revelar a verdade diante de seus olhos, basta executar o mesmo comando “df”, entretanto, com o parâmetro “-i” que apresentará, nesse caso, a quantidade total de inodes disponível, a utilizada, a livre e o percentual de utilização por cada partição:

[root@amhsnode01-br ~]# df -i
Filesystem            Inodes    IUsed    IFree IUse%  Mounted on
/dev/sda1             2621440  123037  2498403    5%  /
/dev/sda2              253952     766   253186   32%  /tmp
/dev/sda3             1048576 1048576  1048576  100%  /var
/dev/sda4              263232      33   263199    1%  /boot

Problema revelado, não? Passado o susto, a solução agora consiste em, por exemplo, mover arquivos dessa para outra partição de forma a liberar inodes de forma que seja possível criar novos arquivos, mantendo o seu sistema funcionando adequadamente.

Para terminar, se, no seu caso for, de fato, necessária uma partição para armazenar muitos arquivos pequenos de forma que o número default  de inodes não seja suficiente, é possível, no momento da formatação, especificar o número de inodes desejados utilizando o parâmetro “-N” do utilitário mkfs:

# mkfs.ext4 -N 9999999 /dev/sda1

Outra opção do mkfs que pode ser interessante é a “-i” onde é determinar a cada quantos bytes deve ser disponibilizado um inode. Dessa maneira, o número de inodes a ser criado irá ser calculado considerando o tamanho da partição dividido pelo número de bytes especificado como argumento desse parâmetro. Interessante, não?

Bem, acho que é isso. Fico por aqui… até a próxima!

Leave a Reply