Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 4:

Организация файловой системы

Для получения интегральной информации о файловых системах, содержащих заданные файлы, следует воспользоваться служебной программой

df  [опция ...] [файл ...]

или функциями fstatvfs() или statvfs() (см. листинг 4.17).

#include <sys/statvfs.h>
int fstatvfs (int fildes, 
              struct statvfs *buf);
int statvfs (const char *restrict path, 
             struct statvfs *restrict buf);
Листинг 4.17. Описание функций fstatvfs() и statvfs().

Утилита df выдает на стандартный вывод информацию об имеющемся пространстве и, возможно, некоторые другие данные. Если файлы-аргументы не указаны, поступают сообщения обо всех компонентах объединенной файловой системы.

По умолчанию пространство измеряется в 512-байтных блоках; опция -k предписывает использовать блоки размером в килобайт. Подразумеваемый формат вывода не специфицирован, но должны становиться известными по крайней мере имя файловой системы и объем свободного пространства. Если задана опция -P, употребляется так называемый мобильный формат вывода с заголовком

Filesystem  512-blocks  Used Available 
                       Capacity Mounted on

и следующей построчной информацией о каждой файловой системе:

  • имя файловой системы ;
  • общее пространство ;
  • занятое пространство ;
  • свободное пространство ;
  • процент занятости ;
  • корень файловой системы ( точка монтирования в объединенной файловой системе ).

Возможный результат выполнения служебной программы df с опциями -kP приведен в листинге 4.18.

Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/sda3             75822432  43456504  28514348      61% /
/dev/sda1                46636     21129     23099      48% /boot
none                    257212         0    257212       0% /dev/shm
/dev/fd0                  1424       392      1032      28% /a
Листинг 4.18. Возможный результат выполнения командной строки df -kP.

Пара функций statvfs() и fstatvfs() по интерфейсу аналогична функциям stat() и fstat(), только в выходную структуру (типа fstatvfs ) помещается информация не о файлах, а о файловых системах, содержащих эти файлы. Согласно стандарту POSIX-2001, в структуре statvfs должны присутствовать по крайней мере следующие поля:

unsigned long f_bsize;    
/* Размер блока файловой системы */
unsigned long f_frsize;   
/* Базовый размер блока файловой системы */
fsblkcnt_t    f_blocks;   
/* Общее число блоков базового размера в 
файловой системе */
fsblkcnt_t    f_bfree;    
/* Общее число свободных блоков */
fsblkcnt_t    f_bavail;   
/* Число свободных блоков, доступных 
непривилегированным процессам */
fsfilcnt_t    f_files;    
/* Общее число описателей файлов */
fsfilcnt_t    f_ffree;    
/* Общее число свободных описателей файлов */
fsfilcnt_t    f_favail;   
/* Число описателей файлов, доступных 
непривилегированным процессам */
unsigned long f_fsid;     
/* Идентификатор файловой системы */
unsigned long f_flag;     
/* Битная шкала флагов */
unsigned long f_namemax;  
/* Максимальная длина имени файла */

Среди флагов, входящих в шкалу f_flag, выделим ST_RDONLY - признак того, что файловая система   смонтирована только на чтение.

В листинге 4.19 приведен исходный текст программы, которая выдает сведения о файловых системах, содержащих заданные в командной строке файлы-аргументы.

#include <sys/statvfs.h>
#include <stdio.h>

