STATFS - Linux手册页

时间:2019-08-20 17:58:44  来源:igfitidea点击:

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/