- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 struct statvfs
(由 statvfs
系统调用使用)中,有两个字段:f_bsize
和 f_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/
在 struct statvfs(由 statvfs 系统调用使用)中,有两个字段:f_bsize 和 f_frsize。它们究竟代表什么?或者更具体地说,如果我需要获取文件系统的逻辑 block 大
我是一名优秀的程序员,十分优秀!