STATFS(2)

名前
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 はマウントされたファイルシステムにあるファイルのパス名である。 buf は statfs 構造体へのポインターで、およそ以下のように定義される:

#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_t は struct { int val[2]; } と定義されている。 FreeBSD でも同じであるが、インクルードファイル <sys/mount.h> を使う。

f_fsid はあるランダムな値を持ち、 (f_fsid,ino) という 1 組の値でファイルを一意に決定できるようにする、 というのが基本的な考え方である。 いくつかの OS では、デバイス番号 (の変種) を使ったり、 デバイス番号とファイルシステムタイプを組み合わせて使ったりしている。 OS の中には f_fsid フィールドの取得をスーパーユーザーに限定しているものもある (非特権ユーザーが取得すると 0 となる)。 NFS でエクスポートされる場合、 このフィールドがファイルシステムのファイルハンドルで使われており、 この値を提供するとセキュリティ上の問題がある。

いくつかの OS では、 fsid を sysfs(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/ に書かれている。