В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Организация файловой системы
Основные понятия.
В трактовке стандарта POSIX понятие файла охватывает все, что может содержать, потреблять и/или поставлять информацию. В объектно-ориентированной терминологии файл должен предоставлять методы для чтения и/или записи и иметь такие атрибуты, как тип, имя и режим.
В стандарте зафиксированы следующие типы файлов:
- обычный файл ;
- каталог ;
- канал ;
- символьный специальный файл ;
- блочный специальный файл ;
- символьная ссылка ;
- сокет.
Обычный файл представляет собой последовательность байт с возможностью случайного доступа и без какой-либо дополнительной структуры, наложенной операционной системой.
Каталог состоит из элементов (ссылок), ассоциирующих имена с файлами . Одинаковые имена не могут фигурировать в разных элементах одного каталога, но разные элементы могут ссылаться на один и тот же файл.
Канал можно представлять себе в виде транспортера, с одной стороны которого находится поставщик (процесс, пишущий в канал ), а с другой - потребитель (процесс, читающий из канала ). Данные читаются в том же порядке, в каком производилась запись, т. е. с точки зрения структур данных канал - это очередь.
Специальные файлы соответствуют аппаратным компонентам компьютера. Обычно при использовании символьных специальных файлов остаются видимыми аппаратные характеристики соответствующих устройств, а при доступе к устройствам посредством блочных специальных файлов аппаратные характеристики, как правило, остаются скрытыми. Типичный пример устройства, которому соответствует символьный специальный файл, - терминал.
Символьная ссылка - это файл, хранящий цепочку символов. Когда подобный файл является компонентом маршрутного имени (см. далее), хранимая цепочка символов влияет на результирующий маршрут. Обычно ссылка раскрывается (прозрачным для приложений образом), т. е. вместо ее имени подставляется содержимое (цепочка символов).
Сокет - это оконечная точка межпроцессных коммуникаций.
Файлы вместе со служебной информацией, хранящейся в объектах, которые называются описателями файлов, объединяются в иерархическую структуру (направленный граф), именуемую файловой системой. Все неконцевые вершины графа (т. е. вершины, откуда выходит хотя бы одна дуга) являются каталогами ; все концевые имеют другие типы.
Согласно стандарту POSIX-2001, для каждого процесса определен корневой каталог с именем / - вершина графа, из которой осуществляется доступ к прочим файлам данной файловой системы . "Абсолютного", единого для всех корня может и не существовать.
В пределах файловой системы каждый файл имеет уникальный идентификатор ( порядковый номер - он же номер описателя файла ).
Имена, ассоциируемые с файлами (точнее, с их порядковыми номерами ) посредством каталогов, называются простыми . С формальной точки зрения они могут включать любые символы, кроме слэша ( / ), однако для повышения мобильности приложений стандарт рекомендует ограничиться латинскими буквами, цифрами, а также символами ., _, - (точка, подчеркивание, минус), причем минус не должен быть первым символом. В соответствующей стандарту операционной системе сохраняется различие между большими и малыми буквами.
(При использовании в именах файлов некоторых других символов довольно часто возникают проблемы. Укажем лишь на часть из них.
Символы национальных алфавитов создают трудности с отображением имен. Символы, имеющие специальный смысл для командного интерпретатора, могут вызвать неожиданные и нежелательные модификации имен. Символ : (двоеточие) в имени каталога способен нарушить нормальную интерпретацию значения переменной окружения PATH. Минус в качестве первого символа придает имени файла вид комбинации опций, нарушая процесс разбора аргументов утилит. И т.д, и т.п.)
В каждом каталоге должны присутствовать имена . (точка) и .. (по стандарту читается как точка-точка), которые трактуются как ссылки на текущий и вышележащий каталоги. Для корневого каталога имя .. может также ссылаться на корень.
Под маршрутным именем понимается цепочка символов, идентифицирующая файл и состоящая из нескольких (в том числе из нуля) простых имен файлов, разделенных символами / и называемых компонентами маршрута. Маршрутные имена, начинающиеся символом /, называются абсолютными, они задают маршрут от корня файловой системы . (Отметим, что стандарт POSIX-2001 определяет трактовку маршрутных имен, начинающихся с двух символов /, как зависящую от реализации. В частности, таким способом в некоторых ОС задаются имена файлов на других хостах сети.)
Прочие имена называются относительными, маршрут в них задан относительно текущего каталога.
Маршрутным префиксом называется маршрутное имя, ссылающееся на каталог . Если маршрутное имя оканчивается символом /, оно обязано быть маршрутным префиксом.
Маршрутные имена называют также составными именами файлов . Примеры составных имен:
/.autofsck /usr/lib/tcl ../susv3 ./l4.txt
Первые два имени являются абсолютными. файл .autofsck лежит в корневом каталоге, файл tcl - в подкаталоге lib подкаталога usr корневого каталога. Третье и четвертое - относительные имена, специфицирующие, соответственно, файл susv3, расположенный в иерархии на один уровень выше файлов текущего каталога, и файл l4.txt из текущего каталога. Последнее маршрутное имя можно было задать и проще:
l4.txt
Стандарт POSIX определяет процесс разрешения маршрутных имен, компонентами которых являются символьные ссылки. Если такая ссылка - последний компонент, а затребованная функция относится к самой ссылке, имя остается без изменений. В противном случае ссылка раскрывается: вместо соответствующего компонента подставляется хранимая цепочка символов, и процесс разрешения маршрутного имени продолжается. Если он зацикливается или нарушает какие-либо ограничения (например, на длину маршрутного имени или количество раскрытых ссылок ), операционная система должна зафиксировать ошибку.
Согласно стандарту, с каждым файлом ассоциирована по крайней мере следующая служебная информация:
- режим - объект, содержащий биты режима и тип файла ;
- числовой идентификатор владельца-пользователя ;
- числовой идентификатор владеющей группы.
Типы файлов мы рассматривали выше. Биты режима подразделяются на биты режима доступа, бит переустановки идентификатора пользователя (этот и следующий биты будут описаны при рассмотрении процессов), бит переустановки идентификатора группы, а также бит ограничения на удаление элементов каталогов (последняя возможность относится к числу необязательных).
Биты режима доступа, вместе с другими атрибутами, определяют, имеет ли процесс, действующий от имени некоторого пользователя, право на соответствующие операции с файлом.
По отношению к конкретному файлу все пользователи делятся на три категории:
Для каждой из них режим доступа определяет права на операции с файлом, а именно:
Указанных видов прав достаточно, чтобы определить допустимость любой операции с файлами. Например, для удаления файла необходимо иметь право на запись в соответствующий каталог (если не используется бит ограничения на удаление элементов каталогов ).
Стандарт POSIX предусматривает реализацию дополнительных и/или альтернативных механизмов контроля доступа в операционной системе. Дополнительные механизмы ужесточают стандартный контроль, альтернативные заменяют его.
Выполнение большинства операций с файлами требует их открытия. Открытому файлу соответствует файловый дескриптор - неотрицательное целое число, уникальное в пределах процесса и используемое для целей доступа к файлу. Дескриптор является ссылкой на описание открытого файла, хранящее смещение в файле, его статус, режимы доступа . Разные дескрипторы могут ссылаться на одно описание.
Вероятно, все версии ОС Unix поддерживают понятие монтирования - отождествление корня дополнительной файловой системы с некоторым каталогом в существующей иерархии (этот каталог называется точкой монтирования ) и формирования таким образом объединенной файловой системы . В стандарте POSIX-2001 понятие монтирования, равно как и необходимые для его поддержки служебные программы и функции, отсутствуют. Причина - зависимость от реализации.