STATFS - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-06-09
名称
statfs,fstatfs-获取文件系统统计信息
语法
#include / 或/
int statfs(const char * path,struct statfs * buf);
int fstatfs(int fd,struct statfs * buf);
说明
statfs()系统调用返回有关已挂载文件系统的信息。 path是已挂载文件系统中任何文件的路径名。 buf是指向statfs结构的指针,该结构大致如下定义:
struct statfs {
__fsword_t f_type; /* Type of filesystem (see below) */
__fsword_t f_bsize; /* Optimal transfer block size */
fsblkcnt_t f_blocks; /* Total data blocks in filesystem */
fsblkcnt_t f_bfree; /* Free blocks in filesystem */
fsblkcnt_t f_bavail; /* Free blocks available to
unprivileged user */
fsfilcnt_t f_files; /* Total inodes in filesystem */
fsfilcnt_t f_ffree; /* Free inodes in filesystem */
fsid_t f_fsid; /* Filesystem ID */
__fsword_t f_namelen; /* Maximum length of filenames */
__fsword_t f_frsize; /* Fragment size (since Linux 2.6) */
__fsword_t f_flags; /* Mount flags of filesystem
(since Linux 2.6.36) */
__fsword_t f_spare[xxx];
/* Padding bytes reserved for future use */
};
以下文件系统类型可能出现在f_type中:
ADFS_SUPER_MAGIC 0xadf5
AFFS_SUPER_MAGIC 0xadff
AFS_SUPER_MAGIC 0x5346414f
ANON_INODE_FS_MAGIC 0x09041934 /* Anonymous inode FS (for
pseudofiles that have no name;
e.g., epoll, signalfd, bpf) */
AUTOFS_SUPER_MAGIC 0x0187
BDEVFS_MAGIC 0x62646576
BEFS_SUPER_MAGIC 0x42465331
BFS_MAGIC 0x1badface
BINFMTFS_MAGIC 0x42494e4d
BPF_FS_MAGIC 0xcafe4a11
BTRFS_SUPER_MAGIC 0x9123683e
BTRFS_TEST_MAGIC 0x73727279
CGROUP_SUPER_MAGIC 0x27e0eb /* Cgroup pseudo FS */
CGROUP2_SUPER_MAGIC 0x63677270 /* Cgroup v2 pseudo FS */
CIFS_MAGIC_NUMBER 0xff534d42
CODA_SUPER_MAGIC 0x73757245
COH_SUPER_MAGIC 0x012ff7b7
CRAMFS_MAGIC 0x28cd3d45
DEBUGFS_MAGIC 0x64626720
DEVFS_SUPER_MAGIC 0x1373 /* Linux 2.6.17 and earlier */
DEVPTS_SUPER_MAGIC 0x1cd1
ECRYPTFS_SUPER_MAGIC 0xf15f
EFIVARFS_MAGIC 0xde5e81e4
EFS_SUPER_MAGIC 0x00414a53
EXT_SUPER_MAGIC 0x137d /* Linux 2.0 and earlier */
EXT2_OLD_SUPER_MAGIC 0xef51
EXT2_SUPER_MAGIC 0xef53
EXT3_SUPER_MAGIC 0xef53
EXT4_SUPER_MAGIC 0xef53
F2FS_SUPER_MAGIC 0xf2f52010
FUSE_SUPER_MAGIC 0x65735546
FUTEXFS_SUPER_MAGIC 0xbad1dea /* Unused */
HFS_SUPER_MAGIC 0x4244
HOSTFS_SUPER_MAGIC 0x00c0ffee
HPFS_SUPER_MAGIC 0xf995e849
HUGETLBFS_MAGIC 0x958458f6
ISOFS_SUPER_MAGIC 0x9660
JFFS2_SUPER_MAGIC 0x72b6
JFS_SUPER_MAGIC 0x3153464a
MINIX_SUPER_MAGIC 0x137f /* original minix FS */
MINIX_SUPER_MAGIC2 0x138f /* 30 char minix FS */
MINIX2_SUPER_MAGIC 0x2468 /* minix V2 FS */
MINIX2_SUPER_MAGIC2 0x2478 /* minix V2 FS, 30 char names */
MINIX3_SUPER_MAGIC 0x4d5a /* minix V3 FS, 60 char names */
MQUEUE_MAGIC 0x19800202 /* POSIX message queue FS */
MSDOS_SUPER_MAGIC 0x4d44
MTD_INODE_FS_MAGIC 0x11307854
NCP_SUPER_MAGIC 0x564c
NFS_SUPER_MAGIC 0x6969
NILFS_SUPER_MAGIC 0x3434
NSFS_MAGIC 0x6e736673
NTFS_SB_MAGIC 0x5346544e
OCFS2_SUPER_MAGIC 0x7461636f
OPENPROM_SUPER_MAGIC 0x9fa1
OVERLAYFS_SUPER_MAGIC 0x794c7630
PIPEFS_MAGIC 0x50495045
PROC_SUPER_MAGIC 0x9fa0 /* /proc FS */
PSTOREFS_MAGIC 0x6165676c
QNX4_SUPER_MAGIC 0x002f
QNX6_SUPER_MAGIC 0x68191122
RAMFS_MAGIC 0x858458f6
REISERFS_SUPER_MAGIC 0x52654973
ROMFS_MAGIC 0x7275
SECURITYFS_MAGIC 0x73636673
SELINUX_MAGIC 0xf97cff8c
SMACK_MAGIC 0x43415d53
SMB_SUPER_MAGIC 0x517b
SMB2_MAGIC_NUMBER 0xfe534d42
SOCKFS_MAGIC 0x534f434b
SQUASHFS_MAGIC 0x73717368
SYSFS_MAGIC 0x62656572
SYSV2_SUPER_MAGIC 0x012ff7b6
SYSV4_SUPER_MAGIC 0x012ff7b5
TMPFS_MAGIC 0x01021994
TRACEFS_MAGIC 0x74726163
UDF_SUPER_MAGIC 0x15013346
UFS_MAGIC 0x00011954
USBDEVICE_SUPER_MAGIC 0x9fa2
V9FS_MAGIC 0x01021997
VXFS_SUPER_MAGIC 0xa501fcf5
XENFS_SUPER_MAGIC 0xabba1974
XENIX_SUPER_MAGIC 0x012ff7b4
XFS_SUPER_MAGIC 0x58465342
_XIAFS_SUPER_MAGIC 0x012fd16d /* Linux 2.0 and earlier */
这些MAGIC常量中的大多数都在/usr/include/linux/magic.h中定义,有些在内核源代码中进行了硬编码。
f_flags字段是一个位掩码,指示文件系统的安装选项。它包含零个或多个以下位:
- ST_MANDLOCK
- 在文件系统上允许强制锁定(请参阅fcntl(2))。
- ST_NOATIME
- 不更新访问时间;参见mount(2)。
- ST_NODEV
- 禁止访问此文件系统上的设备专用文件。
- ST_NODIRATIME
- 不更新目录访问时间;参见mount(2)。
- ST_NOEXEC
- 在此文件系统上不允许执行程序。
- ST_NOSUID
- exec(3)将忽略此文件系统上的可执行文件的set-user-ID和set-group-ID位
- ST_RDONLY
- 该文件系统是只读安装的。
- ST_RELATIME
- 相对于mtime / ctime更新atime;参见mount(2)。
- ST_SYNCHRONOUS
- 写入立即同步到文件系统(请参阅open(2)中的O_SYNC描述)。
没有人知道f_fsid应该包含什么(但请参见下文)。
对于特定文件系统,未定义的字段设置为0。
fstatfs()返回有关描述符fd引用的打开文件的相同信息。
返回值
成功时,返回零。如果出错,则返回-1,并正确设置errno。
错误说明
- EACCES
- (statfs())拒绝对path的路径前缀的组成部分进行搜索。 (另请参见path_resolution(7)。)
- EBADF
- (fstatfs())fd不是有效的打开文件描述符。
- EFAULT
- buf或path指向无效的地址。
- EINTR
- 呼叫被信号打断;参见signal(7)。
- EIO
- 从文件系统读取时发生I / O错误。
- ELOOP
- (statfs())在翻译路径中遇到太多符号链接。
- ENAMETOOLONG
- (statfs())路径太长。
- ENOENT
- (statfs())路径引用的文件不存在。
- ENOMEM
- 内核内存不足。
- ENOSYS
- 文件系统不支持此调用。
- ENOTDIR
- (statfs())path的路径前缀的组成部分不是目录。
- EOVERFLOW
- 一些值太大而无法在返回的结构中表示。
遵循规范
特定于Linux。 Linux statfs()受4.4BSD的启发(但它们没有使用相同的结构)。
备注
用于statfs结构定义中各个字段的__fsword_t类型是glibc内部类型,不适合公共使用。当试图将这些字段复制或比较到程序中的局部变量时,这使程序员陷入了一个难题。在大多数系统上,将unsigned int用于此类变量就足够了。
最初的Linux statfs()和fstatfs()系统调用在设计时并未考虑到非常大的文件大小。随后,Linux 2.6添加了采用新结构statfs64的新statfs64()和fstatfs64()系统调用。新结构包含与原始statfs结构相同的字段,但是增加了各种字段的大小,以适应较大的文件大小。 glibc statfs()和fstatfs()包装函数透明地处理内核差异。
某些系统仅具有,其他系统也具有,其中前者包括后者。因此,似乎包括前者是最佳选择。
LSB已弃用该库调用statfs()和fstatfs(),并告诉我们改用statvfs(2)和fstatvfs(2)。
The f_fsid field
Solaris,Irix和POSIX具有系统调用statvfs(2),该函数返回包含无符号长f_fsid的struct statvfs(在中定义)。 Linux,SunOS,HP-UX,4.4BSD具有系统调用statfs(),该函数返回包含fsid_t f_fsid的struct statfs(在中定义),其中fsid_t定义为struct {int val [2]; }。对于FreeBSD,除了使用include file之外,其他情况相同。
通常的想法是f_fsid包含一些随机的内容,以便该对(f_fsid,ino)唯一确定一个文件。某些操作系统使用设备号(或设备号)或与文件系统类型结合使用的设备号。几个操作系统限制仅将f_fsid字段分配给超级用户(对于非特权用户,则将其设置为零),因为导出NFS时,此字段在文件系统的文件句柄中使用,并且将其分配给安全是一个安全问题。
在某些操作系统下,fsid可用作sysfs(2)系统调用的第二个参数。
BUGS
从Linux 2.6.38到Linux 3.1(包括Linux 3.1),fstatfs()失败,并为pipe(2)创建的文件描述符显示错误ENOSYS。
另外参见
stat(2),statvfs(3),path_resolution(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。

