Entendendo du vs df: Medindo o Uso de Disco Corretamente

Entendendo du vs df: Medindo o Uso de Disco Corretamente

O Que Voce Vai Aprender

  • Explicar os papeis diferentes de du e df
  • Entender por que df mostra cheio mas os totais de du nao batem
  • Resolver sozinho o misterio "deletei mas o espaco nao voltou"
  • Dominar um padrao sistematico de investigacao para incidentes de disco cheio

Publico-alvo: Iniciantes em Linux, qualquer pessoa que usa du e df sem entende-los completamente

Introducao: O Incidente de Disco Cheio da Lina

Lina: Linny-senpai, grande problema. O disco do servidor bateu 100% do nada. Verifiquei os maiores arquivos com du, mas o total nem chega perto. O que esta acontecendo?
Veterano Linny: Ah, classico "divergencia entre du e df." Muita gente tropeqa nisso.
Lina: Espera, du e df nao sao basicamente a mesma coisa?
Veterano Linny: Parecem similares, claro. Mas na verdade estao medindo coisas completamente diferentes. Vamos percorrer a diferenca e por que os numeros divergem.

A Resposta Curta

  • df = espaco livre por sistema de arquivos (visao do ponto de montagem)
  • du = uso por diretorio ou arquivo (agregacao baseada em caminho)
  • Divergencias vem principalmente de arquivos deletados mas abertos, limites de montagem e blocos reservados para root

df - Espaco Livre por Sistema de Arquivos

Conclusao: df mostra espaco livre por sistema de arquivos e retorna instantaneamente.

Veterano Linny: Vamos comecar com df. Significa "disk free" e reporta espaco total, usado e disponivel por sistema de arquivos, ou seja, por ponto de montagem.
Lina: Por sistema de arquivos...?
Veterano Linny: Isso. Cada local montado (/, /home, um drive USB em /mnt/usb) e contado separadamente.

Experimente

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   42G  5.5G  89% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda2       100G   60G   40G  61% /home

Como Interpretar

  • Filesystem: Nome do dispositivo (ex.: /dev/sda1)
  • Size: Capacidade total
  • Used: Espaco usado
  • Avail: Espaco livre
  • Use%: Percentual de uso (fique atento acima de 90%)
  • Mounted on: Ponto de montagem
Lina: O que o -h faz?
Veterano Linny: Abreviacao de --human-readable. Mostra tamanhos como 50G ou 5.5G em vez de kilobytes brutos. Sem -h, voce ve numeros como 52428800 -- bem dificil de ler.
Lina: E, contar zeros cansa rapido...

Opcoes Comuns

$ df -h          # Unidades legiveis (G, M, K)
$ df -T          # Mostrar tambem o tipo de sistema de arquivos (ext4, xfs, etc.)
$ df -i          # Mostrar uso de inodes em vez de bytes
$ df -h /var     # Apenas o sistema de arquivos que contem este caminho

Nao Esqueca do df -i

Quando voce ve "No space left" apesar de ter bastante espaco em bytes, exaustao de inodes e frequentemente a causa (tipicamente por muitos arquivos pequenos). Sempre verifique ambos df -h e df -i.

du - Uso por Diretorio

Conclusao: du percorre arquivos para totalizar o uso; -sh fornece o resumo.

Veterano Linny: Agora, du. Significa "disk usage" e percorre os arquivos sob o caminho dado para calcular o tamanho total.
Lina: Percorre os arquivos -- quer dizer que ele realmente visita cada um?
Veterano Linny: Sim. Entao du em um diretorio enorme pode demorar bastante. Isso e o oposto de df, que retorna instantaneamente.

Experimente

$ du -sh /var/log
1.2G    /var/log

Combinacoes Uteis de Opcoes

  • -s (summary): Mostrar apenas o total
  • -h (human-readable): Unidades amigaveis
  • --max-depth=N: Limitar a recursao a N niveis

-sh e a combinacao essencial -- memorize.

Encontrar Subdiretorios Pesados por Nivel

$ du -h --max-depth=1 /var
4.0K    /var/games
1.2G    /var/log
512M    /var/cache
24M     /var/lib
1.7G    /var
Lina: Nossa, isso e super util.
Veterano Linny: Nao e? E se voce ordenar por tamanho alem disso, os maiores responsaveis aparecem imediatamente.

Ordenar por Tamanho

