Eu quero usar os valores de retorno de statvfs para obter o tamanho total e livre do sistema de arquivos.
unsigned long f_bsize; /* Filesystem block size */
unsigned long f_frsize; /* Fragment size */
fsblkcnt_t f_blocks; /* Size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* Number of free blocks */
...
Fonte: https://man7.org/linux/man-pages/man3/statvfs.3.html
Então, para obter o tamanho total do sistema de arquivos, parece que eu quero f_blocks * f_frsize
, já que o comentário para f_blocks
diz que é o tamanho "em f_frsize
unidades". No entanto, f_bfree
é o número de blocos livres. Então, para o tamanho do sistema de arquivos gratuito, tenho que usar f_bsize
? Ou f_frsize
novamente?
Google é seu melhor amigo. Resultado de "difference vs f_frsize and f_bsize"
=>" se você tiver um tamanho de bloco de 8KB e tentar gravar um arquivo de 1KB no bloco, como resultado, você desperdiçará 7KB do espaço do bloco. Mas recentemente notei sobre Fragments of File Block. mesmo caso se você tiver Bloco de Arquivo de 8KB e tamanho de Fragmento de 1KB - você pode economizar seu espaço de bloco, porque o arquivo de 1KB preencherá apenas 1 fragmento. Outros 7 fragmentos serão usados para outros arquivos."
A resposta para sua pergunta é: use o f_bsize.
Fragmentos de blocos parecem ser um recurso de sistema de arquivos em alguns sistemas de arquivos legados (googling sugere que UFS e JFS têm um uso para isso).
O tamanho do fragmento parece indicar o valor mínimo que um fragmento pode ter e deve estar entre 1 e
f_bsize
.Em sistemas de arquivos que não o suportam, este valor deve ser igual
f_bsize
(ou ser zero, veja abaixo) já que a fragmentação adicional do bloco não seria suportada.Se você verificar o
coreutils
código-fonte (pelo menos em sistemas baseados em redhat), poderá ver como o GNU lida com isso nodf
. Dado que o GNU deve lidar com todos os tipos de semântica POSIX com vários sabores de UNIX e não apenas Linux, ele deve oferecer uma sugestão bastante robusta sobre como resolver isso.Dentro
lib/fsusage.c
Em seu código, eles estão copiando a
statvfs
estrutura POSIX em uma estrutura de sua própria criação, a parte importante, no entanto, está nas linhas124-126
que mostram o que estão fazendo: usando of_frsize
if não é zero, caso contrário, usandof_bsize
.Minha sugestão é apenas copiar o método deles, pois
df
viu uma distribuição extremamente ampla na natureza e ao longo do tempo. Seria de esperar que alguém tivesse indicado que relata os valores errados até agora se estivesse incorreto.Você também deve estar ciente de que sistemas de arquivos mais modernos têm um conceito bastante nebuloso de uso do sistema de arquivos.
btrfs
vem à mente que, devido a cópias de reflink, cotas e instantâneos, não fornece mais um valor absoluto exato. Você provavelmente quer tratar isso mais como uma exceção do que como a regra neste estágio, mas algo que você pode querer estar ciente.