gpt4 book ai didi

c++ - 关于 `statfs64` 的更多解释

转载 作者:行者123 更新时间:2023-11-28 04:03:06 40 4
gpt4 key购买 nike

根据文档,结构字段解释如下:

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?

差不多。是的,它包括目录和软链接(soft link),但两个文件可以共享同一个 inode。在那种情况下,它们是硬链接(hard link)的并且在硬盘上共享相同的空间,但在文件系统中被视为不同的文件。举例说明:

% echo Hello > test1.txt
% ln test1.txt test2.txt
% ls -i test1.txt test2.txt
14946320 test1.txt 14946320 test2.txt

您将在文件名左侧看到的数字是 inode (与我的示例中的数字不同)。如您所见,它们具有相同的 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(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 页面:“没人知道 f_fsid 应该包含什么(但请参阅下文)” 以及更进一步的内容:

f_fsid 字段

Solaris、Irix 和 POSIX 有一个系统调用 statvfs(2),它返回一个包含无符号长 f_fsid 的结构 statvfs(在 中定义)。 Linux、SunOS、HP-UX、4.4BSD 有一个系统调用 statfs(),它返回一个包含 fsid_t f_fsid 的 struct statfs(在 中定义),其中 fsid_t 定义为 struct { int val[2]; }.这同样适用于 FreeBSD,只是它使用包含文件。

一般的想法是 f_fsid 包含一些随机的东西,使得 (f_fsid,ino) 对唯一地确定一个文件。一些操作系统使用(变体)设备号,或设备号与文件系统类型相结合。一些操作系统限制仅将 f_fsid 字段提供给 super 用户(对于非特权用户将其归零),因为该字段在 NFS 导出时用于文件系统的文件句柄中,并且将其提供是一个安全问题。

在某些操作系统下,fsid 可以用作 sysfs(2) 系统调用的第二个参数。

关于c++ - 关于 `statfs64` 的更多解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180592/

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