stat()
在文件上,返回多个字段,包括st_blksize
.这被记录为“高效文件系统 I/O 的‘首选’块大小”。该值不用作其他stat()
字段的单位,也不在 POSIX 标准中的任何其他地方引用。
statvfs()
在文件上,返回多个字段,包括f_bsize
.它也返回f_frsize
。 是、、 和 的f_frsize
单位。 也被称为“基本文件系统块大小”和“片段大小”。f_blocks
f_bfree
f_bavail
f_frsize
我的手册页statvfs
描述f_bsize
为文件系统的块大小。这基本上没有告诉我什么。简介已经告诉我 statvfs() 返回有关整个文件系统的信息。
f_bsize
可以用来做什么?如果文件系统块大小不等于“基本文件系统块大小”,那么它意味着什么?与 Linux 和 BSD 和/或 UNIX 上的
f_bsize
情况相同吗?st_blksize
让我们忽略 FUSE 文件系统因违反此规则而设计的可能性。 NFS 服务器也是如此。我也不太关心f_bsize
代表文件系统范围的值,该值可能会被特定文件覆盖。我的想法是否正确,与 POSIX 不同的是
st_blksize
,POSIX 没有暗示 的任何特定含义f_bsize
?
答案1
FreeBSD 文档如下:
f_frsize
- 此文件系统上的最小分配单位的大小(以字节为单位)。 (这对应于f_bsize
的成员struct statfs
。)
f_bsize
- 此文件系统上文件的 I/O 请求的首选长度。 (对应于f_iosize
的成员struct statfs
。)statvfs() 和 fstatvfs() 函数用垃圾填充 buf 指向的结构。这些垃圾有时会与文件系统统计数据相似,但可移植应用程序不得依赖于此。
statvfs() 和 fstatvfs() 函数符合 IEEE Std 1003.1-2001 (``POSIX.1'')。按照标准化,便携式应用程序根本不能依赖这些函数返回任何有效信息。此实现尝试提供与底层文件系统提供的一样多的有用信息,但受指定数据类型的限制。
GNU coreutils中的命令stat
还可以显示“基本块大小”和“块大小”。它将后者记录为“(为了更快的传输)”。
我希望这些都是准确的原意。 POSIX 文档st_blksize
说“在某些文件系统类型中,这可能因文件而异”。这表明 POSIX 避免指定f_bsize
具有任何特定含义的原因之一。 (另一个是块大小的概念在某些文件系统上可能没有相同的意义,例如 UIBFS)
f_bsize
如果您熟悉您正在查询的特定文件系统实现,也可能有一些用处。
f_frsize
“片段大小”的原始含义
似乎描述“片段大小”应该理解为最初指的是文件系统上的片段,例如超高速文件系统。这些是小于“块”的分配单元。看ext3 文件系统中的片段大小是多少?
基于此,它似乎f_frsize
通常会小于或等于f_bsize
。
Linux ext2/ext3/ext4 不支持片段。一些 Linux 文件系统可能会报告较小的f_frsize
。虽然那是一个正在开发的 FUSE 文件系统,但我不知道它是什么,也不知道它为什么要使用“片段” / f_frsize
。