Вывод сведений о файловой системе, рассмотренный ранее — это хорошо и замечательно, но это не захватывает. Раз мы знаем, что определенная точка монтирования представляет файловую систему, нам нужны сведения о файловой системе. Это даст нам возможность выводить вещи наподобие сведений, полученных с помощью df
и 'df -i
'.
$ df /* Показать свободное/используемое пространство */
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 6198436 4940316 943248 84% /
/dev/hda5 61431520 27618536 30692360 48% /d
none 256616 0 256616 0% /dev/shm
/dev/hda1 8369532 2784700 5584832 34% /win
$ df -i /* Показать свободные/используемые индексы */
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/hda2 788704 233216 555488 30% /
/dev/hda5 7815168 503243 7311925 7% /d
none 64154 1 64153 1% /dev/shm
/dev/hda1 0 0 0 - /win
8.3.1. Стиль POSIX: statvfs()
и fstatvfs()
На ранних системах Unix была только одна разновидность файловой системы. Для них было достаточно, если df
считывала суперблок каждой смонтированной файловой системы, извлекала значимые сведения и красиво форматировала их для отображения. (Суперблок обычно был вторым блоком в файловой системе; первым был
Однако в современном мире такой подход был бы непригодным. POSIX предоставляет расширение XSI для получения доступа к этой информации. Главная функция называется statvfs()
(«vfs» часть происходит от лежащей в основе технологии SunOS, использованной позже в System V Release 4, которая называется
#include
#include
int statvfs(const char *path, struct statvfs *buf);
int fstatvfs(int fd, struct statvfs *buf);
statvfs()
использует для любого файла имя пути; она возвращает сведения о файловой системе, содержащей файл. fstatvfs()
принимает в качестве первою аргумента дескриптор открытого файла, здесь также возвращается информация о файловой системе, содержащей открытый файл, struct statvfs
содержит следующие члены:
struct statvfs {
unsigned long int f_bsize; /* Размер блока */
unsigned long int f_frsize;
/* Размер фрагмента («основной размер блока») */
fsblkcnt_t f_blocks; /* Общее число блоков */
fsblkcnt_t f_bfree; /* Общее число свободных блоков */
fsblkcnt_t f_bavail; /* Число доступных блоков (≤f_bfree) */
fsfilcnt_t f_files; /* Общее число индексов */
fsfilcnt_t f_ffree; /* Общее число свободных индексов */
fsfilcnt_t f_favail; /* Число доступных индексов (≤f_files) */
unsigned long int f_fsid; /* ID файловой системы */
unsigned long int f_flag; /* Флаги: ST_RDONLY и/или ST_NOSUID */
unsigned long int f_namemax; /* Максимальная длина имени файла */
};
Сведений, которые в ней содержатся, достаточно для написания df
:
unsigned long int f_bsize
Размер блока является предпочтительным размером для осуществления ввода/вывода. Файловая система пытается хранить по крайней мере f_bsize
байтов стоящих данных в смежных секторах на диске. (
unsigned long int f_frsize
Некоторые файловые системы (такие, как BSD Fast Filesystem) проводят различие между блоками и