$ du -sh /var/* 2>/dev/null | sort -h
4.0K    /var/games
4.0K    /var/opt
24M     /var/lib
512M    /var/cache
1.2G    /var/log

Pontos-chave

  • 2>/dev/null: Suprimir erros de permissao negada de subdiretorios inacessiveis
  • sort -h: Ordenar corretamente com unidades legiveis (trata 1.2G como maior que 512M)

sort -n simples so olha o numero inicial, entao colocaria 1.2G antes de 512M. Use -h.

A Diferenca Decisiva Entre du e df

Conclusao: df mede sistemas de arquivos, du mede diretorios.

Lina: Estou comecando a entender... entao qual e exatamente a diferenca fundamental?
Veterano Linny: Em uma frase: eles olham para camadas diferentes do mesmo sistema. Uma tabela lado a lado deixa claro.

Tabela Comparativa

Aspecto df du
Unidade Sistema de arquivos Diretorio / arquivo
Como obtem os dados Do superbloco Percorre os arquivos diretamente
Velocidade Instantaneo Lento em caminhos grandes
Arquivos deletados mas abertos Incluidos Nao incluidos
Outras montagens Contadas separadamente Cruza por padrao (bloquear com -x)
Blocos reservados para root Afeta Avail Sem efeito
Lina: Entendi, entao quando df diz "90% cheio" mas du so encontra 60% em arquivos, e exatamente essa diferenca?
Veterano Linny: Exatamente. Vamos ver as tres causas principais uma por uma.

Causa #1: Arquivos Deletados Mas Abertos

Conclusao: Arquivos deletados mas abertos sao contados pelo df mas nao pelo du.

Veterano Linny: A causa numero um de divergencia entre df e du: "arquivos que foram deletados mas ainda estao abertos por um processo."
Lina: Deletados mas ainda abertos...? Como isso e possivel?
Veterano Linny: No Linux, rm nao remove verdadeiramente um arquivo enquanto um processo ainda o tem aberto. Os dados permanecem ate o ultimo descritor de arquivo ser fechado. Imagine alguem executando rm /var/log/access.log enquanto o nginx ainda esta escrevendo nele.
Lina: Entao o log parece ter sido removido, mas secretamente ainda esta consumindo disco?
Veterano Linny: Exatamente. du nao consegue encontra-lo porque nao ha mais um nome de arquivo para percorrer. Mas df ve os blocos como ainda alocados. Dai vem a diferenca.

Encontrar Arquivos Deletados Mas Abertos

$ sudo lsof | grep deleted
nginx     1234  root  5w  REG  8,1  524288000  ... /var/log/nginx/access.log (deleted)
mysqld    5678  mysql 7w  REG  8,1  104857600  ... /tmp/ibdata.tmp (deleted)

Como Interpretar

  • Coluna 1: Nome do processo (nginx, mysqld)
  • Coluna 2: PID (ID do processo)
  • Coluna 7: Tamanho em bytes
  • (deleted) ao final: Indicador de arquivos que foram desvinculados mas ainda estao abertos

Liberar o Espaco

# Reiniciar ou recarregar o processo que mantem o arquivo
$ sudo systemctl restart nginx
$ sudo systemctl reload mysql

# Avancado: redirecionar o fd aberto sem reiniciar
# (ex.: truncar /proc/<PID>/fd/<N> para /dev/null -- territorio de especialista)

Verifique o Impacto Antes de Reiniciar

Antes de systemctl restart em producao, confirme a janela de indisponibilidade e quaisquer servicos dependentes. Veja No space left on device para o guia completo de incidentes.

Causa #2: Limites de Montagem

Conclusao: du cruza montagens por padrao; use -x para corresponder ao df.

Lina: Quais sao as outras duas causas?
Veterano Linny: Uma sao os limites de montagem. Imagine /home montado em sua propria particao. O que acontece quando voce executa du -sh /?
Lina: Hmm... incluiria /home no total?
Veterano Linny: Certo -- por padrao, du cruza pontos de montagem. Mas df conta cada sistema de arquivos separadamente. Entao du -sh / pode resultar maior que o numero do df para /.
# Permanecer dentro de um sistema de arquivos (corresponde ao escopo do df)
$ sudo du -sh -x /

-x (--one-file-system)

Isso diz ao du para agregar apenas arquivos no mesmo sistema de arquivos que o caminho inicial. Torna o resultado diretamente comparavel ao df.

Causa #3: Blocos Reservados para Root

Conclusao: ext4 reserva ~5% para root, entao o Avail do df parece menor.

Veterano Linny: A ultima e sutil mas importante. Sistemas de arquivos como ext4 reservam 5% da capacidade para o usuario root por padrao.
Lina: Por que reservar algo?
Veterano Linny: Para que o root ainda possa operar (ex.: remover arquivos, executar reparos) mesmo quando usuarios regulares enchem o disco. A coluna Avail do df subtrai esse bloco reservado. E por isso que Size - Used nem sempre e igual a Avail.
# Verificar a contagem de blocos reservados
$ sudo tune2fs -l /dev/sda1 | grep -i reserved
Reserved block count:     655360
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)

Reduza a Reserva com Cuidado

Voce pode diminui-la com tune2fs -m 1 /dev/sda1, mas mantenha a reserva no sistema de arquivos raiz. Considere diminuir apenas em particoes dedicadas a dados.

O Padrao Pratico de Investigacao

Conclusao: Execute df -h, depois df -i, depois du, depois lsof nessa ordem.

Lina: Agora entendo as diferencas. Entao quando alguem diz "o disco esta cheio", o que eu realmente faco?
Veterano Linny: Boa pergunta. Ter um procedimento fixo evita que voce entre em panico e quebre coisas.

Guia de Investigacao de Disco (de cima para baixo)

  1. Visao geral: df -h (qual sistema de arquivos esta cheio?)
  2. Verificar inodes tambem: df -i (caso de exaustao por arquivos pequenos)
  3. Encontrar diretorios pesados: sudo du -h --max-depth=1 / 2>/dev/null | sort -h
  4. Se df e du discordam: sudo lsof | grep deleted
  5. Limpar logs antigos: Procure em /var/log por arquivos .gz rotacionados
  6. Nao libera?: Reinicie o servico que mantem o arquivo com systemctl restart

Comandos para Cada Etapa

# 1. Visao geral
df -h

# 2. Verificacao de inodes
df -i

# 3. Detalhar diretorios pesados (um nivel por vez)
sudo du -h --max-depth=1 / 2>/dev/null | sort -h
sudo du -h --max-depth=1 /var 2>/dev/null | sort -h
sudo du -h --max-depth=1 /var/log 2>/dev/null | sort -h

# 4. Arquivos deletados abertos (ordenados por tamanho, maior primeiro)
sudo lsof | grep deleted | sort -k7 -n -r | head

# 5. Buscar arquivos grandes individualmente
sudo find / -type f -size +100M 2>/dev/null

Mini Exercicios: Experimente no Seu Sistema

Conclusao: Tres exercicios: uso, diretorios maiores e explicar a diferenca entre df e du.

Veterano Linny: Para fixar o conhecimento, execute estes no seu proprio sistema.

Exercicio 1: Mostre o uso da sua particao /.

Exercicio 2: Encontre os 3 maiores diretorios diretamente abaixo do seu home.

Exercicio 3: Compare df -h com sudo du -sh -x /, depois explique a diferenca em uma frase.

Dica para o Exercicio 1
df -h /

A coluna Use% mostra o uso. Qualquer coisa acima de 90% merece limpeza.

Dica para o Exercicio 2
du -h --max-depth=1 ~ 2>/dev/null | sort -h | tail -3

tail -3 pega as tres maiores entradas.

Dica para o Exercicio 3

Razoes comuns para os numeros divergirem:

  • Arquivos deletados mas ainda abertos (contados apenas pelo df)
  • Limites de montagem (a menos que du -x seja usado)
  • Blocos reservados para root do ext4 (afeta o Avail do df)

Armadilhas Comuns

Conclusao: Verifique tamanhos com ls -lh antes de deletar; prefira truncate.

Tres Padroes a Evitar

  1. Executar du -sh / via SSH sem nohup --> a varredura morre se sua sessao desconectar no meio
  2. Deletar arquivos baseado apenas no df --> inutil quando a causa sao arquivos deletados abertos
  3. rm -rf /tmp/* como limpeza geral --> corrompe arquivos de trabalho de aplicacoes em execucao

Habitos Seguros

  • Use sudo du -sh /* para detalhar a partir do nivel superior, nao varrer toda a arvore de uma vez
  • Sempre execute ls -lh primeiro para verificar o tamanho e timestamp antes de deletar
  • Para logs grandes, prefira truncate -s 0 logfile em vez de rm -- esvazia o arquivo no lugar, mesmo enquanto um processo o mantem aberto

Proximas Leituras