Servidor Linux sem espaço

31

Fiz essa pergunta em duas entrevistas consecutivas, mas após algumas pesquisas e verificações com vários administradores de sistemas, não recebi uma boa resposta. Gostaria de saber se alguém pode me ajudar aqui.

Um servidor está sem espaço em disco. Você percebe um arquivo de log muito grande e determina que é seguro removê-lo. Você exclui o arquivo, mas o disco ainda mostra que está cheio. O que causaria isso e como você o remediaria? E como você descobriria qual processo está gravando esse enorme arquivo de log?

ewwhite
fonte
3
Você precisa conversar com melhores administradores de sistemas. Isso é coisa trivial.
Womble
2
Trivial, mas a situação ea questão surge muitas vezes o suficiente ...
ewwhite
O OP poderá aceitar isso?
ewwhite
5
Trivial ou não, para alguém que não fala * nix fluentemente (por exemplo, um administrador principalmente do Windows), isso é algo bom de aprender.
John Gardeniers

Respostas:

56

Essa é uma pergunta comum de entrevista e uma situação que surge em vários ambientes de produção.

As entradas de diretório do arquivo foram excluídas, mas o processo de registro ainda está em execução. O espaço não será recuperado pelo sistema operacional até que todos os identificadores de arquivo tenham sido fechados (por exemplo, o processo tenha sido eliminado) e todas as entradas de diretório removidas. Para encontrar o processo de gravação no arquivo, você precisará usar o lsofcomando

A outra parte da pergunta pode às vezes ser "como você limpa um arquivo que está sendo gravado sem interromper o processo?" Idealmente, você "zera" ou "trunca" o arquivo de log com algo como, em : > /var/log/logfilevez de excluir o arquivo.

ewwhite
fonte
11
... ou fuser.
Steven Monday,
11
Expandindo um pouco: até que todas as referências a um arquivo no disco desapareçam, esse espaço não pode ser usado por outra coisa. Isso inclui identificadores de arquivo. Isso também permite que este truque ao trabalho: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland
11
Se você no-clobberconfigurou, tente:>| /var/log/logfile
Belmin Fernandez
2
Faço uma variante dessa pergunta em todas as entrevistas: "Você está recebendo mensagens com disco cheio. dfDiz duque você está sem espaço, diz que mal está usando nenhuma. O que está causando isso e por que as duas ferramentas não concordam?"
precisa saber é o seguinte
O que fazer se depois > /var/log/filedo espaço em disco ainda estiver em 100%? O arquivo de log parece estar vazio ... mas somente após reiniciar o programa que grava nesse arquivo de log, o espaço é recuperado. Existe uma maneira de recuperar o espaço em disco sem reiniciar o programa?
Alemani
14

Ainda há outro link para o arquivo (link físico ou identificador de arquivo aberto). A exclusão de um arquivo exclui apenas a entrada do diretório; os dados e o inode do arquivo permanecem até a última referência a ele ser removida.

É uma prática comum para um serviço criar um arquivo temporário e excluí-lo imediatamente, mantendo o arquivo aberto. Isso cria um arquivo no disco, mas garante que o arquivo será excluído se o processo terminar de forma anormal e também impede que outros processos pisem acidentalmente no arquivo. O MySQL faz isso, por exemplo, para todas as suas tabelas temporárias em disco. O malware geralmente usa táticas semelhantes para ocultar seus arquivos.

No Linux, você pode acessar convenientemente esses arquivos excluídos como /proc/<pid>/fd/<filenumber>.

tylerl
fonte
8

Eu não sou um administrador de sistemas, mas pelo que reuni no Unix.SE, um sistema Linux na verdade não exclui um arquivo (marque o espaço como livre / reutilizável) depois que ele é desvinculado até que todos os descritores de arquivo que apontam para eles tenham foi fechado. Portanto, para responder à primeira parte, o espaço ainda não está livre porque um processo ainda está sendo lido. Para responder à segunda, você pode ver com qual processo está usando o arquivo lsof.

Kevin
fonte
2

Uma resposta alternativa além da óbvia resposta de vínculo físico / arquivo aberto: esse arquivo é um arquivo (muito) escasso, como /var/log/lastlogno RHEL, que na verdade não estava ocupando tanto espaço. A exclusão teve muito pouco impacto; portanto, você precisa examinar o próximo arquivo maior.

Alexios
fonte
1

Se o processo de gravação do arquivo for raiz, ele será gravado no espaço de arquivo reservado do superusuário. O sistema de arquivos possui esse espaço para manter um sistema operacional, caso uma tarefa do usuário preencha o disco. Esse espaço (imho por padrão 5%) é invisível para muitas ferramentas.

lsof pode mostrar qual processo bloqueou o arquivo, portanto, ele está gravando nele.

Alguém
fonte
11
Você também pode ajustar essa porcentagem de reserva usando o tune2fs. Essa pode ser uma maneira rápida de permitir que o servidor continue em execução enquanto você libera espaço em disco.
precisa
1

Além do arquivo ser aberto por um processo, um segundo caso é quando você possui um sistema de arquivos que suporta instantâneos como btrfsou ZFS.

Por exemplo, você tira uma captura instantânea com esse enorme arquivo de log existente. Se você excluir o arquivo agora, excluirá apenas o delta. E o delta é excluído apenas quando o arquivo não está em uso.

Veja também:

Um terceiro caso é quando você possui um sistema de arquivos que suporta a desduplicação no nível de bloco e a maior parte do arquivo é idêntica a outro arquivo. Não espero que isso aconteça para um log, a menos que você tenha um contêiner ou VM que esteja enviando os logs para um contêiner syslog ou VM que compartilhem o mesmo FS para que o conteúdo do log seja idêntico.

Mircea Vutcovici
fonte