2009-06-08 6 views
5

Wenn ich den Statvfs-Befehl auf einem Linux-Rechner verwenden, um den verfügbaren freien Speicherplatz auf einem angehängten Dateisystem zu erhalten, ist die Zahl etwas anders als die von df gemeldet.Diskrepanz zwischen Aufruf von statvfs und df Befehl

Zum Beispiel, ein auf Maschine, die ich mit einer 500G Festplatte habe, bekomme ich die folgende Ausgabe von 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 

Ein Aufruf statvfs gibt mir eine Blockgröße von 4096 und 119.344.155 freien Blöcken, so dass es 488.833.658.880 Bytes frei geben sollte. Doch df-Berichte gibt es 463.828.406.272 Bytes frei. Warum gibt es hier eine Diskrepanz?

Antwort

7

Da Ihre Diskrepanz nahe bei 5% [1] liegt, was der Standardprozentsatz für root ist, besteht die Möglichkeit, dass Sie das df-Ergebnis mit dem -> f_bfree von statvfs und nicht mit -> f_bavail vergleichen. welches ist was df verwendet.

[1]: (488.833.658.880 - 463828406272)/492256247808 = 0,0508

+0

Ahh ... Ich verstehe. Ja, mit f_bavail sind die Nummern gleich. Vielen Dank für die Informationen. –

+0

Ich finde eine Diskrepanz bei der Berechnung der freien Prozentsätze. Wenn ich berechne (f_bavail * 100.0)/f_blocks "- erwarte ich (100 - Prozent verwenden von df). Allerdings - das ist um 4%. Der Fehler ist weiter aus, wenn ich f_bfree verwenden. –

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; 
} 

ich in dieser Form zu tun, weil ich das Ergebnis in Gb bevorzugen, aber Sie können die Einheiten der exponent.And ändern zu ändern gilt die erste Antwort, wie Sie sehen können, verwende ich das auch

Verwandte Themen