df no linux não mostra o espaço livre correto após a remoção do arquivo

143

Eu tenho servidores de arquivos que são usados ​​para armazenar arquivos. Os arquivos podem residir lá por uma semana ou por um ano. Infelizmente, quando removo arquivos do servidor, o dfcomando não reflete o espaço liberado. Por fim, o servidor fica cheio ( dfmostra 99%) e meu script não envia mais arquivos para lá, exceto que pode haver algumas dezenas de GB de espaço livre lá.

Eu tenho noatimeflag nas partições montadas, se isso faz alguma diferença.

Aminah Nuraini
fonte
Isso está acontecendo em uma única partição ou em todas as partições?
Khaled
Bem, isso está acontecendo na minha partição principal de dados, que é a única com a qual me preocupo, já que apenas escrevo / removo arquivos nela.
Por favor, esclareça-me com a solução ou um link para um.
Quais sistemas de arquivos? O DF faz uma estatística do superbloco, pode ser que o seu sistema de arquivos não esteja atualizando o inode sb. Você já tentou liberar o cache?
beans
Usando ext4. Como você limpa os caches?

Respostas:

236

A exclusão do nome do arquivo não exclui o arquivo. Algum outro processo está mantendo o arquivo aberto, fazendo com que ele não seja excluído; reinicie ou interrompa esse processo para liberar o arquivo.

Usar

lsof +L1

para descobrir qual processo está usando um arquivo excluído (não vinculado).

Ignacio Vazquez-Abrams
fonte
2
Os arquivos removidos não foram acessados ​​em mais de um mês, e o único processo que os acessa é o nginx, portanto é duvidoso.
39
+1. Além disso, "lsof + L1" informará qual programa está mantendo os arquivos abertos.
pehrs
4
como o root executa o "lsof -n | arquivo grep", você ficaria surpreso com o tempo de duração dos arquivos, devido aos processos que os mantêm abertos por qualquer motivo. Se tudo mais falhar, reinicie, eu me sinto mal sugerindo, mas com certeza garantirá que nada ocorra no arquivo. Por par, lsof + L1 é provavelmente o melhor caminho a percorrer.
ScottZ
3
Você acabou de me salvar! Excluiu um arquivo de log 93G e não recuperou o espaço e não conseguiu entender o porquê. Obrigado.
Lucas Cousins
1
Na mesma linha e no caso de esta ajuda os outros, eu apaguei um arquivo grande nginx access.log mas só foi capaz de recuperar o espaço após nginx reiniciar: Serviço nginx restart
Nick
28

como Ignacio menciona, excluir o arquivo não liberará espaço até você excluir os processos que possuem identificadores abertos nesse arquivo.

No entanto, você pode recuperar o espaço sem matar os processos. Tudo que você precisa fazer é remover os descritores de arquivo.

Primeiro execute lsof | grep excluído para identificar o processo que contém o arquivo

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Em seguida, execute:

cd /proc/PID/fd

então

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

O "1" será o descritor de arquivo. Agora digite "> FD" para recuperar esse espaço

> 1

Pode ser necessário repetir a operação se houver outros processos mantendo o arquivo.

Adrián Deccico
fonte
1
o que > FDfaz?
Pred
remove o descritor de arquivo
Adrián Deccico
2
este >comando tem um nome? eu tive que mudar do zsh para o bash para poder usá-lo. É possível executá-lo no zsh?
Ariera
1
é um redirecionamento de saída e, portanto, trunca o arquivo. O longo de seria "echo -n> 1" ou "true> 1". Realmente não remove o FD, apenas aponta para um arquivo vazio depois.
Eckes
8

Uma possibilidade é que os arquivos que você excluiu tenham mais referências no sistema de arquivos. Se você criou links físicos, vários nomes de arquivos apontarão para os mesmos dados, e os dados (o conteúdo real) não serão marcados como livres / utilizáveis ​​até que todas as referências a eles sejam removidas. Antes de excluir os arquivos, stat-los (entrada denominada links) ou ls -l neles (deve ser a segunda coluna).

Se os arquivos forem referenciados em outro lugar, acho que você precisará ls -i o (s) arquivo (s) para encontrar o número do inode e, em seguida, faça uma busca com -inum <inode-number> para encontrar o outras referências a esse arquivo (você provavelmente também deseja usar -mount para permanecer no mesmo sistema de arquivos).

