Entendendo du vs df: Medindo o Uso de Disco Corretamente

Entendendo du vs df: Medindo o Uso de Disco Corretamente

O que você vai conseguir fazer

  • Explicar que o `df` mede por sistema de arquivos e o `du` mede por diretório
  • Escolher entre `df -h`, `df -i`, `du -sh` e `du -h --max-depth=1` conforme o objetivo
  • Citar as três causas da diferença entre `df` e `du` e confirmá-las com `lsof | grep deleted`

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • Explicar os papéis diferentes de du e df
  • Entender por que o df mostra cheio mas os totais do du não batem
  • Resolver sozinha o mistério "deletei mas o espaço não voltou"
  • Dominar um padrão sistemático de investigação para incidentes de disco cheio

Público-alvo: Iniciantes em Linux. Quem usa du e df no feeling.

As palavras deste artigo

  • Sistema de arquivos: é a estrutura que divide o disco para uso. Neste artigo, leia como "uma unidade como / ou /home, cujo espaço é contado separadamente".
  • Montagem: é ligar um disco a um diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. para poder usá-lo. O diretório dessa ligação se chama "ponto de montagem".
  • inode: é a ficha que guarda os dados de controle de um arquivo. A quantidade dessas fichas tem limite.
  • Processo: é um programa em execução.
  • sudo: é a instrução que executa um comando com permissões de administrador. Você precisa dela para inspecionar arquivos de outras pessoas. Ela pode pedir uma senha.
  • Pipe (|): é o símbolo que passa o resultado do comando da esquerda para o da direita. A | B significa "processar o resultado de A com B".
  • grep: é o comando que procura texto. grep deleted significa "manter apenas as linhas que contêm a palavra deleted".

O centro deste artigo são o df e o du. Os dois apenas exibem informação. Nenhum deles apaga nem reescreve arquivos, então rodar não muda nada no disco.

A parte final do artigo traz comandos que apagam dados ou reiniciam serviços. Esses trazem avisos próprios.

Introdução: O Incidente de Disco Cheio da Lina

Lina: Linny-senpai, grande problema. O disco do servidor bateu 100% do nada.
Lina: Verifiquei os maiores arquivos com du, mas o total nem chega perto. O que está acontecendo?
Veterano Linny: Esse é o clássico "divergência entre du e df". Poucas pessoas entendem isso direito.
Lina: Espera, du e df não são basicamente a mesma coisa?
Veterano Linny: Parecem similares. Mas eles medem coisas diferentes. Vamos ver a diferença e por que os números divergem.

A Resposta Curta

Uma imagem para as duas visões

Pense em uma geladeira. O df é quem olha de fora e pergunta quanto espaço sobrou. O du é quem conta o que está em cada prateleira.

Os dois olham a mesma geladeira, mas contam de jeitos diferentes. Por isso as respostas podem divergir.

df - Espaço Livre por Sistema de Arquivos

Conclusão: df mostra espaço livre por sistema de arquivos e retorna instantaneamente.

Veterano Linny: Vamos começar com df. Significa "disk free". Ele reporta espaço total, usado e disponível por sistema de arquivos.
Lina: Por sistema de arquivos?
Veterano Linny: Por local montado, em palavras simples. /, /home e um drive USB em /mnt/usb são contados 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: Espaço usado
  • Avail: Espaço livre
  • Use%: Percentual de uso (fique atento acima de 90%)
  • Mounted on: Ponto de montagem
Lina: O que o -h faz?
Veterano Linny: É a abreviação de --human-readable. Ele mostra tamanhos como 50G ou 5.5G em vez de kilobytes brutos.
Veterano Linny: Sem o -h, você vê números como 52428800. Contar os dígitos dá trabalho.
Lina: É verdade, esse número não me diz nada de imediato.

Opções 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

Não Esqueça do df -i

