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 du
comando: se o seu sistema de arquivos tiver um tamanho de bloco de 4KiB, ele 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ã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 -l
GNU 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 du
pode 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 é du
diferente da soma dos tamanhos de arquivo?
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 tamanhos em bytes, mas du
lista tamanhos em KiB ou unidades de 512 bytes (setores) em alguns sistemas mais tradicionais ( du -k
força o uso de kilobytes). A maioria dos departamentos modernos oferece suporte ls -lh
e o du -h
uso de 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 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 du
inclui arquivos de ponto que ls
não são exibidos, a menos que você use a opção -A
ou -a
.
Às vezes, du
reporta menos que a soma esperada. Isso acontece se houver links físicos dentro da árvore de diretórios: du
conta cada arquivo apenas uma vez.
Em alguns sistemas de arquivos como ZFS
no Linux, du
nã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, du
também contará todos os arquivos nesses pontos de montagem, a menos que seja dada a -x
opçã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 du
nã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 -m
ou lsof
em 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
loop
dispositivo. losetup -a
(as root
) pode informar quais loop
dispositivos 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 df
exatamente 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 /home
manter 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 -i
relata 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 -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.
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 /home
sistema de arquivos e exportar/home/bob
), o df
cliente 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 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 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, 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 ou particionamento de volume para verificar quais partições você possui. No Linux, não está lvs
, vgs
, pvs
para LVM , fdisk
para a tradicional PC-style partições ( “MBR”) (bem como GPT em sistemas recentes), gdisk
para GPT partições, disklabel
para disklabels BSD, Parted , etc Sob Linux, cat /proc/partitions
dá 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.
tune2fs
requer 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.