2009-06-08 6 views
5

पर कॉल के बीच विसंगति जब मैं एक लिनक्स मशीन पर statvfs कमांड का उपयोग करता हूं ताकि एक आरोहित फ़ाइल सिस्टम पर उपलब्ध खाली स्थान प्राप्त हो सके, मुझे प्राप्त संख्या डीएफ द्वारा रिपोर्ट की गई तुलना में थोड़ा अलग है।कॉलव्स और डीएफ कमांड

मशीन पर

उदाहरण के लिए, एक मैं एक 500G हार्ड ड्राइव के साथ है, मैं 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 

statvfs को एक कॉल मुझे 4096 और 119,344,155 मुक्त ब्लॉक के एक ब्लॉक आकार देता है तो, कि 488,833,658,880 बाइट मुक्त होना चाहिए। फिर भी, डीएफ रिपोर्ट 463,828,406,272 बाइट्स मुक्त हैं। यहां एक विसंगति क्यों है?

उत्तर

7

चूंकि आपकी विसंगति 5% [1] के करीब है, जो रूट के लिए आवंटित डिफ़ॉल्ट प्रतिशत है, इसलिए संभावना है कि आप डीएफ परिणाम की तुलना statsfs के f_bfree और के साथ नहीं करें -> f_bavail के साथ, जो डीएफ उपयोग करता है।

[1]: (+४८८८३३६५८८८० - 463828406272)/492256247808 = 0,0508

+0

आह का उपयोग करता हूं ... मैं देखता हूं। हां, f_bavail का उपयोग करके संख्याएं समान हैं। जानकारी के लिए बहुत - बहुत धन्यवाद। –

+0

मुझे मुफ्त के प्रतिशत की गणना करने में एक विसंगति मिल रही है। जब मैं गणना करता हूं (f_bavail * 100.0)/f_blocks "- मुझे उम्मीद है कि (100 - डीएफ से 100 प्रतिशत उपयोग करें)। हालांकि - यह 4% से बाहर है। अगर मैं 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; 
} 

मैं इस रूप में करते हैं, क्योंकि मैं जीबी में परिणाम पसंद करते हैं, लेकिन आप exponent.And बदलते इकाइयों संशोधित कर सकते हैं सच है पहला जवाब, जैसा कि आप देख सकते हैं, मैं भी

संबंधित मुद्दे