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
duedf - Entender por que o
dfmostra cheio mas os totais dodunã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 | Bsignifica "processar o resultado de A com B". grep: é o comando que procura texto.grep deletedsignifica "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
du, mas o total nem chega perto. O que está acontecendo?du e df não são basicamente a mesma coisa?A Resposta Curta
df= espaço livre por sistema de arquivos (visão do ponto de montagem)du= uso por diretório ou arquivo (agregação baseada em caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório.)- Divergências vêm principalmente de arquivos deletados mas abertos, limites de montagem e blocos reservados para rootA conta de administrador especial que pode fazer qualquer coisa no sistema.
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:
dfmostra espaço livre por sistema de arquivos e retorna instantaneamente.
df. Significa "disk free". Ele reporta espaço total, usado e disponível por sistema de arquivos./, /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 totalUsed: Espaço usadoAvail: Espaço livreUse%: Percentual de uso (fique atento acima de 90%)Mounted on: Ponto de montagem
-h faz?--human-readable. Ele mostra tamanhos como 50G ou 5.5G em vez de kilobytes brutos.-h, você vê números como 52428800. Contar os dígitos dá trabalho.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:
dupercorre arquivos para totalizar o uso;-shfornece o resumo.
du. Significa "disk usage". Ele percorre os arquivos sob o caminho dado e soma o tamanho.du em um diretório enorme pode demorar bastante.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
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: descarta os erros de permissãoAs regras de acesso de leitura / escrita / execução definidas em um arquivo ou diretório. negada de subdiretórios inacessíveissort -h: ordena corretamente tamanhos com unidade (trata1.2Gcomo maior que512M)
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:
dfmede sistemas de arquivos,dumede diretórios.
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 |
df diz 90% cheio mas o du só encontra 60% em arquivos, é exatamente essa diferença.Causa #1: Arquivos Deletados Mas Abertos
Conclusão: Arquivos deletados mas abertos são contados pelo
dfmas não pelodu.
df e du é esta: arquivos que foram deletados mas ainda estão abertos por um processo.Lina se enrola: o log sumiu mas o espaço não voltou
/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% /
rm nem sempre remove os dados na hora.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.df e du divergirem, vou suspeitar primeiro de um arquivo deletado e aberto.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:
ducruza montagens por padrão; use-xpara corresponder aodf.
/home montado em sua própria partição. O que acontece quando você executa du -sh /?/home no total.du cruza pontos de montagem.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
dfparece menor.
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, depoisdf -i, depoisdu, depoislsofnessa ordem.
Guia de Investigação de Disco (de cima para baixo)
- Visão geral:
df -h(qual sistema de arquivos está cheio?) - Verificar inodes também:
df -i(caso de exaustão por arquivos pequenos) - Encontrar diretórios pesados:
sudo du -h --max-depth=1 / 2>/dev/null | sort -h - Se df e du discordam:
sudo lsof | grep deleted - Limpar logs antigos: Procure em
/var/logpor arquivos.gzrotacionados - 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.
lsof e o --max-depth não fazem parte do terminalUm programa interativo que interpreta os comandos digitados e os executa. virtual deste site.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 -xseja usado) - Blocos reservados para root do ext4 (afetam o
Availdodf)
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 -lhantes de deletar; prefiratruncate.
Três Padrões a Evitar
- Executar
du -sh /via SSH semnohup--> a varredura morre se a sua sessão desconectar - Deletar arquivos só com base no
df--> não adianta quando a causa é um arquivo deletado e aberto rm -rf /tmp/*como limpeza geral --> corrompe arquivos de trabalho de aplicações em execução
Hábitos Seguros
- Escrito de qualquer jeito, o
duconta 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
tmuxou doscreenpara que uma queda de conexão não interrompa - Rode
ls -lhprimeiro para conferir o tamanho e a data antes de deletar qualquer coisa - Para logs grandes, prefira
truncate -s 0 logfileem vez derm
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
df conta por sistema de arquivos e o du conta por diretório.sudo lsof | grep deleted primeiro. Guarde essa ordem e você vai bem.Resumo em 3 Linhas
- O
dfmostra o espaço livre por sistema de arquivos e odumostra o uso por diretório - As três causas usuais da diferença são arquivos deletados e abertos, limites de montagem e blocos reservados para root
- Investigue nesta ordem:
df -h,df -i,du --max-depth=1,lsof | grep deleted