为什么“pydf”和“df”显示不同的磁盘使用百分比?

为什么“pydf”和“df”显示不同的磁盘使用百分比?

我多次注意到这一点,pydfdf给出了一些不同的磁盘使用值。例如:

$ df -h | grep sdb1
/dev/sdb1        11T  9.6T  705G  94% /mnt/disk
$ pydf | grep sdb1
/dev/sdb1   11T  10T  704G 88.6 [############.] /mnt/disk

pydf显示 10TB/已使用 88.6%,并df -h显示 9.6TB/已使用 94%。

即使我添加索引节点,也会pydf -i显示:

$ pydf -i | grep sdb1
/dev/sdb1   349M 205k  349M  0.1 [.............] /mnt/disk

显然,磁盘空间太小,不足以弥补 0.4TB 的空间。

注意——区别不在可用磁盘空间中- 这是一个“实时”系统,因此命令之间的可用磁盘空间略有变化(704GB 与 705GB) - 当我在空闲系统上运行它并使用 KB 时,它与来自的数字pydf相同df

谁能解释其中的区别吗?

示例来自 debian linux 10,但我也在其他系统上看到过。

附加信息:

块大小为 4096 字节,当强制使用块大小时,比较如下所示(编辑以匹配“列”):

$ (df --block-size=4096 && pydf --blocks) | grep sdb1
/dev/sdb1  2906334056 2568838216 191006112  94% /mnt/disk
/dev/sdb1  2906334056 2568838332 191005996  88.4 [#######.] /mnt/disk

再说一遍,因为它是一个“实时系统”,所以这些值有点不同,但出于这个目的,我认为可以将这些值(百分比除外)称为相同的。

至于该文件系统上的内容 - 它基本上是 DVR(数字录像机)数据磁盘 - 因此有大型视频剪辑,大部分为 50-300MB,几乎没有其他(较小)文件。

答案1

df(1)手册页中,人们可能会读到类似的内容

值以每块 512 字节计数显示

所以一个结论是,df通过块来衡量,而另一种工具则通过其他东西来衡量。这两个工具可能都使用某种形式的stat 调用(lstat可能)来获取有关文件大小的信息;stat(2)人们可能会注意到在手册页中

struct stat {
    ...
    off_t           st_size;    /* file size, in bytes */
    blkcnt_t        st_blocks;  /* blocks allocated for file */

文件大小以字节为单位,并为该文件分配了多个块。这可能建议进行一项测试,包含一个字节的文件的 st_size 和 st_blocks 是多少?

#include <sys/stat.h>
#include <stdio.h>

int main(void) {
        struct stat buf;
        stat("file", &buf);
        printf("size\t%lld\nblocks\t%lld\n", buf.st_size, buf.st_blocks);
        return 0;
}

该脚本编译为blocksize合适的测试文件:

$ make blocksize
cc -O2 -pipe    -o blocksize blocksize.c
$ printf 1 > file
$ ./blocksize
size    1
blocks  4

显示我们的一字节文件的大小为 1,但在此系统上消耗 4 块空间。块计数和块大小可能会有所不同,但这将解释按文件大小进行计数的工具 ( st_size) 与计算st_blocks使用的文件系统块数 ( ) 的工具之间的差异。

相关内容