关于`statfs64`的更多解释
More explanation on `statfs64`
根据文档,结构字段解释如下:
struct statfs {
__SWORD_TYPE f_type; /* type of file system (see below) */
__SWORD_TYPE f_bsize; /* optimal transfer block size */
fsblkcnt_t f_blocks; /* total data blocks in file system */
fsblkcnt_t f_bfree; /* free blocks in fs */
fsblkcnt_t f_bavail; /* free blocks available to
unprivileged user */
fsfilcnt_t f_files; /* total file nodes in file system */
fsfilcnt_t f_ffree; /* free file nodes in fs */
fsid_t f_fsid; /* file system id */
__SWORD_TYPE f_namelen; /* maximum length of filenames */
__SWORD_TYPE f_frsize; /* fragment size (since Linux 2.6) */
__SWORD_TYPE f_spare[5];
};
“文件系统中的总文件节点数”是否表示我们有多少现有文件?它包括目录和链接吗?
“fs 中的空闲文件节点”是什么意思?
什么是f_spare?
在某些 Linux 分支中(例如,在 Android 中)我看到 f_spare
大小为 4,并且定义了附加字段 f_flags
。为 f_flags
定义了哪些标志?
f_fsid
是唯一标识文件系统的随机数,还是什么?
Does "total file nodes in file system" mean how much existing files we have? Does it include directories and links?
差不多。是的,它包括目录和软链接,但两个文件可以共享同一个 inode。在那种情况下,它们是硬链接的并且在硬盘上共享相同的 space,但在文件系统中被视为不同的文件。举例说明:
% echo Hello > test1.txt
% ln test1.txt test2.txt
% ls -i test1.txt test2.txt
14946320 test1.txt 14946320 test2.txt
您将在文件名左侧看到的数字是索引节点(您的数字与我的示例中的数字不同)。如您所见,它们具有相同的 inode。如果您对一个文件进行更改,相同的更改将通过另一个文件可见。
What does mean "free file nodes in fs"?
一个文件系统通常有一个它可以跟踪的 inode 的上限。实际类型 fsfilcnt_t
设置了一个限制(在我的系统上为 18446744073709551615),但它很可能更低。除非您以非常特殊的方式使用您的文件系统,否则这个限制通常不是问题。
What is f_spare? In some Linux forks (for example, in Android) I see that f_spare size is 4, and additional field f_flags is defined.
f_spare
只是填充结构本身的备用字节。填充字节保留供将来使用。如果将来向结构添加一个 __fsword_t
信息,他们将从 f_spare
中删除一个备用 __fsword_t
。例如,我的系统只有 4 个备用 __fsword_t
s(32 字节)。
What flags are defined for f_flags?
为您的系统定义的安装标志可能不同,但我的 man statfs64
页面显示这些:
ST_MANDLOCK
Mandatory locking is permitted on the filesystem (see fcntl(2)).
ST_NOATIME
Do not update access times; see mount(2).
ST_NODEV
Disallow access to device special files on this filesystem.
ST_NODIRATIME
Do not update directory access times; see mount(2).
ST_NOEXEC
Execution of programs is disallowed on this filesystem.
ST_NOSUID
The set-user-ID and set-group-ID bits are ignored by exec(3) for executable files on this filesystem
ST_RDONLY
This filesystem is mounted read-only.
ST_RELATIME
Update atime relative to mtime/ctime; see mount(2).
ST_SYNCHRONOUS
Writes are synched to the filesystem immediately (see the description of O_SYNC in open(2)).
ST_MANDLOCK
Mandatory locking is permitted on the filesystem (see fcntl(2)).
ST_NOATIME
Do not update access times; see mount(2).
ST_NODEV
Disallow access to device special files on this filesystem.
ST_NODIRATIME
Do not update directory access times; see mount(2).
ST_NOEXEC
Execution of programs is disallowed on this filesystem.
ST_NOSUID
The set-user-ID and set-group-ID bits are ignored by exec(3) for executable files on this filesystem
ST_RDONLY
This filesystem is mounted read-only.
ST_RELATIME
Update atime relative to mtime/ctime; see mount(2).
ST_SYNCHRONOUS
Writes are synched to the filesystem immediately (see the description of O_SYNC in open(2)).
Is f_fsid just random number that uniquely identifies the file system, or what is it?
直接来自 man statfs64
页面:"Nobody knows what f_fsid is supposed to contain (but see below)" 以及以下内容:
f_fsid
字段
Solaris、Irix 和 POSIX 有一个系统调用 statvfs(2),它 returns 一个包含无符号长整数 f_fsid 的结构体 statvfs(在 中定义)。 Linux、SunOS、HP-UX、4.4BSD 有一个系统调用 statfs(),它 returns 一个包含 fsid_t f_fsid 的结构体 statfs(在 中定义),其中 fsid_t 被定义为 struct { int val[2]; }. FreeBSD 也是如此,只是它使用包含文件 .
一般的想法是 f_fsid 包含一些随机的东西,使得 (f_fsid,ino) 对唯一地确定一个文件。一些操作系统使用(变体)设备号,或设备号与文件系统类型相结合。一些操作系统限制仅将 f_fsid 字段提供给超级用户(对于非特权用户将其归零),因为该字段在 NFS 导出时用于文件系统的文件句柄中,并且将其提供是一个安全问题.
在某些操作系统下,fsid 可以用作 sysfs(2) 系统调用的第二个参数。
根据文档,结构字段解释如下:
struct statfs {
__SWORD_TYPE f_type; /* type of file system (see below) */
__SWORD_TYPE f_bsize; /* optimal transfer block size */
fsblkcnt_t f_blocks; /* total data blocks in file system */
fsblkcnt_t f_bfree; /* free blocks in fs */
fsblkcnt_t f_bavail; /* free blocks available to
unprivileged user */
fsfilcnt_t f_files; /* total file nodes in file system */
fsfilcnt_t f_ffree; /* free file nodes in fs */
fsid_t f_fsid; /* file system id */
__SWORD_TYPE f_namelen; /* maximum length of filenames */
__SWORD_TYPE f_frsize; /* fragment size (since Linux 2.6) */
__SWORD_TYPE f_spare[5];
};
“文件系统中的总文件节点数”是否表示我们有多少现有文件?它包括目录和链接吗?
“fs 中的空闲文件节点”是什么意思?
什么是f_spare?
在某些 Linux 分支中(例如,在 Android 中)我看到 f_spare
大小为 4,并且定义了附加字段 f_flags
。为 f_flags
定义了哪些标志?
f_fsid
是唯一标识文件系统的随机数,还是什么?
Does "total file nodes in file system" mean how much existing files we have? Does it include directories and links?
差不多。是的,它包括目录和软链接,但两个文件可以共享同一个 inode。在那种情况下,它们是硬链接的并且在硬盘上共享相同的 space,但在文件系统中被视为不同的文件。举例说明:
% echo Hello > test1.txt
% ln test1.txt test2.txt
% ls -i test1.txt test2.txt
14946320 test1.txt 14946320 test2.txt
您将在文件名左侧看到的数字是索引节点(您的数字与我的示例中的数字不同)。如您所见,它们具有相同的 inode。如果您对一个文件进行更改,相同的更改将通过另一个文件可见。
What does mean "free file nodes in fs"?
一个文件系统通常有一个它可以跟踪的 inode 的上限。实际类型 fsfilcnt_t
设置了一个限制(在我的系统上为 18446744073709551615),但它很可能更低。除非您以非常特殊的方式使用您的文件系统,否则这个限制通常不是问题。
What is f_spare? In some Linux forks (for example, in Android) I see that f_spare size is 4, and additional field f_flags is defined.
f_spare
只是填充结构本身的备用字节。填充字节保留供将来使用。如果将来向结构添加一个 __fsword_t
信息,他们将从 f_spare
中删除一个备用 __fsword_t
。例如,我的系统只有 4 个备用 __fsword_t
s(32 字节)。
What flags are defined for f_flags?
为您的系统定义的安装标志可能不同,但我的 man statfs64
页面显示这些:
ST_MANDLOCK
Mandatory locking is permitted on the filesystem (see fcntl(2)).
ST_NOATIME
Do not update access times; see mount(2).
ST_NODEV
Disallow access to device special files on this filesystem.
ST_NODIRATIME
Do not update directory access times; see mount(2).
ST_NOEXEC
Execution of programs is disallowed on this filesystem.
ST_NOSUID
The set-user-ID and set-group-ID bits are ignored by exec(3) for executable files on this filesystem
ST_RDONLY
This filesystem is mounted read-only.
ST_RELATIME
Update atime relative to mtime/ctime; see mount(2).
ST_SYNCHRONOUS
Writes are synched to the filesystem immediately (see the description of O_SYNC in open(2)).
ST_MANDLOCK
Mandatory locking is permitted on the filesystem (see fcntl(2)).
ST_NOATIME
Do not update access times; see mount(2).
ST_NODEV
Disallow access to device special files on this filesystem.
ST_NODIRATIME
Do not update directory access times; see mount(2).
ST_NOEXEC
Execution of programs is disallowed on this filesystem.
ST_NOSUID
The set-user-ID and set-group-ID bits are ignored by exec(3) for executable files on this filesystem
ST_RDONLY
This filesystem is mounted read-only.
ST_RELATIME
Update atime relative to mtime/ctime; see mount(2).
ST_SYNCHRONOUS
Writes are synched to the filesystem immediately (see the description of O_SYNC in open(2)).
Is f_fsid just random number that uniquely identifies the file system, or what is it?
直接来自 man statfs64
页面:"Nobody knows what f_fsid is supposed to contain (but see below)" 以及以下内容:
f_fsid
字段
Solaris、Irix 和 POSIX 有一个系统调用 statvfs(2),它 returns 一个包含无符号长整数 f_fsid 的结构体 statvfs(在 中定义)。 Linux、SunOS、HP-UX、4.4BSD 有一个系统调用 statfs(),它 returns 一个包含 fsid_t f_fsid 的结构体 statfs(在 中定义),其中 fsid_t 被定义为 struct { int val[2]; }. FreeBSD 也是如此,只是它使用包含文件 .
一般的想法是 f_fsid 包含一些随机的东西,使得 (f_fsid,ino) 对唯一地确定一个文件。一些操作系统使用(变体)设备号,或设备号与文件系统类型相结合。一些操作系统限制仅将 f_fsid 字段提供给超级用户(对于非特权用户将其归零),因为该字段在 NFS 导出时用于文件系统的文件句柄中,并且将其提供是一个安全问题.
在某些操作系统下,fsid 可以用作 sysfs(2) 系统调用的第二个参数。