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

时间:2019-02-22 09:08:29

标签: c linux macos filesystems

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

这非常令人困惑,因为在Linux手册页中说:

  

unsigned long f_bsize; / *文件系统块大小* /
  无符号长f_frsize; / *片段大小* /

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

  

f_frsize此文件系统上最小分配单位的大小(以字节为单位)。 (这对应于struct statfs的f_bsize成员。)
  f_bsize此文件系统上文件的I / O请求的首选长度。 (对应于struct statfs的f_iosize成员。)

似乎f_frsize是逻辑块大小,最后我检查了POSIX标准,这是规范:

  

无符号长f_bsize文件系统块大小。
  unsigned long f_frsize基本文件系统块大小。

我已经搜索了一段时间,但是找不到“基本文件系统块大小”的定义。有人可以提供帮助吗?

1 个答案:

答案 0 :(得分:2)

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

/*
 * 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设置为bsize,则将其设置为bsize:

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

“逻辑”块大小是文件系统上块的字节大小(例如,相对于硬盘驱动器上的物理块大小),这就是f_bsize表示的。

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

也许我已经切线了-

由于statvfs与statfs不同,它们可能是一些混淆,它们是不同的功能/结构,两者的成员名称分别为f_frsize和f_bsize,在这两种结构中含义不同。

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

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