名前

statfs, fstatfs - ファイルシステムの統計を取得する

書式

#include <sys/vfs.h> /* または <sys/statfs.h> */
 
int statfs(const char *path, struct statfs *buf);
 
int fstatfs(int fd, struct statfs *buf);

説明

関数 statfs() はマウントされたファイルシステムについての情報を返す。 path はマウントされたファイルシステムにあるファイルのパス名である。 bufstatfs 構造体へのポインターで、およそ以下のように定義される:
 

#if __WORDSIZE == 32		/* システムのワードサイズ */
# define __SWORD_TYPE           int
#else /* __WORDSIZE == 64 */
# define __SWORD_TYPE		long int
#endif
struct statfs { __SWORD_TYPE f_type; /* ファイルシステムの種別 (下記参照) */ __SWORD_TYPE f_bsize; /* 最適な転送ブロックサイズ */ fsblkcnt_t f_blocks; /* ファイルシステムの総データブロック数 */ fsblkcnt_t f_bfree; /* ファイルシステムの空きブロック数 */ fsblkcnt_t f_bavail; /* 非特権ユーザーが利用可能な空きブロック数 */ fsfilcnt_t f_files; /* ファイルシステムの総ファイルノード数 */ fsfilcnt_t f_ffree; /* ファイルシステムの空きファイルノード数 */ fsid_t f_fsid; /* ファイルシステムの ID */ __SWORD_TYPE f_namelen; /* ファイル名の最大長 */ __SWORD_TYPE f_frsize; /* フラグメントサイズ (Linux 2.6 以降) */ __SWORD_TYPE f_spare[5]; };
ファイルシステムの型:
ADFS_SUPER_MAGIC 0xadf5 AFFS_SUPER_MAGIC 0xADFF BDEVFS_MAGIC 0x62646576 BEFS_SUPER_MAGIC 0x42465331 BFS_MAGIC 0x1BADFACE BINFMTFS_MAGIC 0x42494e4d BTRFS_SUPER_MAGIC 0x9123683E CGROUP_SUPER_MAGIC 0x27e0eb CIFS_MAGIC_NUMBER 0xFF534D42 CODA_SUPER_MAGIC 0x73757245 COH_SUPER_MAGIC 0x012FF7B7 CRAMFS_MAGIC 0x28cd3d45 DEBUGFS_MAGIC 0x64626720 DEVFS_SUPER_MAGIC 0x1373 DEVPTS_SUPER_MAGIC 0x1cd1 EFIVARFS_MAGIC 0xde5e81e4 EFS_SUPER_MAGIC 0x00414A53 EXT_SUPER_MAGIC 0x137D EXT2_OLD_SUPER_MAGIC 0xEF51 EXT2_SUPER_MAGIC 0xEF53 EXT3_SUPER_MAGIC 0xEF53 EXT4_SUPER_MAGIC 0xEF53 FUSE_SUPER_MAGIC 0x65735546 FUTEXFS_SUPER_MAGIC 0xBAD1DEA 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 /* オリジナルの minix */ MINIX_SUPER_MAGIC2 0x138F /* 30 文字ファイル名の minix */ MINIX2_SUPER_MAGIC 0x2468 /* minix V2 */ MINIX2_SUPER_MAGIC2 0x2478 /* minix V2, 30 文字ファイル名 */ MINIX3_SUPER_MAGIC 0x4d5a /* minix V3 ファイルシステム, 60 文字ファイル名 */ MQUEUE_MAGIC 0x19800202 MSDOS_SUPER_MAGIC 0x4d44 NCP_SUPER_MAGIC 0x564c NFS_SUPER_MAGIC 0x6969 NILFS_SUPER_MAGIC 0x3434 NTFS_SB_MAGIC 0x5346544e OPENPROM_SUPER_MAGIC 0x9fa1 PIPEFS_MAGIC 0x50495045 PROC_SUPER_MAGIC 0x9fa0 PSTOREFS_MAGIC 0x6165676C QNX4_SUPER_MAGIC 0x002f QNX6_SUPER_MAGIC 0x68191122 RAMFS_MAGIC 0x858458f6 REISERFS_SUPER_MAGIC 0x52654973 ROMFS_MAGIC 0x7275 SELINUX_MAGIC 0xf97cff8c SMACK_MAGIC 0x43415d53 SMB_SUPER_MAGIC 0x517B SOCKFS_MAGIC 0x534F434B SQUASHFS_MAGIC 0x73717368 SYSFS_MAGIC 0x62656572 SYSV2_SUPER_MAGIC 0x012FF7B6 SYSV4_SUPER_MAGIC 0x012FF7B5 TMPFS_MAGIC 0x01021994 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

