Por que existem tantas maneiras diferentes de medir o uso do disco?

114

Quando resisto os tamanhos dos meus arquivos, recebo um número. Se eu correr du, recebo outra figura. Se eu executar duem todos os arquivos da minha partição, ele não corresponderá às dfreivindicações usadas. Por que existem tantas figuras diferentes para o tamanho total dos meus arquivos? Os computadores não podem adicionar?

Falando em adicionar: quando adiciono as colunas "Usado" e "Disponível" de df, não recebo o valor total. E esse número total é menor que o tamanho da minha partição. E se eu adicionar os tamanhos das minhas partições, não obtenho o tamanho do meu disco! O que da?

Gilles
fonte

Respostas:

144

Adicionar números é fácil. O problema é que existem muitos números diferentes para adicionar.

Quanto espaço em disco um arquivo usa?

A idéia básica é que um arquivo contendo n bytes use n bytes de espaço em disco, mais um pouco para algumas informações de controle: os metadados do arquivo (permissões, registros de data e hora etc.) e um pouco de sobrecarga para as informações necessárias ao sistema encontre 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 compõem apenas um volume, mas arquivos maiores consistem em muitos volumes, como uma enciclopédia. Para poder localizar os arquivos, existe um catálogo de cartões que faz referência a todos os volumes. Cada volume tem um pouco de sobrecarga devido às tampas. Se um arquivo é muito pequeno, essa sobrecarga é relativamente grande. Além disso, o próprio catálogo de cartões ocupa algum espaço.

Indo um pouco mais técnico, em um sistema de arquivos simples típico, o espaço é dividido em blocos . Um tamanho de bloco típico é 4KiB. Cada arquivo ocupa um número inteiro de blocos. A menos que o tamanho do arquivo seja múltiplo do tamanho do bloco, o último bloco será usado apenas parcialmente. Portanto, um arquivo de 1 byte e um arquivo de 4096 bytes ocupam 1 bloco, enquanto um arquivo de 4097 bytes ocupa dois blocos. Você pode observar isso com o ducomando: se o seu sistema de arquivos tiver um tamanho de bloco de 4KiB, ele dureportará 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ão blocos indiretos ; sistemas de arquivos mais sofisticados podem otimizar isso na forma de extensões ). Aqueles não aparecem no tamanho do arquivo, conforme relatado pelo ls -lGNU du --apparent-size; du, que relata o uso do disco em oposição ao tamanho, é responsável por eles.

Alguns sistemas de arquivos tentam reutilizar o espaço livre restante no último bloco para compactar várias caudas de arquivos no mesmo bloco . Alguns sistemas de arquivos (como o ext4 desde o Linux 3.8 usam 0 blocos para arquivos pequenos (apenas alguns bytes) que se encaixam totalmente no inode.

Complicações macroscópicas

Geralmente, como visto acima, o tamanho total relatado por dué a soma dos tamanhos dos blocos ou extensões usados ​​pelo arquivo.

O tamanho relatado por dupode ser menor se o arquivo estiver compactado. Os sistemas Unix tradicionalmente suportam uma forma bruta de compactação: se um bloco de arquivo contém apenas bytes nulos, em vez de armazenar um bloco de zeros, o sistema de arquivos pode omitir esse bloco completamente. Um arquivo com blocos omitidos como esse é chamado de arquivo 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, como btrfs e zfs, suportam compactação de uso geral .

Complicações avançadas

Dois recursos principais de sistemas de arquivos muito modernos, como zfs e btrfs, tornam a relação entre tamanho do arquivo e uso do disco significativamente mais distante: instantâneos e deduplicação.

Snapshots sã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 ficam disponíveis, é 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 houver snapshots restantes.

Qualquer arquivo ou bloco que não tenha sido alterado desde a captura instantânea ou entre duas capturas instantâneas existe de forma idêntica na captura instantânea e na versão ativa ou em outra captura instantânea. Isso é implementado via cópia 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 a cópia de um bloco no diretório e não há mais espaço para esse bloco.

A desduplicação é uma técnica de otimização de armazenamento que consiste em evitar o armazenamento de blocos idênticos. Com dados típicos, procurar duplicatas nem sempre vale a pena. O zfs e o btrfs suportam a desduplicação como um recurso opcional.

Por que o total é dudiferente da soma dos tamanhos de arquivo?

Como vimos acima, o tamanho relatado por dupara cada arquivo é normalmente a soma dos tamanhos dos blocos ou extensões usados ​​pelo arquivo. Observe que, por padrão, ls -llista tamanhos em bytes, mas dulista tamanhos em KiB ou unidades de 512 bytes (setores) em alguns sistemas mais tradicionais ( du -kforça o uso de kilobytes). A maioria dos departamentos modernos oferece suporte ls -lhe o du -huso de números “legíveis por humanos” usando K, M, G, etc. é suficiente (para KiB, MiB, GiB), conforme apropriado.

Quando você executa duem um diretório, ele resume o uso do disco de todos os arquivos na árvore de diretórios, incluindo os próprios diretórios . Um diretório contém dados (os nomes dos arquivos e um ponteiro para onde estão os metadados do arquivo), portanto, ele precisa de um pouco de espaço de armazenamento. Um diretório pequeno ocupará um bloco, um diretório maior exigirá mais blocos. Às vezes, a quantidade de armazenamento usada por um diretório depende não apenas dos arquivos que ele contém, mas também da ordem em que foram inseridos e na qual alguns arquivos são removidos (com alguns sistemas de arquivos, isso pode deixar buracos - um comprometimento entre espaço em disco e desempenho) ), mas a diferença será pequena (um bloco extra aqui e ali). Quando você correls -ld /some/directory, o tamanho do diretório está listado. (Observe que a linha "NNN total" na parte superior da saída ls -lé um número não relacionado, é a soma dos tamanhos em blocos dos itens listados, expresso em KiB ou setores.)

