| STATFS(2) | Руководство программиста Linux | 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, определённую, примерно, следующим образом:
struct statfs {
    __fsword_t f_type;    /* тип файловой системы (смотрите далее) */
    __fsword_t 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 файловой системы */
    __fsword_t f_namelen; /* максимальная длина имён файлов */
    __fsword_t f_frsize;  /* размер фрагмента (начиная с Linux 2.6) */
    __fsword_t f_flags;   /* флаги монтирования файловой системы
                             (начиная с Linux 2.6.36) */
    __fsword_t f_spare[xxx];
                    /* дополняющие байты, зарезервированные для будущего
                       использования */
};
В f_type могут быть указаны следующие типы файловых систем:
ADFS_SUPER_MAGIC      0xadf5
AFFS_SUPER_MAGIC      0xadff
AFS_SUPER_MAGIC       0x5346414f
ANON_INODE_FS_MAGIC   0x09041934 /* ФС анонимных инод (для
                                    псевдофайлов без имени;
                                    например, 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 */
CGROUP2_SUPER_MAGIC   0x63677270 /* псевдофайловая система cgroup v2 */
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 и старее */
DEVPTS_SUPER_MAGIC    0x1cd1
ECRYPTFS_SUPER_MAGIC  0xf15f
EFIVARFS_MAGIC        0xde5e81e4
EFS_SUPER_MAGIC       0x00414a53
EXT_SUPER_MAGIC       0x137d     /* Linux 2.0 и старее */
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  /* не используется */
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 /* ФС очереди сообщений POSIX */
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 */
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
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 и старее */
Большинство этих констант MAGIC определены в /usr/include/linux/magic.h, а некоторые находятся прямо в исходном коде ядра.
Поле flags представляет собой битовую маску параметров монтирования файловой системы. В нём содержится ноль или несколько следующих бит:
Значение f_fsid до конца не определено (но смотрите далее).
Если поле не определёно для какой-то файловой системы, то его значение устанавливается в 0.
fstatfs() возвращает такую же информацию об открытом файле через его ссылку на дескриптор fd.
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
Есть только в Linux. Вызов statfs() основан на подобном из 4.4BSD (но они используют разные структуры).
Тип __fsword_t, используемый для различных полей в определении структуры statfs, является встроенным типом glibc и не предназначен для использования вовне. Это подкидывает загадку программисту, который хочет скопировать или сравнить эти поля с локальными переменными в программе. В большинстве систем для переменных в этих случаях допустимо использовать тип unsigned int.
Первые версии системных вызовов Linux statfs() и fstatfs() разрабатывались без учёта огромных размеров файлов. В последствии, в Linux 2.6 были добавлены системные вызовы statfs64() и fstatfs64(), в которых используется новая структура, statfs64. Новая структура содержит те же поля что и первоначальная структура statfs, но размеры некоторых полей были увеличены для учёта огромных размеров файлов. Обёрточные функции в glibc statfs() и fstatfs() прозрачно скрывают это различие ядер.
В одних системах есть только файл <sys/vfs.h>, в других также есть файл <sys/statfs.h>, при чём первый включает последний. Поэтому, вероятно, лучше включать первый.
В LSB библиотечные вызовы statfs() и fstatfs() помечены как устаревшие, вместе них предлагается использовать statvfs(2) и fstatvfs(2).
В 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) уникально определяющая файл. В некоторых операционных системах для этого используется номер устройства (один из вариантов) или номер устройства вместе с типом файловой системы. В других ОС поле f_fsid доступно только суперпользователю (и равно нулю для остальных пользователей), так как это поле используется в файловом указателе (filehandle) файловой системы при экспорте NFS, и выдача его значения влияет на безопасность.
В некоторых ОС fsid может использоваться в качестве второго аргумента системного вызова sysfs(2).
В Linux 2.6.38 и до Linux 3.1 включительно, вызов fstatfs() завершался с ошибкой ENOSYS для файловых дескрипторов, созданных с помощью pipe(2).
| 2017-09-15 | Linux |