df百分比使用了神秘感

时间:2014-07-11 13:21:06

标签: python bash unix filesystems

我对Unix 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%)
$ 

因此总字节数,可用空间(未标记的)匹配以及已用空间(基于可用空间)都匹配。精彩!那么df报道如何使用21%?我认为应该报告19%,因为这是使用了多少。我错过了什么?这不仅仅是一个舍入错误,是吗??

3 个答案:

答案 0 :(得分:2)

我认为这是因为在您的情况下您的文件系统占用1024000(20158332-3930688-15203644)块,然后df命令报告使用百分比为(1024000 + 3930688)/ 20158332 = 24%。在您的python代码中,您只需计算使用百分比为3930688/20158332 = 19%。

答案 1 :(得分: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已用空间下报告此情况,因为普通用户无法使用预留空间。

答案 2 :(得分: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时的一个问题。)