我多次注意到这一点,pydf
并df
给出了一些不同的磁盘使用值。例如:
$ 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
使用的文件系统块数 ( ) 的工具之间的差异。