2014-07-11 14 views
0

我很困惑有關Unix df命令如何達到用於文件系統的百分比。這裏有一個小劇本我寫了獨立運行df,找出相同的信息:df百分比使用神祕

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.0 (Santiago) 
$ cat dftest.py 
#! /usr/bin/python 

import sys 
import os 
import subprocess 

def reportUsage(label, total, free): 
    used = total - free 
    print "%s=%dK, used=%dK (%d%%)" % (label, free, used, used*100/total) 

p = subprocess.Popen(["df", "-k", "."], stdout=subprocess.PIPE) 
print p.stdout.read() 
rc = p.wait() 

stat = os.statvfs(".") 
total = (stat.f_bsize * stat.f_blocks)/1024 
free = (stat.f_bsize * stat.f_bfree)/1024 
avail = (stat.f_bsize * stat.f_bavail)/1024 

print "Total=%dK" % total 
reportUsage("Free", total, free) 
reportUsage("Avail", total, avail) 
$ ./dftest.py 
Filesystem   1K-blocks  Used Available Use% Mounted on 
/dev/sda4    20158332 3930688 15203644 21% /home 

Total=20158332K 
Free=16227644K, used=3930688K (19%) 
Avail=15203644K, used=4954688K (24%) 
$ 

所以總字節數,可用空間(unprivledged)相匹配,並用空間(基於自由空間)的所有比賽。精彩!那麼df如何報告21%使用?我認爲它應該報告19%,因爲這是多少使用。我錯過了什麼?這不僅僅是一個舍入誤差,是嗎?

+0

快速谷歌搜索'http:// larsmichelsen.com/open-source/answer-why-does-df-k-show-wrong-percentage-usage /' –

+0

@Jidder您的鏈接不起作用。 –

+0

@ Lu.nemec似乎在百分比之後加了兩個字符,不知道爲什麼,我認爲它在我第一次發佈時就起作用了。無論如何,只需從網址中刪除它們並將其放到正確的位置。 –

回答

0

totalfreeavail都是使用整數而不是浮點除法來計算的。嘗試

total = (stat.f_bsize * stat.f_blocks)/1024.0 

其中強制浮點除法。比較

>>> 9/2 
4 
>>> 9/2.0 
4.5 

(這僅是一個問題,在Python 2不使用from __future__ import division時。)

+0

這與舍入無關,它使用19% –

+0

我同意,Jidder。無論如何,我改變了腳本,並沒有真正的幫助。 – mrbruno

2

我相信這是因爲,在你的情況下,你的文件系統佔用1024000(20158332-3930688-15203644)塊,那麼df命令將使用百分比報告爲(1024000 + 3930688)/ 20158332 = 24%。在你的python代碼中,你只需計算使用百分比爲3930688/20158332 = 19%。

+0

這是正確的 –

+0

是的,我知道1024000KB - 這是f_bfree和f_bavail之間的區別。 – mrbruno

+0

(1024000 + 3930688)/ 20158332.0 = 0.2457885900480258 – mrbruno

1

添加到zhujs註釋中,其原因是在創建文件系統期間分配的保留空間。您可以運行下面看到預留的空間和你的FS塊大小

$ sudo tune2fs -l /dev/sda4 | grep -iE 'reserved block count|block size' 

這取決於你的FS,但我猜你的系統上的輸出看起來像這樣

Reserved block count:  256000 
Block size:    4096 

和表示1024000 1K塊被保留。 df根據報告此使用空間,因爲保留空間不適用於普通用戶。