Às vezes aparece "No space left" mesmo com bastante espaço em bytes. Nesse caso, a exaustão de inodes pode ser a causa. Isso acontece quando existem muitos arquivos pequenos.

Crie o hábito de verificar os dois: df -h e df -i.

du - Uso por Diretório

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

Veterano Linny: Agora vem o du. Significa "disk usage". Ele percorre os arquivos sob o caminho dado e soma o tamanho.
Lina: Percorre os arquivos. Ele visita cada um mesmo?
Veterano Linny: Visita. Por isso o du em um diretório enorme pode demorar bastante.
Veterano Linny: Isso é o oposto do df, que retorna instantaneamente.

Experimente

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

Combinações Úteis de Opções

  • -s (summary): Mostrar apenas o total
  • -h (human-readable): Unidades amigáveis
  • --max-depth=N: Limitar a recursão a N níveis

-sh é a combinação essencial -- memorize.

Encontrar Subdiretórios Pesados por Nível

$ 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 é muito útil.
Veterano Linny: É mesmo. E se você ordenar por tamanho além disso, os maiores diretórios aparecem de imediato.

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

O sort -n simples só olha o número inicial. Ele colocaria 1.2G antes de 512M, então use -h.

A Diferença Decisiva Entre du e df

Conclusão: df mede sistemas de arquivos, du mede diretórios.

Lina: Estou começando a entender. Então qual é exatamente a diferença fundamental?
Veterano Linny: Em uma frase, eles olham para camadas diferentes do mesmo sistema. Uma tabela lado a lado deixa isso claro.

Tabela Comparativa

Aspecto df du
Unidade Sistema de arquivos Diretório / arquivo
Como obtém os dados Do superbloco Percorre os arquivos diretamente
Velocidade Instantâneo Lento em caminhos grandes
Arquivos deletados mas abertos Incluídos Não incluídos
Outras montagens Contadas separadamente Cruza por padrão (bloquear com -x)
Blocos reservados para root Afeta Avail Sem efeito
Lina: Entendi. Então, quando o df diz 90% cheio mas o du só encontra 60% em arquivos, é exatamente essa diferença.
Veterano Linny: Exatamente. As causas principais são três. Vamos ver uma por uma.

Causa #1: Arquivos Deletados Mas Abertos

Conclusão: Arquivos deletados mas abertos são contados pelo df mas não pelo du.

Veterano Linny: A causa número um da divergência entre df e du é esta: arquivos que foram deletados mas ainda estão abertos por um processo.
Lina: Deletados mas ainda abertos? Como isso é possível?

Lina se enrola: o log sumiu mas o espaço não voltou

Lina: Hoje eu removi o /var/log/nginx/access.log com rm. Ele tinha 500 MB, mas o df -h não mostra nem um byte liberado. Deletei do jeito errado?
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   42G  5.5G  89% /
Lina: O arquivo sumiu da listagem, mas o uso continua em 42G. Ele foi deletado mesmo?
Veterano Linny: Você deletou certo. No Linux, o rm nem sempre remove os dados na hora.
Veterano Linny: Enquanto um processo mantém o arquivo aberto, os dados ficam. Aqui, o nginx em execução ainda tem esse log aberto.
Lina: Então só o nome sumiu e o conteúdo ficou. Eu não esperava isso.
Veterano Linny: Isso. O du conta percorrendo nomes, então não enxerga esses dados. O df conta o que o sistema de arquivos ainda tem alocado, então enxerga.
Lina: Faz sentido. Quando df e du divergirem, vou suspeitar primeiro de um arquivo deletado e aberto.
Veterano Linny: Pense no rm como o comando que remove um nome. Os dados são liberados quando todo mundo que os mantém abertos fecha.

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, o número atribuído a um processo
  • Coluna 7: tamanho em bytes
  • (deleted) ao final: o indicador de arquivos desvinculados mas ainda abertos

O lsof é a abreviação de "list open files". Ele só lista o que está aberto, então rodar não muda nada.

