Sistema de arquivos Linux; diferença no cálculo do tamanho usando df e du

8

Quando executo df, mostra que o dispositivo raiz está cheio.

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  9.4G     0 100% /

Eu olhei para o inodeuso e há praticamente espaço disponível para o dispositivo raiz

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1               640K    103K    538K   16% /

Mas, quando eu executar o ducomando, ele mostra que tenho usado apenas 2Gfora de 9.9G.

ip-XXX-XXX-XXX-XXX:/$ du -xh --max-depth=1
14M ./etc
4.0K ./mnt
96K ./tmp
3.5M ./bin
0   ./sys
964K ./boot
4.0K ./srv
0   ./dev
55M ./lib
25M ./root
1.1G ./usr
4.0K ./opt
846M ./var
4.3M ./sbin
23M ./home
16K ./lost+found
0   ./proc
2.0G .

Isso só me deixa louco e interessante também. Esse é um grande problema para nós, pois o disco raiz /está cheio e algumas das funções do nosso site estão falhando.

Por favor, ajude-me a resolver (também entender) esse problema.

Obrigado.

Rakesh Sankar
fonte
2
Veja a confusão de espaço livre em disco do linux e outras +df +duperguntas em Unix e Linux .
Gilles 'SO- stop be evil'
@ Gilles como você disse, eu corri du -x /e vejo apenas 2G é usado e calculei o tamanho do inode que é 160M. Isso me ajudou a entender as coisas, mas eu só quero resolver esse problema.
precisa
Você correu ducomo root? Caso contrário, ele só poderá relatar os arquivos que você pode acessar.
Gilles 'SO- stop be evil'
@Gilles Estou correndo comoroot
Rakesh Sankar
Não tenho muito a acrescentar aqui além do ótimo ncduprograma, que ajuda a visualizar o uso do disco.
Rob

Respostas:

4

Quando os arquivos são excluídos no * nix, eles permanecem no disco (e ocupam espaço em disco) enquanto o processo os abrir. É bastante comum tirar vantagem disso para "proteger" os arquivos temporários, criando-os com um tamanho pequeno, excluindo-os e depois usando o arquivo excluído para armazenar dados sem ter que se preocupar com outros processos (facilmente) obtendo acesso a eles, portanto a quantidade de espaço nos arquivos excluídos pode aumentar bastante se, digamos, um banco de dados temporário ou uma sessão de edição de multimídia estiverem sendo tratados dessa maneira. Outra possibilidade de como você poderia ter tanto espaço "perdido" seria se o sistema fosse atualizado (várias vezes) sem reiniciar ou reiniciar programas, resultando em todas as suas antigas bibliotecas .so sendo mantidas abertas por programas iniciados antes da instalação. atualizar e ainda estão em execução.

dfvê o espaço usado por esses arquivos porque apenas analisa quanto espaço está alocado no dispositivo, mas dunão os vê porque não existem entradas de diretório correspondentes.

Um espaço usado "oculto" como esse só pode ser liberado quando processos que excluíram arquivos abertos os fecham. Você pode encontrar esses processos com o fusercomando e finalizá-los (ou, por muitos daemons, enviar um sinal solicitando que eles fechem e reabram todos os arquivos abertos).

Dave Sherohman
fonte
obrigado, boas informações, algo (mais) que eu entendo hoje. Mas, para encontrar um hiddenespaço usado, tento executar o fusercomando para ver todos os arquivos que estão sendo usados ​​por um processo, mas desvinculados - não consegui encontrar nenhum. Você tem algum comando ou direção que me leva a encontrá-lo? Este é o comando que eu usofuser -v -a /
Rakesh Sankar 30/06
Eu tive que reiniciá-lo para me livrar do espaço oculto, mas não consegui encontrar uma solução adequada para remover esses arquivos ocultos.
Rakesh Sankar
1

Houve momentos em que, se o disco ficar cheio, ele poderá ser confundido até a reinicialização / remontagem de que o disco ainda está cheio, mesmo quando você excluiu uma carga de arquivos.

BugFinder
fonte
Não consigo reiniciar, pois é um site de produção. Mas estou procurando uma solução que possa me ajudar a encontrar esses espaços ocultos e trazê-los de volta.
Rakesh Sankar 30/06
Talvez produção, mas às vezes uma reinicialização é a única resposta. Esse é o infeliz problema de ser o seu disco raiz e todo o seu SO estar nele. É por isso que muitos defendem o uso de tmp, var, home etc em outros discos, pois eles podem ser remontados. Parece ser mais comum que o sistema operacional não perceba que o espaço está disponível para o disco raiz.
BugFinder
1

Do meu lado, simplesmente reiniciei o syslogd para recuperar o espaço em disco. Eu tinha 3 GB faltando! Meu servidor estava em funcionamento há 250 dias.

Vincent Martineau
fonte
0

Existe uma maneira de limpar o espaço sem reiniciar o aplicativo. Aqui estão os detalhes:

  1. Digamos que você tenha um processo em fooexecução e criando um arquivo de 2 GB chamado abc.log. Agora diga que este abc.log foi excluído por outra pessoa.

  2. Seja foopid (digamos 123). Então /proc/123/fd, mostrará a lista de descritores de arquivos abertos por foo. Um com abc.log será exibido como excluído. Digamos que fdabs.log é 111. Se você executar less /proc/123/fd/111, ele ainda mostrará todos esses 2 GB de dados.

  3. Corra echo " " > /proc/123/fd/111. Isso substituirá o conteúdo por uma sequência vazia. Após esse comando, se você tentar, dfele mostrará 2 GB adicionais recuperados limpando o abc.log.

É isso aí. Eu tentei isso no CentOS e funciona.

Kaustubh Sathe
fonte
Isso é uma coisa útil para saber. Mas não é uma resposta para a pergunta.
Isaac Rabinovitch
desculpe meu ans foi mais direcionado para limpar o espaço em disco, se você souber o ID do processo que excluiu o arquivo. Para este caso específico, você deve examinar todos os arquivos em / proc / [0-9] * / fd, cumprimentar os excluídos e seguir a lógica mencionada acima.
Kaustubh Sathe
Se você está realmente curioso para saber qual arquivo estava causando o vazamento de espaço em disco, limpe o arquivo excluído de cada vez, verifique a saída df toda vez e registre essas informações.
Kaustubh Sathe