Kjetil Joergensen
fonte
4

O arquivo ainda está bloqueado pelo processo de abertura. Para liberar espaço, siga estas etapas:

  1. Execute sudo lsof | grep deletede veja qual processo está mantendo o arquivo. Resultado de exemplo:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Mate o processo usando sudo kill -9 {PID}. Na amostra acima, o PID é 1623.

    $ sudo kill -9 1623
    
  3. Execute dfpara verificar se o espaço já está liberado. Se ainda estiver cheio, talvez você precise esperar alguns segundos e verificar novamente.

Aminah Nuraini
fonte
4

Se a partição foi configurada para reservar determinada parte do espaço em disco apenas para uso raiz, dfnão incluirá esse espaço como disponível.

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Mesmo após o espaço ser recuperado pela exclusão de arquivos / diretórios, o usuário não root não poderá gravar em uma partição específica.

Você pode verificar facilmente se esse é o seu caso, tentando criar um arquivo em um dispositivo como usuário root e não root.

Além disso, você pode verificar a configuração do sistema de arquivos executando

tune2fs -l <device> | egrep "Block count|Reserved block count

e calculando a porcentagem real por conta própria.

Para alterar o disco% reservado para uso somente raiz, execute

tune2fs -m <percentage> <device>
luka5z
fonte
1

As outras respostas estão corretas: se você excluir um arquivo e o espaço não for liberado, geralmente é porque o arquivo ainda é mantido aberto ou há outros links para ele.

Para ajudar na solução de problemas, use uma ferramenta que indique onde o espaço da unidade está sendo gasto: Você pode usar dupara obter uma visão geral de onde o espaço está indo. Melhor ainda, use uma ferramenta gráfica como xdiskusage (existem muitas como esta) para caçar o culpado. O xdiskusage e os amigos permitem pesquisar os maiores porcos espaciais para descobrir para onde o espaço está indo.

Dessa forma, você encontrará rapidamente arquivos que ainda ocupam espaço por causa de um segundo link físico. Ele também mostrará o espaço ocupado por arquivos excluídos, mas abertos (como (permissão negada), acredito, pois não pode ler o nome do arquivo).

sleske
fonte
1

Desde que eu sei que muitos de vocês estão fazendo isso para redhat in /vare gzipping de arquivos, esperando que o FS encolha, mas, em vez disso, ele cresce, apenas certifique-se de reiniciar o syslog do serviço. e

lsof -v file

mostraria isso de qualquer maneira.

user1802263
fonte
1
Isso realmente não adiciona muito; a resposta aceita cobriu a lógica por trás disso em 2001. Quando você tiver 50 representantes, use comentários se desejar adicionar qualificadores às respostas existentes.
Andrew B /
0

Mais uma opção: o disco pode estar cheio devido a um processo que cria continuamente dados: logs, núcleos e similares. É possível que o espaço esteja realmente sendo liberado, mas seja imediatamente preenchido. Eu realmente vi esse caso. dfneste caso, simplesmente não mostra a imagem do buraco. Use dupara aprender mais.

Chen Levy
fonte
0

Estou usando EXT2, o FSCK me ajudou nessa situação. Tente shudown -F agora, depois de algumas reinicializações e fscks, vejo metade do espaço usado.

Marcellus
fonte
1
Caro Marcellus, sua solução é abrangida pela resposta aceita; e às vezes você não quer fazer uma reinicialização se você não é obrigado a ...
Deer Hunter
-1

Para verificar quais arquivos excluídos ocuparam memória, digite o comando

 $ sudo lsof | grep deleted

Ele mostrará os arquivos excluídos que contêm memória.

Em seguida, mate o processo com pid ou nome

$ sudo kill <pid>
$ df -h

verifique agora você terá a mesma memória

Caso contrário, digite o comando abaixo para ver qual arquivo está ocupando memória

# cd /
# du --threshold=(SIZE)

mencione qualquer tamanho, ele mostrará quais arquivos estão ocupando acima do tamanho limite e exclua o arquivo que você encontrará na memória retida

Javeed Shakeel
fonte
-4

terminal aberto tente este comando df -Em seguida, use este comando sudo du -h --max-depth = 1 / neste comando você encontrará detalhes de uso do disco e, em seguida, será aberto como usuário root excluir o arquivo (root-local-share-lixo) e exclua seu arquivo

rilson
fonte