Liberar o Espaço

# 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

O systemctl restart para o serviço por um momento. Se algo falhar, o serviço fica fora do ar e deixa de responder.

Antes de rodar em produção, confirme dois pontos.

  • Se esta é uma janela em que o serviço pode parar
  • Se algum outro serviço depende dele

Para praticar com segurança, use um ambiente de estudo ou um serviço cuja parada não custa nada. Veja No space left on device para o guia completo de incidentes.

Causa #2: Limites de Montagem

Conclusão: du cruza montagens por padrão; use -x para corresponder ao df.

Lina: Quais são as outras duas causas?
Veterano Linny: Uma são os limites de montagem. Imagine /home montado em sua própria partição. O que acontece quando você executa du -sh /?
Lina: Acho que incluiria /home no total.
Veterano Linny: Certo. Por padrão, o du cruza pontos de montagem.
Veterano Linny: Mas o df conta cada sistema de arquivos separadamente. Então du -sh / pode dar um número maior que o 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 do caminho inicial. Assim o resultado fica diretamente comparável ao df.

Causa #3: Blocos Reservados para Root

Conclusão: ext4 reserva ~5% para root, então o Avail do df parece menor.

Veterano Linny: A última é sutil, mas importante. Sistemas de arquivos como o ext4 reservam 5% da capacidade para o usuário root por padrão.
Lina: Por que reservar alguma coisa?
Veterano Linny: Para o root ainda conseguir agir quando os usuários comuns enchem o disco. Ele pode remover arquivos ou executar reparos.
Veterano Linny: A coluna Avail do df subtrai esse bloco reservado. Por isso Size - Used nem sempre é 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

Você pode diminuí-la com tune2fs -m 1 /dev/sda1. Note que esse comando reescreve uma configuração do sistema de arquivos.

Mantenha a reserva no sistema de arquivos raiz. Considere diminuir apenas em partições dedicadas a dados.

Já o tune2fs -l apenas lista as configurações. Ele não muda nada.

O Padrão Prático de Investigação

Conclusão: Execute df -h, depois df -i, depois du, depois lsof nessa ordem.

Lina: Agora entendo as diferenças. Então, quando alguém diz que o disco está cheio, o que eu faço?
Veterano Linny: Boa pergunta. Um procedimento fixo evita que você entre em pânico e quebre coisas.

Guia de Investigação de Disco (de cima para baixo)

  1. Visão geral: df -h (qual sistema de arquivos está cheio?)
  2. Verificar inodes também: df -i (caso de exaustão por arquivos pequenos)
  3. Encontrar diretórios 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. Não libera?: Reinicie o serviço que mantém 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 Exercícios: Experimente no Seu Sistema

Conclusão: Três exercícios: uso, diretórios maiores e explicar a diferença entre df e du.

Lina: O conteúdo entrou. Quero testar na mão.
Veterano Linny: Boa, preparei três desafios. Todos apenas exibem informação, então você pode rodar quantas vezes quiser.
Veterano Linny: Mas rode esta seção em uma máquina Linux real ou no WSL. O lsof e o --max-depth não fazem parte do terminalUm programa interativo que interpreta os comandos digitados e os executa. virtual deste site.
Veterano Linny: Se o sudo não estiver disponível, fique dentro do seu próprio home.

Desafio 1: Mostre o uso da sua partição /.

Ver Dica 1 (Direcionamento)

Use o comando que olha o espaço livre por sistema de arquivos. Você não precisa contar diretórios um a um.

Acrescente a opção que imprime unidades amigáveis.

Ver Dica 2 (Nome do comando)

Use df. A opção de unidade amigável é -h. Passe / como o local a inspecionar.

Ver Resposta
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   42G  5.5G  89% /

A coluna Use% é o uso de /. Acima de 90%, considere fazer uma limpeza.

Desafio 2: Encontre os três maiores diretórios logo abaixo do seu home.

