Servidor Linux sem espaço

29

Fiz esta pergunta em duas entrevistas consecutivas, mas depois de algumas pesquisas e verificação com vários administradores de sistemas, não recebi uma boa resposta. Eu estou querendo 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?

    
por ewwhite 05.03.2012 / 02:29

6 respostas

54

Esta é uma questão comum de entrevista e uma situação que surge em uma variedade de 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 todas as alças de arquivo tenham sido fechadas (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 comando lsof .

A outra parte da pergunta pode ser "como você limpa um arquivo que está sendo gravado sem matar o processo?" Idealmente, você " zero "ou" trunca "o arquivo de log com algo como : > /var/log/logfile em vez de excluir o arquivo.

    
por 05.03.2012 / 02:37
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 de diretório; os dados do arquivo e o inode ficam suspensos até que a última referência a ele tenha sido removida.

É uma prática comum para um serviço criar um arquivo temporário e excluí-lo imediatamente enquanto mantém o arquivo aberto. Isso cria um arquivo no disco, mas garante que o arquivo será excluído se o processo for finalizado de forma anormal, além de impedir que outros processos toquem 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 acessá-los convenientemente como /proc/<pid>/fd/<filenumber> .

    
por 05.03.2012 / 03:18
8

Eu não sou um administrador de sistema, mas pelo que eu juntei no Unix.SE, um sistema Linux não irá realmente deletar um arquivo (marque o espaço como livre / reutilizável) depois que ele for desvinculado até que todos os descritores apareçam para eles foram fechados. Então, para responder a primeira parte, o espaço ainda não está livre porque um processo ainda está lendo. Para responder ao segundo, você pode ver qual processo está usando o arquivo com lsof .

    
por 05.03.2012 / 02:42
1

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

lsof pode mostrar a você, qual processo bloqueou o arquivo, ergo está escrevendo para ele.

    
por 05.03.2012 / 02:35
1

Uma resposta alternativa além da resposta óbvia de link físico / arquivo aberto: esse arquivo é um arquivo (muito) esparso, como /var/log/lastlog no RHEL, que na verdade não ocupava todo esse espaço. A exclusão teve um impacto muito pequeno, portanto, é necessário analisar o próximo arquivo maior.

    
por 05.03.2012 / 18:03
0

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

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

Veja também:

Um terceiro caso é quando você tem um sistema de arquivos que suporta desduplicação em nível de bloco e a maior parte do arquivo é idêntica a outro arquivo. Eu 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 compartilhe o mesmo FS para que o conteúdo do log seja idêntico.

    
por 16.12.2015 / 07:26