2009-06-08 13 views
5

Quando uso il comando statvfs su una macchina Linux per ottenere lo spazio disponibile disponibile su un file system montato, il numero che ottengo è leggermente diverso da quello riportato da df.Discrepanza tra la chiamata a statvfs e il comando df

Per esempio, uno sulla macchina che ho con un disco rigido 500G, ottengo il seguente output di df:

# df --block-size=1 --no-sync 
Filesystem   1B-blocks  Used Available Use% Mounted on 
/dev/md0    492256247808 3422584832 463828406272 1%/
tmpfs    2025721856   0 2025721856 0% /lib/init/rw 
varrun    2025721856 114688 2025607168 1% /var/run 
varlock    2025721856  4096 2025717760 1% /var/lock 
udev     2025721856 147456 2025574400 1% /dev 
tmpfs    2025721856  94208 2025627648 1% /dev/shm 

Una chiamata a statvfs mi dà una dimensione del blocco di 4096 e 119344155 blocchi liberi, in modo da che ci dovrebbero essere 488,833,658,880 byte liberi. Tuttavia, df riporta 463.828.406.272 byte gratuiti. Perché c'è una discrepanza qui?

risposta

7

Poiché la discrepanza è vicina al 5% [1], che è la percentuale predefinita allocata per root, esiste la possibilità che si confronti il ​​risultato df con -> f_bfree di statvfs e non con -> f_bavail, che è ciò che df usa.

[1]: (488.833.658,88 mille - 463828406272)/492256247808 = 0,0508

+0

Ahh ... Capisco. Sì, usando f_bavail i numeri sono gli stessi. Grazie molte per l'informazione. –

+0

Sto riscontrando una discrepanza nel calcolo delle percentuali di libero. Quando calcolo (f_bavail * 100.0)/f_blocks "- mi aspetto di avere (100 - utilizzare la percentuale da df), tuttavia - questo è fuori dal 4% .L'errore è più lontano se uso f_bfree. –

0
#include <stdio.h> 
#include <sys/statvfs.h> 
int main(){ 
    struct statvfs stat; 
    int a=statvfs("/",&stat); 
    printf("total free disk space of the partition: %d GB \n",(stat.f_bavail)*8/2097152); 
    //512 is 2^9 - one half of a kilobyte. 
    //A kilobyte is 2^10. A megabyte is 2^20. A gigabyte is 2^30. A terabyte 
    //is 2^40. And so on. The common computer units go up by 10's of powers 
    //of 2 like that. 
    //So you need to divide by 2^(30-9) == 2^21 == 2097152 to get gigabytes. 
    //And multiply by 8 because 1 byte=8bit 
    return 0; 
} 

faccio in questa forma perché preferisco il risultato in GB, ma è possibile modificare le unità che cambiano l'exponent.And è vero la prima risposta, come puoi vedere, la uso anch'io

Problemi correlati