
Quando resumir os tamanhos dos meus arquivos, obtenho um número. Se eu correr du
, recebo outro valor. Se eu executar du
todos os arquivos da minha partição, isso não corresponderá às df
declarações usadas. Por que existem tantos números diferentes para o tamanho total dos meus arquivos? Os computadores não podem adicionar?
Falando em somar: quando adiciono as colunas “Usado” e “Disponível” de df
, não obtenho o valor total. E esse valor total é menor que o tamanho da minha partição. E se eu somar os tamanhos das minhas partições, não obtenho o tamanho do meu disco! O que da?
Responder1
Somar números é fácil. O problema é que existem muitos números diferentes para somar.
Quanto espaço em disco um arquivo usa?
A ideia básica é que um arquivo contendonusos de bytesnbytes de espaço em disco, mais um pouco para algumas informações de controle: os metadados do arquivo (permissões, carimbos de data e hora, etc.) e um pouco de sobrecarga para as informações que o sistema precisa para descobrir onde o arquivo está armazenado. No entanto, existem muitas complicações.
Complicações microscópicas
Pense em cada arquivo como uma série de livros em uma biblioteca. Arquivos menores constituem apenas um volume, mas arquivos maiores consistem em muitos volumes, como uma enciclopédia. Para poder localizar os arquivos, existe um catálogo de fichas que faz referência a cada volume. Cada volume tem um pouco de sobrecarga devido às capas. Se um arquivo for muito pequeno, essa sobrecarga será relativamente grande. Além disso, o próprio catálogo de fichas ocupa algum espaço.
Indo um pouco mais técnico, em um típico sistema de arquivos simples, o espaço é dividido emblocos. Um tamanho de bloco típico é 4KiB. Cada arquivo ocupa um número inteiro de blocos. A menos que o tamanho do arquivo seja um múltiplo do tamanho do bloco, o último bloco será usado apenas parcialmente. Portanto, um arquivo de 1 byte e um arquivo de 4.096 bytes ocupam 1 bloco, enquanto um arquivo de 4.097 bytes ocupa dois blocos. Você pode observar isso com ls
ou du
: se o seu sistema de arquivos tiver um tamanho de bloco de 4KiB, então ls -s
e du
reportará 4KiB para um arquivo de 1 byte.
Se um arquivo for grande, serão necessários blocos adicionais apenas para armazenar a lista de blocos que compõem o arquivo (estes sãoblocos indiretos; sistemas de arquivos mais sofisticados podem otimizar isso na forma deextensões). Eles não aparecem no tamanho do arquivo relatado por ls -l
ou GNU du --apparent-size
. du
e ls -s
, que relatam o uso do disco em vez do tamanho, são responsáveis por eles.
Alguns sistemas de arquivos tentam reutilizar o espaço livre deixado no último bloco paraempacotar vários arquivos no mesmo bloco. Alguns sistemas de arquivos (comoext4 desde Linux 3.8use blocos 0 para arquivos minúsculos (apenas alguns bytes) que cabem inteiramente no inode.
Complicações macroscópicas
Geralmente, como visto acima, o tamanho total informado por du
é a soma dos tamanhos dos blocos ou extensões utilizadas pelo arquivo.
O tamanho relatado por du
pode ser menor se o arquivo estiver compactado. Os sistemas Unix tradicionalmente suportam uma forma grosseira de compactação: se um bloco de arquivo contém apenas bytes nulos, então, em vez de armazenar um bloco de zeros, o sistema de arquivos pode omitir esse bloco completamente. Um arquivo com blocos omitidos como este é chamado dearquivo esparso. Arquivos esparsos não são criados automaticamente quando um arquivo contém uma grande série de bytes nulos; o aplicativo deve providenciar para que o arquivo se torne esparso.
Alguns sistemas de arquivos comobtrfsezfssuporte de uso geralcompressão.
Complicações avançadas
Dois recursos principais de sistemas de arquivos muito modernos, como zfs e btrfs, tornam a relação entre o tamanho do arquivo e o uso do disco significativamente mais distante: instantâneos e desduplicação.
Instantâneossão um estado congelado do sistema de arquivos em uma determinada data. Os sistemas de arquivos que suportam esse recurso podem conter vários instantâneos tirados em datas diferentes. Esses instantâneos ocupam espaço, é claro. Em um extremo, se você excluir todos os arquivos da versão ativa do sistema de arquivos, o sistema de arquivos não ficará vazio se ainda houver instantâneos restantes.
Qualquer arquivo ou bloco que não tenha sido alterado desde que um instantâneo ou entre dois instantâneos foi obtido existe de forma idêntica no instantâneo e na versão ativa ou em outro instantâneo. Isto é implementado atravéscopiar na gravação. Em alguns casos extremos, é possível que a exclusão de um arquivo em um sistema de arquivos completo falhe devido ao espaço disponível insuficiente - porque a remoção desse arquivo exigiria fazer uma cópia de um bloco no diretório, e não há mais espaço nem mesmo para aquele bloco.
Desduplicaçãoé uma técnica de otimização de armazenamento que consiste em evitar o armazenamento de blocos idênticos. Com dados típicos, nem sempre vale a pena procurar duplicatas. Amboszfsebtrfssuporte à desduplicação como um recurso opcional.
Por que o total é du
diferente da soma dos tamanhos dos arquivos?
Como vimos acima, o tamanho relatado por du
para cada arquivo normalmente é a soma dos tamanhos dos blocos ou extensões usados pelo arquivo. Observe que, por padrão, ls -l
lista os tamanhos em bytes, mas du
lista os tamanhos em KiB ou em unidades (setores) de 512 bytes em alguns sistemas mais tradicionais ( du -k
força o uso de kilobytes). A maioria dos unidades modernas suporta ls -lh
e du -h
usa números “legíveis por humanos” usando K, M, G, etc. é suficiente (para KiB, MiB, GiB) conforme apropriado.
Quando você executa du
em um diretório, ele soma o uso do disco de todos os arquivos na árvore de diretórios,incluindo os diretórioseles mesmos. Um diretório contém dados (os nomes dos arquivos e um ponteiro para onde estão os metadados do arquivo), portanto, precisa de um pouco de espaço de armazenamento. Um diretório pequeno ocupará um bloco, um diretório maior exigirá mais blocos. A quantidade de armazenamento usada por um diretório às vezes depende não apenas dos arquivos que ele contém, mas também da ordem em que eles foram inseridos e na qual alguns arquivos são removidos (em alguns sistemas de arquivos, isso pode deixar lacunas — um compromisso entre o espaço em disco e o desempenho ), mas a diferença será pequena (um bloco extra aqui e ali). Quando você executa ls -ld /some/directory
, o tamanho do diretório é listado. (Observe que a linha “NNN total” na parte superior da saída de ls -l
é um número não relacionado, é a soma dos tamanhos em blocos dos itens listados, expressos em KiB ou setores.)
Tenha em mente que isso du
incluiarquivos de pontoque ls
não aparece a menos que você use a opção -A
ou -a
.
Às vezes, du
informa menos do que a soma esperada. Isto acontece se houverlinks físicosdentro da árvore de diretórios: du
conta cada arquivo apenas uma vez. Use du -l
o switch para contar arquivosNvezes se eles tiveremNlinks físicos.
Em alguns sistemas de arquivos, como ZFS
no Linux, du
não informa o espaço total em disco ocupado pelos atributos estendidos de um arquivo.
Esteja ciente de que, se houver pontos de montagem em um diretório, du
todos os arquivos nesses pontos de montagem também serão contados, a menos que seja dada a -x
opção. Portanto, se, por exemplo, você deseja o tamanho total dos arquivos em seu sistema de arquivos raiz, execute du -x /
, não du /
.
Se um sistema de arquivos for montado em um diretório não vazio, os arquivos nesse diretório serão ocultados pelo sistema de arquivos montado. Eles ainda ocupam seu espaço, mas du
não os encontrarão.
Arquivos excluídos
Quando um arquivo éexcluído, isso removerá apenas a entrada do diretório, não necessariamente o arquivo em si. Duas condições são necessárias para realmente excluir um arquivo e assim recuperar seu espaço em disco:
- A contagem de links do arquivo deve cair para 0: se um arquivo tiver vários links físicos, a remoção de um não afetará os outros.
- Enquanto o arquivo for aberto por algum processo, os dados permanecerão. Somente quando todos os processos fecharem o arquivo ele será excluído. A saída
fuser -m
oulsof
em um ponto de montagem inclui os processos que possuem um arquivo aberto nesse sistema de arquivos, mesmo que o arquivo seja excluído. - mesmo que nenhum processo tenha o arquivo excluído aberto, o espaço do arquivo poderá não ser recuperado se esse arquivo for o back-end de um
loop
dispositivo.losetup -a
(comoroot
) pode informar quaisloop
dispositivos estão configurados atualmente e em qual arquivo. O dispositivo de loop deve ser destruído (comlosetup -d
) antes que o espaço em disco possa ser recuperado.
Se você excluir um arquivo em alguns gerenciadores de arquivos ou ambientes GUI, ele poderá ser colocado em uma área de lixeira onde poderá ser recuperado. Contanto que o arquivo possa ser recuperado, seu espaço ainda será consumido.
De onde são exatamente esses números df
?
Um sistema de arquivos típico contém:
- Blocos contendo dados de arquivos (incluindo diretórios) e alguns metadados (incluindo blocos indiretos e atributos estendidos em alguns sistemas de arquivos).
- Blocos grátis.
- Blocos reservados ao usuário root.
- superblocos e outras informações de controle.
- Inodos
- ADiário
Apenas o primeiro tipo é relatado por du
. Quando se trata de df
, o que entra nas colunas “usado”, “disponível” e total depende do sistema de arquivos (é claro que os blocos usados (incluindo os indiretos) estão sempre na coluna “usado”, e os blocos não utilizados estão sempre na coluna “ disponível” coluna).
Sistemas de arquivos no ext2/ext3/ext4reserva5% do espaço para o usuário root. Isso é útil no sistema de arquivos raiz, para manter o sistema funcionando caso ele fique cheio (em particular para registro e para permitir que o administrador do sistema armazene alguns dados enquanto corrige o problema). Mesmo para partições de dados como /home
, manter esse espaço reservado é útil porque um sistema de arquivos quase cheio está sujeito à fragmentação. O Linux tenta evitar a fragmentação (que retarda o acesso a arquivos, especialmente em dispositivos mecânicos rotativos, como discos rígidos) pré-alocando muitos blocos consecutivos quando um arquivo está sendo gravado, mas se não houver muitos blocos consecutivos, isso não funcionará. .
Sistemas de arquivos tradicionais, incluindo ext4, mas não btrfs, reservam um número fixo deinodesquando o sistema de arquivos é criado. Isto simplifica significativamente o design do sistema de arquivos, mas tem a desvantagem de que o número de inodes precisa ser dimensionado adequadamente: com muitos inodes, espaço é desperdiçado; com poucos inodes, o sistema de arquivos pode ficar sem inodes antes de ficar sem espaço. O comando df -i
informa quantos inodes estão em uso e quantos estão disponíveis (sistemas de arquivos onde o conceito não é aplicável podem reportar 0).
A execução tune2fs -l
no volume que contém um sistema de arquivos ext2/ext3/ext4 relata algumas estatísticas, incluindo o número total e o número de inodes e blocos livres.
Outra característica que pode confundir a matéria ésubvolumes(suportado embtrfs, e em zfs sob o nomeconjuntos de dados). Vários subvolumes compartilham o mesmo espaço, mas possuem raízes de árvore de diretórios separadas.
Se um sistema de arquivos for montado na rede (NFS, Samba, etc.) e o servidor exportar uma parte desse sistema de arquivos (por exemplo,o servidor possui um /home
sistema de arquivos e exporta/home/bob
), df
em um cliente reflete os dados de todo o sistema de arquivos, não apenas da parte que é exportada e montada no cliente.
O que está usando o espaço do meu disco?
Como vimos acima, o tamanho total informado por df
nem sempre leva em consideração todos os dados de controle do sistema de arquivos. Use ferramentas específicas do sistema de arquivos para obter o tamanho exato do sistema de arquivos, se necessário. Por exemplo, com ext2/ext3/ext4, execute tune2fs -l
e multiplique o tamanho do bloco pela contagem de blocos.
Quando você cria um sistema de arquivos, ele normalmente preenche o espaço disponível na partição ou volume envolvente. Às vezes, você pode acabar com um sistema de arquivos menor ao mover sistemas de arquivos ou redimensionar volumes.
No Linux, lsblk
apresenta uma boa visão geral dos volumes de armazenamento disponíveis. Para obter informações adicionais ou se você não tiver lsblk
, use ferramentas especializadas de gerenciamento de volumes ou particionamento para verificar quais partições você possui. No Linux, há lvs
, vgs
, pvs
paraLVM,fdisk
para partições tradicionais de estilo PC (“MBR”) (bem como GPT em sistemas recentes),gdisk
paraGPTpartições,disklabel
para rótulos de disco BSD,Separado, etc. No Linux, cat /proc/partitions
fornece um resumo rápido. Instalações típicas têm pelo menos duas partições ou volumes usados pelo sistema operacional: um sistema de arquivos (às vezes mais) e umtrocarvolume.
Alguns computadores possuem uma partição contendo oBIOSou outro software de diagnóstico. Computadores comUEFItenha uma partição de bootloader dedicada.
Finalmente, observe que a maioria dos programas de computador usa unidades baseadas em potências de 1024 = 2 10 (porque os programadores adoram binários e potências de 2). Portanto, 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B,… Oficialmente, essas unidades são conhecidas comoquibibyteKiB,mebibyteMiB, etc., mas a maioria dos softwares apenas reporta k ou kB, M ou MB, etc. Por outro lado, os fabricantes de discos rígidos usam sistematicamente métricas (unidades baseadas em 1000). Portanto, essa unidade de 1 TB tem apenas 931 GiB ou 0,904 TiB.
Responder2
Um breve resumo das complicações para calcular tamanhos de arquivos e espaços em disco:
O espaço que o arquivo ocupa no disco é um multiplicador do número de blocos que ele ocupa em relação ao tamanho de cada bloco + o número de inodes que ele ocupa. Um arquivo de 1 byte levará pelo menos 1 bloco, 1 inode e uma entrada de diretório.
Mas pode ser necessária apenas uma entrada de diretório adicional se o arquivo for um link físico para outro arquivo. Seria apenas mais uma referência ao mesmo conjunto de blocos.
- O tamanho do conteúdo do arquivo. Isto é o que
ls
é exibido. - O espaço livre em disco não é o tamanho do maior arquivo que você pode acomodar ou a soma de todos os tamanhos de conteúdo de arquivo que cabem no disco. Está em algum lugar no meio. Depende do número de arquivos (ocupando inodes), do tamanho do bloco e de quão próximo o conteúdo de cada arquivo preenche os blocos completamente.
Isso é apenas um arranhão na superfície dos sistemas de arquivos e é excessivamente simplificado. Lembre-se também de que diferentes sistemas de arquivos operam de maneira diferente.
stat
é muito útil para identificar algumas dessas informações. Aqui estão alguns exemplos de como usar stat e para que ele serve:http://landoflinux.com/linux_stat_command_examples.html
Responder3
df
geralmente é usado para ver quais são os sistemas de arquivos, quão cheios cada um está e onde estão montados. Muito útil quando você está ficando sem espaço em um sistema de arquivos e talvez queira mudar as coisas entre os sistemas de arquivos ou comprar um disco maior, etc.
du
mostra detalhes de quanto armazenamento cumulativo cada um dos diretórios está consumindo (como windirstat
no Windows). Ótimo para descobrir onde você está ocupando espaço ao tentar fazer a limpeza de arquivos.
Além das pequenas diferenças numéricas explicadas por outros, acho que os utilitários du
e df
servem a propósitos muito diferentes.
Responder4
Ilustrarei aqui diferentes casos que fazem com que du
sejam diferentes de df
.
df
conta os blocos alocados do sistema de arquivos, du
use as informações de tamanho de cada arquivo. Uma diferença pode ter muitas causas:
Arquivos desvinculados (excluídos) que ainda estão abertos pelo aplicativo. As informações do arquivo estão faltando, o bloco ainda está alocado.
lsof +aL1 <filesystem>
will ajuda você a identificar os processos. Na maioria das vezes você tem que matar os processos para liberar espaço (depende do processo, às vezes uma recarga de configuração é suficiente).Arquivos abaixo dos pontos de montagem ocultos,
du
mas não paradf
.debugfs
pode ajudá-lo a ler o sistema de arquivos.$ sudo debugfs debugfs 1.42.12 (29-Aug-2014) debugfs: open /dev/xxx (the desired file system device) debugfs: cd /boot debugfs: ls -l 1966081 40755 (2) 0 0 4096 26-May-2016 16:28 . 2 40555 (2) 0 0 4096 11-May-2016 10:43 .. 1974291 100644 (1) 0 0 0 26-May-2016 16:28 bob <---<<< /boot/bob is hidden by /boot fs
Arquivos esparsosisso parece maior que a realidade. Os blocos não alocados não são contados por,
df
mas o tamanho aparente do arquivo é contado pordu
.
Observe que os links físicos não enganam du
.