int main (int argc, char *argv[]) {
 struct statvfs buf;
 int i;

 for (i = 1; i < argc; i++) { 
   if (statvfs (argv [i], &buf)) {
     fprintf (stderr, "\nstatvfs: не удалось получить информацию о файловой системе, содержащей файл %s\n", argv [i]);
     return (-1);
   }

   printf ("\nstatvfs-информация о файловой системе, содержащей файл %s:\n", argv [i]);
   printf ("Размер блока файловой системы: %ld\n", buf.f_bsize);
   printf ("Базовый размер блока файловой системы: %ld\n", buf.f_frsize);
   printf ("Общее число блоков базового размера в файловой системе: %ld\n", buf.f_blocks);
   printf ("Общее число свободных блоков: %ld\n", buf.f_bfree);
   printf ("Число свободных блоков, доступных непривилегированным процессам: %ld\n", buf.f_bavail);
   printf ("Общее число описателей файлов: %ld\n", buf.f_files);
   printf ("Общее число свободных описателей файлов: %ld\n", buf.f_ffree);
   printf ("Число описателей файлов, доступных непривилегированным процессам: %ld\n", buf.f_favail);
   printf ("Идентификатор файловой системы: %ld\n", buf.f_fsid);
   printf ("Битная шкала флагов: %lx\n", buf.f_flag);
   printf ("Максимальная длина имени файла: %ld\n", buf.f_namemax);
 }

 return 0;
}
Листинг 4.19. Пример использования функции statvfs().

Если смонтировать   файловую систему FAT на каталог   /a с опцией "только на чтение ", то результат выполнения приведенной программы с аргументами / и /a может выглядеть так, как показано в листинге 4.20.

statvfs-информация о файловой системе, содержащей файл /:
Размер блока файловой системы: 4096
Базовый размер блока файловой системы: 4096
Общее число блоков базового размера в файловой системе: 18955608
Общее число свободных блоков: 7990010
Число свободных блоков, доступных непривилегированным процессам: 7027115
Общее число описателей файлов: 9633792
Общее число свободных описателей файлов: 8259049
Число описателей файлов, доступных непривилегированным процессам: 8259049
Идентификатор файловой системы: 0
Битная шкала флагов: 0
Максимальная длина имени файла: 255

statvfs-информация о файловой системе, содержащей файл /a:
Размер блока файловой системы: 512
Базовый размер блока файловой системы: 512
Общее число блоков базового размера в файловой системе: 2847
Общее число свободных блоков: 1960
Число свободных блоков, доступных непривилегированным процессам: 1960
Общее число описателей файлов: 0
Общее число свободных описателей файлов: 0
Число описателей файлов, доступных непривилегированным процессам: 0
Идентификатор файловой системы: 0
Битная шкала флагов: f
Максимальная длина имени файла: 260
Листинг 4.20. Возможный результат работы программы, использующей функцию statvfs().

Интерпретация полученных результатов предоставляется читателю.

Служебная программа

du  [опция ...] [файл ...]

выдает информацию о суммарном объеме пространства (измеряемого аналогично df ), занятого иерархиями файлов с указанными в командной строке корнями, предваряя ее аналогичными сведениями для каждого из подкаталогов, входящих в иерархии. При отсутствии аргументов выводятся сведения о текущем каталоге. Файлы, на которые есть несколько жестких ссылок, учитываются только один раз. Символьные ссылки трактуются по сути так же, как и в служебной программе ls, включая смысл опций -H и -L.

Выделим несколько других опций.

Ключ Описание
-a В дополнение к подразумеваемому выводу сообщать размеры файлов, входящих в обрабатываемые иерархии и не являющихся каталогами.
-s Вместо подразумеваемого вывода информировать только о суммарном объеме занятого пространства для каждой заданной в командной строке иерархии.

Пример. В ответ на команду

du -k /usr/local/man /bin/vi /bin/view

может быть выдано следующее (см. листинг 4.21):

1428    /usr/local/man/man1
12  /usr/local/man/man5
64  /usr/local/man/man7
36  /usr/local/man/man8
1544    /usr/local/man
384 /bin/vi
0   /bin/view
Листинг 4.21. Возможный результат использования утилиты du.

Таким образом, иерархия файлов с корнем в /usr/local/man занимает около 1.5 Мб (почти все приходится на долю файлов подкаталога man1 ), обычный файл   /bin/vi - 384 Кб (читателю предлагается сопоставить эту величину и приведенный выше размер данного файла в байтах), символьная ссылка лишнего места не занимает.

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?