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/。