gpt4 book ai didi

c - struct statvfs 中的 f_bsize 和 f_frsize 代表什么?

转载 作者:太空狗 更新时间:2023-10-29 12:09:04 33 4
gpt4 key购买 nike

struct statvfs(由 statvfs 系统调用使用)中,有两个字段:f_bsizef_frsize。它们究竟代表什么?或者更具体地说,如果我需要获取文件系统的逻辑 block 大小,我应该使用哪一个?

这很令人困惑,因为在 Linux 手册页中,它是这样说的:

unsigned long f_bsize; /* file system block size */
unsigned long f_frsize; /* fragment size */

似乎 f_bsize 是我需要的逻辑 block 大小,而在 macOS 的手册页中说:

f_frsize The size in bytes of the minimum unit of allocation on this file system. (This corresponds to the f_bsize member of struct statfs.)
f_bsize The preferred length of I/O requests for files on this file system. (Corresponds to the f_iosize member of struct statfs.)

f_frsize 好像是逻辑 block 大小,最后我查了 POSIX 标准,这里是规范:

unsigned long f_bsize File system block size.
unsigned long f_frsize Fundamental file system block size.

我在谷歌上搜索了一段时间,但未能找到“基本文件系统 block 大小”的定义。有人可以提供帮助吗?

最佳答案

这取决于您的操作系统和文件系统。在 Linux 上,f_frsize 很少(如果有的话)与 f_bsize 不同——快速搜索内核源代码发现只有一个真实的用例(在 nfs 服务器代码中)设置了 f_frsize,它带有以下注释:

/*
* Current versions of glibc do not correctly handle the
* case where f_frsize != f_bsize. Eventually we want to
* report the value of wtmult in this field.
* (wtmult is presumed to be the nfs server's disk block size)
*/
buf->f_frsize = dentry->d_sb->s_blocksize;

/*
* On most *nix systems, f_blocks, f_bfree, and f_bavail
* are reported in units of f_frsize. Linux hasn't had
* an f_frsize field in its statfs struct until recently,
* thus historically Linux's sys_statfs reports these
* fields in units of f_bsize.
*/

并且在 fs/statfs.c 中,如果给定的文件系统驱动程序没有设置 frsize,则 frsize 将被设置为 bsize:

if (retval == 0 && buf->f_frsize == 0)
buf->f_frsize = buf->f_bsize;

“逻辑” block 大小是文件系统上 block 的大小(以字节为单位)(例如,相对于硬盘驱动器上的物理 block 大小),这就是 f_bsize 所指示的。

在我看来,POSIX 规范故意含糊不清,由每个文件系统来确定/记录这两个字段的确切含义。我个人认为“基本文件系统 block 大小”是指单个文件可以分配的最小数据量的大小,这是文件系统的一种基本单位。

也许我有点跑偏了-

可能由于 statvfs 与 statfs 存在一些混淆,它们是不同的函数/结构,两者都有名称为 f_frsize 和 f_bsize 的成员,这两个结构的含义不同。

MacOS 文档所说的是 statvfs.f_frsize 与 statfs.f_bsize 具有相同的含义,而 statvfs.f_bsize 同样等同于 statfs.iosize。

因此您可以使用 statfs.f_bsize 或 statvfs.f_frsize 来确定文件系统的逻辑 block 大小。 statvfs 是较新的 POSIX 标准方式,尽管有些系统建议不要使用它。

关于c - struct statvfs 中的 f_bsize 和 f_frsize 代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54823541/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com