Linux
2017-09-15
Aliases: fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs(2), fstatfs64(2), statfs64(2), statfs64(2), statfs64(2), statfs64(2), statfs64(2), statfs64(2), statfs64(2), statfs64(2)
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages-dev
Manual pages about using GNU/Linux for development
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
statfs, fstatfs - возвращает статистику по файловой системе
ОБЗОР
#include <sys/vfs.h> /* или <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
ОПИСАНИЕ
Системный вызов statfs() возвращает информацию о смонтированной файловой системе. Значение path является путём любого файла, расположенного в смонтированной файловой системе. Значение buf является указателем на структуру statfs, определённую, примерно, следующим образом:
Значение f_fsid до конца не определено (но смотрите далее).
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];
/* дополняющие байты, зарезервированные для будущего
использования */ };
__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 и старее */
псевдофайлов без имени;
например, 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 представляет собой битовую маску параметров монтирования файловой системы. В нём содержится ноль или несколько следующих бит:
ST_MANDLOCK | |
Разрешена обязательная (mandatory) блокировка файловой системы (смотрите fcntl(2)). | |
ST_NOATIME | |
Не обновлять времена доступа; смотрите mount(2). | |
ST_NODEV | |
Запретить доступ к специальным файлам устройств в этой файловой системе. | |
ST_NODIRATIME | |
Не обновлять времена доступа к каталогам; смотрите mount(2). | |
ST_NOEXEC | |
Исполнение программ в этой файловой системе запрещено. | |
ST_NOSUID | |
Биты set-user-ID и set-group-ID игнорируются в exec(3) для исполняемых файлов в этой файловой системе. | |
ST_RDONLY | |
Файловая система смонтирована в режиме только для чтения. | |
ST_RELATIME | |
Обновлять atime относительно mtime/ctime; смотрите mount(2). | |
ST_SYNCHRONOUS | |
Выполнять синхронную запись в файловую систему немедленно (смотрите описание O_SYNC в open(2)). |
Если поле не определёно для какой-то файловой системы, то его значение устанавливается в 0.
fstatfs() возвращает такую же информацию об открытом файле через его ссылку на дескриптор fd.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ
EACCES | (statfs()) В одном из каталогов префикса пути path не разрешён поиск (см. также path_resolution(7)). |
EBADF | (fstatfs()) fd не является корректным открытым дескриптором файла. |
EFAULT | Аргумент buf или path указывает на неправильный адрес. |
EINTR | Вызов был прерван каким-либо сигналом. Смотрите signal(7). |
EIO | При чтении файловой системы произошла ошибка ввода-вывода. |
ELOOP | (statfs()) Было обнаружено слишком много символьных ссылок при трансляции path. |
ENAMETOOLONG | |
(statfs()) Слишком длинное значение аргумента path. | |
ENOENT | (statfs()) Файл, на который ссылается path, не существует. |
ENOMEM | Недостаточное количество памяти ядра. |
ENOSYS | Файловая система не поддерживает данный вызов. |
ENOTDIR | |
(statfs()) Компонент в префиксе пути path не является каталогом. | |
EOVERFLOW | |
Некоторые значения слишком велики, чтобы быть представленными в возвращаемой структуре. |
СООТВЕТСТВИЕ СТАНДАРТАМ
Есть только в 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).
Поле 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) уникально определяющая файл. В некоторых операционных системах для этого используется номер устройства (один из вариантов) или номер устройства вместе с типом файловой системы. В других ОС поле f_fsid доступно только суперпользователю (и равно нулю для остальных пользователей), так как это поле используется в файловом указателе (filehandle) файловой системы при экспорте NFS, и выдача его значения влияет на безопасность.
В некоторых ОС fsid может использоваться в качестве второго аргумента системного вызова sysfs(2).
ДЕФЕКТЫ
В Linux 2.6.38 и до Linux 3.1 включительно, вызов fstatfs() завершался с ошибкой ENOSYS для файловых дескрипторов, созданных с помощью pipe(2).