【问题标题】:df percent used mysterydf 百分比已使用神秘
【发布时间】:2014-07-11 13:21:06
【问题描述】:

我对 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%,因为这就是使用了多少。我错过了什么?这不仅仅是一个舍入错误,是吗??

【问题讨论】:

  • 谷歌快速搜索http://larsmichelsen.com/open-source/answer-why-does-df-k-show-wrong-percentage-usage/
  • @Jidder 您的链接无效。
  • @Lu.nemec 似乎在percentage 之后添加了两个字符,不知道为什么,我认为它在我第一次发布时有效。无论如何,只需从 url 中删除它们,它就会转到正确的位置。

标签: python bash unix filesystems


【解决方案1】:

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

【讨论】:

  • 是的,我知道 1024000KB - 这就是 f_bfree 和 f_bavail 之间的区别。
  • (1024000+3930688) / 20158332.0 = 0.2457885900480258
  • 您的文件系统的格式是什么?你能把命令的输出粘贴到这里吗df -k
  • df 的输出在我的原始帖子中。它不显示格式。当我查看 mount 命令的输出时,它告诉我它是 ext4。
【解决方案2】:

除了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已用空间下报告此问题,因为普通用户无法使用保留空间。

【讨论】:

    【解决方案3】:

    totalfreeavail 都是使用整数而非浮点除法计算的。试试

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

    强制浮点除法。比较

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

    (这只是 Python 2 中不使用from __future__ import division 时的问题。)

    【讨论】:

    • 这个和四舍五入没有关系,用的是19%
    • 我同意,吉德。无论如何,我更改了脚本,但它并没有真正帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多