Como o df sabe quanto espaço é usado sem precisar passar por todos os arquivos?

1

Ao usar du para obter o tamanho total de uma pasta, o comando enumera cada arquivo de cada (sub) pasta e o adiciona, no meu entendimento.

yann@p:~$ du /var/log
4   /var/log/ntpstats
...
148 /var/log/apt
564 /var/log/installer
8   /var/log/cups
91748   /var/log

No entanto, como o comando df pode retornar instantaneamente resultados como

Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1       35209808  18707476  14694008  57% /

sem precisar enumerar todos os arquivos na unidade?

Se houver uma maneira rápida de conhecer o espaço usado em uma unidade inteira, por que não há uma maneira rápida de saber o tamanho de uma pasta? Ou existe?

Obrigado antecipadamente.

    
por YannP 24.05.2018 / 16:23

2 respostas

2

O sistema de arquivos provavelmente mantém uma contagem de blocos de dados usados e livres como parte da operação normal. df usa essas informações.

Mesmo que o sistema de arquivos não mantenha um contador em tempo real, ele precisa de uma maneira rápida de encontrar blocos livres ao gravar novos dados, e esses mesmos dados também podem ser usados para encontrar o número de blocos livres.

Em teoria, algum sistema de arquivos pode manter um contador de espaço tão usado em uma base por diretório também. No entanto, existem alguns problemas.

Se a contagem foi mantida para toda a subárvore recursivamente, o sistema de arquivos precisaria propagar os números de uso para uma profundidade arbitrária. Isso pode desacelerar todas as operações de gravação. Se fosse mantido apenas para os arquivos imediatamente dentro do diretório, um passeio recursivo da árvore ainda seria necessário para encontrar o tamanho total de uma árvore.

Em sistemas de arquivos do tipo Unix, os hard links são um obstáculo ainda maior. Quando um arquivo pode ser vinculado a vários diretórios (ou várias vezes a partir do mesmo diretório), ele não possui um diretório pai exclusivo. Onde o tamanho do arquivo seria contado? Contá-lo em todos os diretórios vinculados a ele produziria um uso total inflado, pois o arquivo poderia ser contado várias vezes. Contar em apenas um diretório também seria obviamente errado.

Na verdade, arquivos (ou seja, inodes) em sistemas de arquivos Unix tradicionais nem sequer conhecem os diretórios em que residem, apenas a contagem de links para eles (os nomes que possuem). Na maior parte das vezes, essas informações não são necessárias, pois os arquivos são acessados principalmente pelo nome. O armazenamento também exigiria uma quantidade arbitrária de dados no inode, duplicando os dados nos diretórios.

    
por 24.05.2018 / 16:53
2

df usa a chamada do sistema statvfs() e solicita ao sistema de arquivos as estatísticas do espaço atual. É claro que isso é rápido, pois o sistema de arquivos sempre acompanha o espaço usado no sistema de arquivos enquanto o gerencia.

Portanto, o motivo pelo qual df é rápido é o uso de valores em cache pré-computados do sistema de arquivos.

Aqui está a história:

Nos anos 70, df tem sido um programa raiz suido que acessou o dispositivo de disco bruto e buscou as estatísticas do sistema de arquivos do super bloco.

Em meados dos anos 80, o SunOS introduziu o syscall statfs() junto com a primeira implementação do VFS. Essa ligação não precisava mais de privilégios. Esta interface foi dada ao * BSD durante a última troca de código SunOS / BSD na reunião de Tahoe.

Em 1989, o SVr4 / Solaris introduziu uma interface VFS aprimorada que renomeou o syscall para statvfs(). Esta versão do syscall foi adicionada ao POSIX de onde vários sistemas operacionais copiaram a interface.

Como os dados de df são indiretamente obtidos do super bloco que possui apenas valores para todo o sistema de arquivos, não existe uma maneira rápida de obter os números de um único diretório.

    
por 24.05.2018 / 16:41

Tags