我想使用 statvfs 的返回值来获取文件系统的总大小和空闲大小。
unsigned long f_bsize; /* Filesystem block size */
unsigned long f_frsize; /* Fragment size */
fsblkcnt_t f_blocks; /* Size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* Number of free blocks */
...
来源:https ://man7.org/linux/man-pages/man3/statvfs.3.html
因此,要获得文件系统的总大小,我似乎想要f_blocks * f_frsize
,因为评论f_blocks
说它是“以单位为f_frsize
单位”的大小。但是,f_bfree
是空闲块的数量。所以对于免费的文件系统大小,我必须使用f_bsize
?还是f_frsize
再来一次?
谷歌是你最好的朋友。“difference vs f_frsize and f_bsize” =>“的结果,
如果你有 8KB 的块大小并试图将 1KB 的文件写入块,结果你浪费了 7KB 的块空间。但最近我注意到文件块的片段。在同样的情况,如果你有 8KB 的文件块和 1KB 的片段大小 - 你可以节省你的块空间,因为 1KB 的文件只会填充 1 个片段。其他 7 个片段将用于其他文件。”
您的问题的答案是:使用 f_bsize。
块的碎片似乎是某些遗留文件系统中的文件系统功能(谷歌搜索表明 UFS 和 JFS 有它的用途)。
片段大小似乎表明片段允许并且应该在 1 和 之间的最小值
f_bsize
。在不支持它的文件系统上,这个值应该等于
f_bsize
(或为零,见下文),因为不支持进一步的块碎片。如果您检查
coreutils
源代码(至少在基于 redhat 的系统上),您可以看到 GNU 如何在df
. 鉴于 GNU应该使用各种风格的 UNIX 来处理各种 POSIX 语义,而不仅仅是 Linux,它应该就如何解决这个问题提供相当可靠的建议。在
lib/fsusage.c
在他们的代码中,他们将 POSIX
statvfs
结构复制到他们自己制作的结构中,但重要的部分是124-126
显示他们正在做什么的行:使用f_frsize
if 它不为零,否则使用f_bsize
.我的建议是复制他们的方法,因为
df
在野外和随着时间的推移,它们的分布非常广泛。如果它不正确,人们希望有人会指出它现在报告错误的值。您还应该知道,更现代的文件系统对文件系统使用的概念相当模糊。
btrfs
突然想到由于重新链接副本,配额和快照不再给出确切的绝对值。在此阶段,您可能更希望将此视为例外而不是规则,但您可能需要注意这一点。