これらの MAGIC 定数のほとんどは /usr/include/linux/magic.h で定義されており、いくつかはカーネルソースで直接書かれている。
f_fsid にどんな値が入るべきなのかは誰も知らない (但し、下記を参照)。
それぞれのファイルシステムにおいて未定義のフィールドには 0 が 設定される。 fstatfs() はディスクリプター fd によって参照されるオープンされたファイルについて、同じ情報を返す。

返り値

成功した場合、0 が返される。 失敗した場合、 -1 が返され、 errno に適切な値がセットされる。

エラー

EACCES
(statfs() の場合) path のディレクトリ部分に検索許可が与えられていない ( path_resolution(7) も参照すること)。
EBADF
(fstatfs() の場合) fd は有効なオープンされたファイルディスクリプターではない。
EFAULT
buf または path が不正なアドレスを指している。
EINTR
この呼び出しがシグナルで中断された。
EIO
ファイルシステムからの読み込みの間に I/O エラーが発生した。
ELOOP
(statfs() の場合) path を解決するのに辿るべきシンボリックリンクが多すぎる。
ENAMETOOLONG
(statfs() の場合) path が長過ぎる。
ENOENT
(statfs() の場合) path によって参照されるファイルが存在しない。
ENOMEM
十分なカーネルメモリーがない。
ENOSYS
ファイルシステムがこの呼び出しをサポートしていない。
ENOTDIR
(statfs() の場合) path のディレクトリ部分がディレクトリでない。
EOVERFLOW
いくつかの値が大き過ぎて、返り値の構造体で表現できない。

準拠

Linux 固有である。 Linux の statfs() は 4.4BSD のものに影響を受けている。 (しかし同じ構造体を使用しているわけではない)

注意

元々の Linux の statfs() と fstatfs() システムコールは 非常に大きなファイルサイズを念頭に入れて設計されていなかった。 その後、Linux 2.6 で、新しい構造体 statfs64 を使用する 新しいシステムコール statfs64() と fstatfs64() が追加された。 新しい構造体は元の statfs 構造体と同じフィールドを持つが、 いろいろなフィールドのサイズが大きなファイルサイズに対応できるように 増やされている。 glibc の statfs() と fstatfs() のラッパー関数は カーネルによるこれらの違いを吸収している。
 
<sys/vfs.h> しか持たないシステムもあり、 <sys/statfs.h> も持っているシステムもある。 前者は後者をインクルードするので、 前者をインクルードするのが良いと考えられる。
 
LSB ではライブラリコール statfs(), fstatfs() を非推奨として、代わりに statvfs(2), fstatvfs(2) を使うように指示している。

f_fsid フィールド

Solaris, Irix, POSIX にはシステムコール statvfs(2) があり、 struct statvfs を返す ( <sys/statvfs.h> で定義されている)。 この構造体には、 unsigned long f_fsid が含まれている。 Linux, SunOS, HP-UX, 4.4BSD にはシステムコール statfs() があり、 struct statfs を返す ( <sys/vfs.h> で定義されている)。 この構造体には fsid_t f_fsid, が含まれており、 fsid_tstruct { int val[2]; } と定義されている。 FreeBSD でも同じであるが、インクルードファイル <sys/mount.h> を使う。
 
f_fsid はあるランダムな値を持ち、 ( f_fsid,ino) という 1 組の値でファイルを一意に決定できるようにする、 というのが基本的な考え方である。 いくつかの OS では、デバイス番号 (の変種) を使ったり、 デバイス番号とファイルシステムタイプを組み合わせて使ったりしている。 OS の中には f_fsid フィールドの取得をスーパーユーザーに限定しているものもある (非特権ユーザーが取得すると 0 となる)。 NFS でエクスポートされる場合、 このフィールドがファイルシステムのファイルハンドルで使われており、 この値を提供するとセキュリティ上の問題がある。
いくつかの OS では、 fsidsysfs(2) システムコールの第 2 引き数として使用できる。

バグ

Linux 2.6.38 から Linux 3.1 までは (3.1 を含む)、 fstatfs() は pipe(2) で作成されたファイルディスクリプターに対してはエラー ENOSYS で失敗していた。

関連項目

stat(2), statvfs(2), path_resolution(7)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

Recommended readings

Pages related to statfs64 you should read also: