O POSIX df
oferece apenas unidades de 1024 ou 512 bytes, então a resposta é específico do sistema, e muito provavelmente específico do sistema de arquivos (e eu vou ignorar complicações como subalocação de blocos e inline data .)
A primeira consideração é o conceito de blocos reservados , por especificação a saída de contagem de blocos livres por df
não incluirá os blocos reservados (normalmente reservados para root, mas nem sempre).
Uma maneira (principalmente) portátil de descobrir sem usar df
é usar o Gnu stat
, usando um formato de saída de sua escolha:
$ stat -fc "%n type=%T freeblk=%f totalblk=%b blksz=%S" /tmp
/tmp type=ext2/ext3 freeblk=99136 totalblk=494123 blksz=4096
Você pode usar %a
(em vez de %f
) para gerar a contagem efetiva de blocos livres (ou seja, excluir blocos reservados), como df
usa em seus cálculos.
Outros sistemas (* BSD) possuem diferenças em seus sinalizadores e recursos de formatação stat
e podem funcionar apenas em arquivos, não em sistemas de arquivos. stat
não é POSIX (é um wrapper em torno das funções POSIX stat()
e statvfs()
), a versão GNU (no pacote coreutils ) é bastante portátil.
Com sistemas de arquivos baseados em ext2 / 3/4 você pode, como root (ou mais corretamente: com acesso de leitura ao nó de dispositivo de bloco) descarregar esta informação com tune2fs
:
# tune2fs -l /dev/sda3
tune2fs 1.42.8 (20-Jun-2013)
Filesystem volume name: <none>
Last mounted on: /var/spool
Filesystem UUID: 7b9d93dd-1322-4f54-a302-a0799f4518fb
Filesystem magic number: 0xEF53
[...]
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 7651328
Block count: 30588854
Reserved block count: 305888
Free blocks: 30060629
Free inodes: 7651317
First block: 0
Block size: 4096
Fragment size: 4096
[...]
Esse método funciona independentemente de o sistema de arquivos estar montado ou não.