Lembre-se de que duinclui arquivos de ponto que lsnão são exibidos, a menos que você use a opção -Aou -a.

Às vezes, dureporta menos que a soma esperada. Isso acontece se houver links físicos dentro da árvore de diretórios: duconta cada arquivo apenas uma vez.

Em alguns sistemas de arquivos como ZFSno Linux, dunão relata o espaço em disco completo ocupado por atributos estendidos de um arquivo.

Lembre-se de que, se houver pontos de montagem em um diretório, dutambém contará todos os arquivos nesses pontos de montagem, a menos que seja dada a -xopção. Portanto, se, por exemplo, você deseja o tamanho total dos arquivos no seu sistema de arquivos raiz, execute du -x /, não du /.

Se um sistema de arquivos estiver 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 dunão os encontram.

Arquivos excluídos

Quando um arquivo é excluído , isso remove apenas a entrada do diretório, não necessariamente o próprio arquivo. São necessárias duas condições 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 afeta os outros.
  • Enquanto o arquivo estiver aberto por algum processo, os dados permanecerão. Somente quando todos os processos foram fechados, o arquivo é excluído. A saída fuser -mou lsofem um ponto de montagem inclui os processos que têm um arquivo aberto nesse sistema de arquivos, mesmo se o arquivo for excluído.
  • mesmo se nenhum processo tiver o arquivo excluído aberto, o espaço do arquivo poderá não ser recuperado se esse arquivo for o back-end de um loopdispositivo. losetup -a(as root) pode informar quais loopdispositivos estão configurados no momento e em qual arquivo. O dispositivo de loop deve ser destruído (com losetup -d) antes que o espaço em disco possa ser recuperado.

Se você excluir um arquivo em alguns gerenciadores de arquivos ou ambientes da GUI, ele poderá ser colocado em uma área de lixo onde poderá ser desmarcado. Desde que o arquivo possa ser restaurado, seu espaço ainda será consumido.

De que dfexatamente são esses números ?

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 livres.
  • Blocos reservados ao usuário root.
  • superblocos e outras informações de controle.
  • Inodes
  • Um diário

Somente 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 "usados" e os blocos não utilizados estão sempre no " disponível ”).