Ver Dica 1 (Direcionamento)

Agora use o comando que conta por diretório. Um nível de profundidade basta, então não desça mais.

Depois ordene o resultado por tamanho e pegue as últimas linhas.

Ver Dica 2 (Nome do comando)

Use du. Limite a profundidade com --max-depth=1. Ordene com sort -h.

Pegue as últimas linhas com tail. A última de todas é o total geral, então pegue uma linha a mais. O seu home pode ser escrito como ~.

Ver Resposta
$ du -h --max-depth=1 ~ 2>/dev/null | sort -h | tail -4
64M     /home/user/Documents
512M    /home/user/Downloads
1.2G    /home/user/Videos
2.5G    /home/user

O sort -h ordena do menor para o maior, então pegar o fim traz as maiores entradas.

A última linha é o total do próprio home. As três linhas acima dela são o top três real, e por isso usamos tail -4.

Desafio 3: Compare df -h / com sudo du -sh -x / e explique a diferença em uma frase.

Ver Dica 1 (Direcionamento)

Primeiro coloque os dois números lado a lado. Depois lembre das três causas descritas neste artigo.

Alguns dados são contados por apenas um dos dois.

Ver Dica 2 (Nome do comando)

Rode df -h / e sudo du -sh -x / em seguida. Se a diferença for grande, rode também sudo lsof | grep deleted.

Ver Resposta
$ df -h /
$ sudo du -sh -x /
$ sudo lsof | grep deleted | head

As três razões usuais são:

  • 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 (afetam o Avail do df)

Em uma frase: o df mostra o que o sistema de arquivos tem alocado e o du mostra o que ele alcança por nome, então os dados sem nome aparecem como diferença.

Armadilhas Comuns

Conclusão: Verifique tamanhos com ls -lh antes de deletar; prefira truncate.

Três Padrões a Evitar

  1. Executar du -sh / via SSH sem nohup --> a varredura morre se a sua sessão desconectar
  2. Deletar arquivos só com base no df --> não adianta quando a causa é um arquivo deletado e aberto
  3. rm -rf /tmp/* como limpeza geral --> corrompe arquivos de trabalho de aplicações em execução

Hábitos Seguros

  • Escrito de qualquer jeito, o du conta tudo abaixo do caminho indicado. A quantidade de varredura não diminui
  • Para reduzir só a saída, use sudo du -h --max-depth=1 / 2>/dev/null | sort -h. Os totais por nível mostram onde cavar em seguida
  • Rode investigações longas dentro do tmux ou do screen para que uma queda de conexão não interrompa
  • Rode ls -lh primeiro para conferir o tamanho e a data antes de deletar qualquer coisa
  • Para logs grandes, prefira truncate -s 0 logfile em vez de rm

Uma observação sobre o terceiro hábito. O truncate -s 0 esvazia o arquivo e o conteúdo não volta. O arquivo em si continua existindo, então o espaço é liberado com segurança mesmo com um processo o mantendo aberto.

Veja o tamanho com ls -lh antes e confirme que o conteúdo pode ser descartado.

Revisão

Lina: Vou resumir. O df conta por sistema de arquivos e o du conta por diretório.
Veterano Linny: Isso. Mesmo disco, mas um olha de fora e o outro conta por dentro.
Lina: Meu log não liberou espaço porque o nginx ainda tinha aquele arquivo aberto.
Veterano Linny: Boa memória. Quando os números divergirem, rode sudo lsof | grep deleted primeiro. Guarde essa ordem e você vai bem.

Resumo em 3 Linhas

  1. O df mostra o espaço livre por sistema de arquivos e o du mostra o uso por diretório
  2. As três causas usuais da diferença são arquivos deletados e abertos, limites de montagem e blocos reservados para root
  3. Investigue nesta ordem: df -h, df -i, du --max-depth=1, lsof | grep deleted

Próximas Leituras