В Linux представлен ряд журналируемых файловых систем, например, Reiserfs, ext3, ext4, XFS, JFS и Btrfs. Журналируемая файловая система заносит обновления метаданных (а в некоторых файловых системах также и обновления данных) в журнал до фактического выполнения обновлений файла. Это означает, что в случае системного сбоя можно воспользоваться информацией из файла журнала, чтобы быстро вернуть систему в согласованное состояние. Ключевым преимуществом журналируемых файловых систем является то, что они устраняют длительную проверку целостности файловой системы, которая необходима в обычных файловых системах UNIX после системного сбоя.

Все файловые системы в Linux монтируются в единственном дереве каталогов, в корне которого располагается каталог /. Местоположение в дереве каталогов, где монтируется файловая система, называется точкой монтирования.

Привилегированный процесс может монтировать и размонтировать файловую систему с помощью системных вызовов mount() и umount(). Информацию о смонтированной файловой системе можно извлечь с помощью функции statvfs().

Дополнительная информация

Детальные сведения об устройствах и о драйверах устройств см. в работе [Bovet & Cesati, 2005] и в особенности в [Corbet et al., 2005]. Некоторую полезную информацию об устройствах можно почерпнуть в ресурсном файле ядра Documentation/devices.txt.

Дополнительная информация о файловых системах содержится в нескольких книгах. Работа [Tanenbaum, 2007] является общим введением в структуру и реализацию файловых систем. Работа [Bach, 1986] представляет собой введение в реализацию файловых систем UNIX, ориентированных главным образом на версию System V. В работах [Vahalia, 1996] и [Goodheart & Cox, 1994] также описана реализация файловых систем в версии System V. Работы [Love, 2010] и [Bovet & Cesati, 2005] излагают реализацию в Linux виртуальной файловой системы.

Документацию по различным файловым системам можно найти в ресурсном подкаталоге ядра Documentation/filesystems. Можно также поискать отдельные сайты, описывающие большинство реализаций файловых систем, доступных в Linux.

14.13. Упражнение

14.1. Напишите программу, которая измеряет время, необходимое для создания и последующего удаления большого количества однобайтных файлов из одного каталога. Эта программа должна создавать файлы с именами в виде xNNNNNN, где NNNNNN заменяется случайным шестизначным числом. Файлы должны создаваться в случайном порядке в соответствии с генерируемыми именами, а затем их следует удалить в порядке возрастания чисел в именах (то есть в порядке, который отличен от порядка, в котором они были созданы). Количество файлов (NF) и каталог, в котором они должны быть созданы, следует указывать в командной строке. Измерьте время, которое требуется для различных значений NF (например, в диапазоне от 1000 до 20 000) и для разных файловых систем (например, для ext2, ext3 и XFS). Какую зависимость вы обнаружите в каждой файловой системе при увеличении числа NF? Как можно сравнить различные файловые системы? Изменятся ли результаты, если создать файлы в порядке возрастания их номеров (x000001, x000001, x0000002 и т. д.), а затем удалить их в том же порядке? Если да, то в чем может быть причина или причины? Опять-таки будут ли результаты различными для разных файловых систем?

<p>15. Атрибуты файла</p>

В данной главе мы рассмотрим различные атрибуты файлов (их метаданные). Начнем с описания системного вызова stat(), возвращающего структуру, содержащую большинство атрибутов, в число которых входят метки времени, информация о владельце и о правах доступа к файлу. Затем перейдем к рассмотрению различных системных вызовов, применяемых для изменения этих атрибутов. (Разговор о правах доступа к файлу продолжится в главе 17, где рассмотрены списки контроля доступа.) Завершим данную главу описанием флагов индексных дескрипторов (известных также как расширенные атрибуты файла в файловой системе ext2), которые управляют различными аспектами обработки файлов ядром.

15.1. Извлечение информации о файле: stat()

Системные вызовы stat(), lstat() и fstat() извлекают информацию о файле, в основном из индексного дескриптора файла.

#include

int stat(const char *pathname, struct stat *statbuf);

int lstat(const char *pathname, struct stat *statbuf);

int fstat(int fd, struct stat *statbuf);

Все вызовы возвращают 0 при успешном завершении и –1 при ошибке

Три этих системных вызова различаются только способом указания файла:

• вызов stat() возвращает информацию об именованном файле;

• вызов lstat() подобен вызову stat(), но если именованный файл является символической ссылкой, то возвращается информация о самой ссылке, а не о файле, на которую она указывает;

• вызов fstat() возвращает информацию о файле, к которому обращается открытый файловый дескриптор.

Перейти на страницу:

Похожие книги