Os sistemas de arquivos no ext2 / ext3 / ext4 reservam 5% do espaço para o usuário root. Isso é útil no sistema de arquivos raiz, para manter o sistema funcionando, se ele ficar cheio (principalmente para o log e para permitir que o administrador do sistema armazene um pouco de dados enquanto corrige o problema). Mesmo para partições de dados como /homemanter esse espaço reservado é útil porque um sistema de arquivos quase cheio é propenso a fragmentação. O Linux tenta evitar a fragmentação (que diminui 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á. .

Os sistemas de arquivos tradicionais, incluindo ext4, mas não btrfs, reservam um número fixo de inodes quando o sistema de arquivos é criado. Isso simplifica significativamente o design do sistema de arquivos, mas tem a desvantagem de que o número de inodes precisa ser dimensionado corretamente: com muitos inodes, o espaço é desperdiçado; com muito poucos inodes, o sistema de arquivos pode ficar sem inodes antes de ficar sem espaço. O comando df -irelata quantos inodes estão em uso e quantos estão disponíveis (sistemas de arquivos onde o conceito não é aplicável pode reportar 0).

A execução tune2fs -lno 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.

Outro recurso que pode confundir a matéria são os subvolumes (suportados no btrfs e no zfs sob o nome datasets ). Vários subvolumes compartilham o mesmo espaço, mas têm raízes de árvore de diretório separadas.

Se um sistema de arquivos estiver montado na rede (NFS, Samba etc.) e o servidor exportar uma parte desse sistema de arquivos (por exemplo, o servidor tiver um /homesistema de arquivos e exportar/home/bob ), o dfcliente refletirá os dados de todo o sistema de arquivos, não apenas para a peça que é exportada e montada no cliente.

O que está usando o espaço no meu disco?

Como vimos acima, o tamanho total relatado por dfnem 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 -le 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 no volume anexo. Às vezes, você pode acabar com um sistema de arquivos menor ao mover ou modificar o sistema de arquivos ou redimensionar volumes.

No Linux, lsblkapresenta 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 ou particionamento de volume para verificar quais partições você possui. No Linux, não está lvs, vgs, pvspara LVM , fdiskpara a tradicional PC-style partições ( “MBR”) (bem como GPT em sistemas recentes), gdiskpara GPT partições, disklabelpara disklabels BSD, Parted , etc Sob Linux, cat /proc/partitionsdá um rápido resumo. As 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 um volume de troca .

Alguns computadores possuem uma partição que contém o BIOS ou outro software de diagnóstico. Computadores com UEFI possuem uma partição do carregador de inicialização dedicado.

Por fim, observe que a maioria dos programas de computador usa unidades baseadas em potências de 1024 = 2 10 (porque os programadores adoram potências binárias e 2). Então 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B,… Oficialmente, essas unidades são conhecidas como kibibyte KiB, mebibyte MiB, 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.

Gilles
fonte
11
O @Kiwy tune2fsrequer acesso de leitura ao dispositivo de bloco que contém o sistema de arquivos, o que geralmente requer raiz, pois permite ler o conteúdo de qualquer arquivo.
Gilles
21
Eu sei que 'obrigado' é desencorajado no SE, mas Gilles você merece um enorme 'obrigado' por este ótimo post.
dotancohen
11
Lembro-me de ver um catálogo de cartas quando tinha 6 anos. Gostaria de saber quantos não saberão o que são?
Izkata
11
@ illuminÉ Isso é Solaris avançado demais para mim, não sei em que nível ele se encaixa.
Gilles
11
du faz conta para blocos indiretos. Essa é a principal diferença do tamanho do arquivo, conforme relatado por ls -l.
Stéphane Chazelas
4

Um breve resumo de complicações no cálculo do tamanho dos arquivos e do espaço em disco:

  • O espaço que o arquivo ocupa no disco é um multiplicador do número de blocos necessários para o tamanho de cada bloco + o número de inodes necessários. Um arquivo de 1 byte terá pelo menos 1 bloco, 1 inode e uma entrada de diretório.

    Mas pode levar apenas 1 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. É isso que lsmostra.
  • O espaço livre em disco não é do tamanho do maior arquivo em que você pode caber nem da 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 completamente os blocos.

Isso está apenas arranhando a 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 localizar algumas dessas informações. Aqui estão alguns exemplos de como usar o stat e para que serve: http://landoflinux.com/linux_stat_command_examples.html

Pedro
fonte
11
Um arquivo de 1 byte normalmente leva um bloco, não 8. A criação de um link físico não cria um inode: um arquivo é um inode, independentemente de quantos links existem para o arquivo. Criar um link físico requer apenas espaço para a entrada do diretório.
Gilles
Obrigado pelas correções, é certo que minha memória re: estudar ext2 em profundidade agora está um pouco confusa. Eu estava acompanhando a saída do stat re: a contagem de blocos - parecia excessiva, mas é isso que está lá. Eu vou corrigir a resposta.
Pedro
11
Isso ocorre porque 1 bloco ext2 = 8 blocos estatísticos, se o sistema de arquivos ext2 usa blocos de 4kB: o stat conta em blocos de 512 bytes por razões históricas. Veja unix.stackexchange.com/questions/14409/…
Gilles
3

Ilustrarei aqui casos diferentes que causam dudiferenças df.

dfconta os blocos alocados do sistema de arquivos, duuse as informações de tamanho de cada arquivo. Uma diferença pode ter muitas causas:

1) Arquivos não vinculados (excluídos) que ainda estão abertos pelo aplicativo. As informações do arquivo estão ausentes, o bloco ainda está alocado. lsof +aL1 <filesystem>vontade ajuda a identificar os processos. Na maioria das vezes, é necessário interromper os processos para liberar espaço (depende do processo, às vezes uma recarga de configuração é suficiente).

2) Arquivos abaixo dos pontos de montagem ocultos, dumas não para df. debugfsO can ajuda 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

3) Arquivos esparsos que parecem maiores que a realidade. blocos não alocados não são contados, dfmas o tamanho aparente do arquivo é contado por du.

Observe que os links físicos não enganam du

Emmanuel
fonte
3

dfgeralmente é usado para ver quais são os sistemas de arquivos, quão cheios cada um 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.

dumostra detalhes de quanto armazenamento cumulativo cada um dos diretórios está consumindo (mais ou menos como windirstatno Windows). Ótimo para descobrir onde você está consumindo espaço ao tentar limpar arquivos.

Além de pequenas diferenças numéricas explicadas por outros, acho que os utilitários due dfservem a propósitos muito diferentes.

Jim Robertson
fonte