Структура файловой системы
Здесь мы рассмотрим одну из первых реализации файловой системы, поскольку основные её идеи сохраняются до сих пор.
Информация на дисках размещается поблочно, по 512 байт в каждом блоке. Обратите внимание, что блок специально взят равным размеру сектора. Диск разбивается на следующие области (рис. 8.1):
¨ неиспользуемый блок;
¨ управляющий блок или суперблок, в котором содержится размер диска и границы других областей;
¨ i-список, состоящий из описаний файлов, называемых i-узлами;
¨ область для хранения содержимого файлов.
Рис. 8.1. Организация файлов в UNIX на диске
Каждый i-узел содержит:
¨ идентификацию владельца;
¨ идентификацию группы владельца;
¨ биты защиты;
¨ физические адреса на диске или ленте, где находится содержимое файла;
¨ размер файла;
¨ время создания файла;
¨ время последнего использования файла (modification time);
¨ время последнего изменения атрибутов (change time);
¨ число связей-ссылок, указывающих на файл;
¨ индикацию, является ли файл директорией, обычным файлом или специальным файлом. Следом за i-списком идут блоки, предназначенные для хранения содержимого файлов. Пространство на диске, оставшееся свободным от файлов, образует связанный список свободных блоков.
Таким образом, файловая система UNIX представляет собой структуру данных, размещённую на диске и содержащую управляющий суперблок, в котором определена файловая система в целом; массив i-узлов, где определены все файлы в файловой системе; сами файлы; и, наконец, совокупность свободных блоков. Выделение пространства под данные осуществляется блоками фиксированного размера.
Каждый файл однозначно идентифицируется старшим номером устройства, младшим номером устройства и i-номером (индексом i-узла данного файла в массиве i-узлов). Когда вызывается драйвер устройства, по старшему номеру индексируется массив входных точек в драйверы. По младшему номеру драйвер выбирает одно устройство из группы идентичных физических устройств.
Файл-директория, в котором перечислены имена файлов, позволяет установить соответствие между именами и самими файлами. Директории образуют древовидную структуру. На каждый обычный файл или файл устройства могут иметься ссылки в различных узлах этой структуры. В непривилегированных программах запись в директории не разрешена, но при наличии соответствующих разрешений они могут читать их. Дополнительных связей между директориями нет.
Большое число системных директорий система UNIX использует для своих собственных нужд. Одна из них, корневая директория, является базой для всей структуры директорий, и, «отталкиваясь» от неё, можно найти размещение всех файлов. В других системных директориях содержатся программы и команды, предоставляемые пользователям, и файлы устройств.
Имена файлов задаются последовательностью имён директорий, разделенных косой чертой («/») и приводящих к концевому узлу (листу) некоторого дерева. Если имя файла начинается с косой черты, то поиск по дереву начинается в корневой директории. Если же имя файла не имеет в начале косой черты, то поиск начинается с текущей директории. Имена файлов, начинающиеся с «../», подразумевают начало поиска в директории, родительской по отношению к текущей. Имя файла stuff (персонал) указывает на элемент stuff в текущей директории. Имя файла /work/alex/stuff приводит к поиску директории work в корневой директории. Затем к поиску директории аlех в директории work и, наконец, к поиску элемента stuff в директории аlех. Сама по себе косая черта / обозначает корневую директорию. В приведенном примере нашла отражение типичная иерархическая структура файловой системы, например, work может обозначать диск (устанавливаемый при работе пользователя), аlех может быть директорией пользователя, a stuff может принадлежать аlех.
Файл, не являющийся директорией, может встречаться в различных директориях, возможно, под разными именами. Это называется связыванием. Элемент в директории, относящийся к одному файлу, называется связью. В системе UNIX все такие связи имеют равный статус. Файлы не принадлежат директориям. Скорее, файлы существуют независимо от элементов директорий, а связи в директориях указывают действительно на физические файлы. Файл «исчезает», когда удаляется последняя связь, указывающая на него. Биты защиты, заданные в связях, могут отличаться от битов в исходном файле. Таким образом, решается проблема избирательного ограничения доступа к файлам.
С каждым поддерживаемым системой устройством ассоциируется один или большее число специальных файлов. Операции ввода/вывода для специальных файлов осуществляются так же, как и для обычных дисковых файлов, с той лишь разницей, что эти операции активизируют соответствующие устройства. Специальные файлы обычно находятся в справочнике /dev. На специальные файлы могут указывать связи точно так же, как на обычные файлы.
От файловой системы не требуется, чтобы она вся целиком размещалась на том устройстве, где находится корень. Запрос от системы mount (на установку носителей и т. п.) позволяет встраивать в иерархию файлов файлы на сменных томах. Команда mount имеет несколько опций, но обязательных аргументов у стандартного варианта её использования два: имя файла блочного устройства и имя каталога. В результате выполнения этой команды файловая система, расположенная на указанном устройстве, подключается к системе таким образом, что ее содержимое заменяет собой содержимое заданного в команде каталога. Поэтому для монтирования соответствующего тома обычно используют пустой каталог. Команда umount выполняет обратную операцию – «отсоединяет» (размонтирует) файловую систему, после чего диск с данными можно физически извлечь из системы. Например, для записи данных на дискету необходимо её смонтировать, а после работы – размонтировать.
Защита файлов
Защита файлов осуществляется при помощи номера, идентифицирующего пользователя, и установки десяти битов защиты – атрибутов доступа. Права доступа подразделяются на три типа: чтение (read), запись (write) и выполнение (execute). Эти типы прав доступа могут быть предоставлены трём классам пользователей:
владельцу файла, группе, в которую входит владелец, и всем (прочим) пользователям. Девять из этих битов управляют защитой по чтению, записи и исполнению для владельца файла, других членов группы, в которую входит владелец, и всех других пользователей. Файл всегда связан с определенным пользователем – своим владельцем – и с определенной группой, то есть у него есть уже известные нам UID (user ID, идентификатор пользователя) и GID (group ID, идентификатор группы). Изменять права доступа к файлу разрешено только его владельцу. Изменить владельца файла может суперпользователь, группу – суперпользователь или владелец файла.
Программа, выполняющаяся в системе, всегда запускается от имени какого-то пользователя и какой-то группы (обычно – основной группы этого пользователя), но связь процессов с пользователями и группами организована сложнее:
здесь различаются идентификатор для доступа к файловой системе (FSUID – file system access user ID, FSGID – file system access group ID) и эффективный идентификатор (EUID – effective user ID, EGID – effective group ID), а при доступе к файлам учитываются ещё и полномочия (capabilities), присвоенные самому процессу. При создании файл получает UID, совпадающий с FSUID процесса, который его создаёт, и, как правило, GID, совпадающий с FSGID этого процесса. Атрибуты доступа определяют, что разрешено делать с данным файлом данной категории пользователей. Имеются всего три операции: чтение, запись и выполнение.
При создании файла (или ещё одного имени для уже существующего файла) модифицируется не сам файл, а каталог, в котором появляются новые ссылки на узлы. Удаление файла заключается в удалении ссылки. Таким образом, право на создание или удаление файла – это право на запись в каталог.
Право на выполнение каталога интерпретируется как право на поиск в нём (прохождение через него). Оно позволяет обратиться к файлу по пути, содержащему данный каталог, даже тогда, когда каталог не разрешено читать и список всех его файлов поэтому недоступен.
Помимо трёх названных основных атрибутов доступа существуют дополнительные, используемые в следующих случаях. Атрибуты SUID и SGID существенны при запуске программы на выполнение: они требуют, чтобы программа выполнялась не от имени запустившего ее пользователя (группы), а от имени владельца (группы) того файла, в котором она находится. Выражаясь формально, если файл программы имеет атрибут SUID (SGID), то FSUID и EUID (FSGID и EGID) соответствующего процесса не наследуются от процесса, запустившего его, а совпадают с UID (GID) файла. Благодаря этому пользователи получают возможность запустить системную программу, которая создает свои рабочие файлы в закрытых для них каталогах.
Кроме того, если процесс создает файл в каталоге, имеющем атрибут SGID, то файл получает GID не по FSGID процесса, а по GID каталога. Это удобно для коллективной работы: все файлы и подкаталоги в каталоге автоматически оказываются принадлежащими одной и той же группе, хотя создавать их могут разные пользователи. Есть еще один атрибут – CVTX, который теперь относится к каталогам. Он показывает, что из каталога, имеющего этот атрибут, ссылку на файл может удалить только владелец файла.
Существуют две стандартные формы записи прав доступа – символьная и восьмеричная. Символьная представляет собой цепочку из десяти знаков, первый из которых не относится собственно к правам, а обозначает тип файла. Используются следующие обозначения:
¨ «-» – обычный файл;
¨ «d» – каталог (директория);
¨ «с» – символьное устройство;
¨ «b» – блочное устройство;
¨ «р» – именованный канал (named pipe);
¨ «s» – «гнездо» (socket1);
¨ «I» – символическая ссылка.
Далее следуют три последовательности, каждая из трёх символов, соответствующие правам пользователя, группы и всех остальных. Наличие права на чтение обозначается буквой «r», на запись – «w», на выполнение – «х», отсутствие какого–либо права – знаком «-» в соответствующей позиции.
Наличие атрибута SUID (SGID) обозначается заглавной буквой «S» в позиции права на выполнение для владельца (группы), если выполнение не разрешено, и прописной буквой «s», если разрешено.
Восьмеричная запись – это шестизначное число, первые два знака которого обозначают тип файла и довольно часто опускаются, третья цифра – атрибуты GUID (4), SGID (2) и SVTX (1), а оставшиеся три – соответственно права владельца, группы и всех остальных. Очевидно, что право на чтение можно представить числом «4», право на запись – числом «2», а право на выполнение кодируется как «1».
Например, стандартный набор прав доступа для каталога /tmp в символьной форме выглядит как drwxrwxrwt, а в восьмеричной – как 041777 (это каталог; чтение, запись и поиск разрешены всем; установлен атрибут SVTX). А набор прав -r-S-xw-, или в числовом виде – 102412, будет означать, что это обычный файл, владельцу разрешается читать его, но не выполнять и не изменять; пользователям из группы файла (за исключением владельца) – выполнять (причём во время работы программа получит права владельца файла), но не читать и не изменять; а всем остальным – изменять, но не читать и не выполнять.
Большинство программ создают файлы с разрешением на чтение и запись для всех пользователей, а каталоги – с разрешением на чтение, запись и поиск для всех пользователей. Этот исходный набор атрибутов логически складывается с «пользовательской маской» – user file-creation mask, сокращенно umask, которая обычно ограничивает доступ. Например, следующие значения для umask u=rwx, g=rwx, o=r-x следует понимать так: у владельца и группы остается полный набор прав, а всем остальным запрещается запись. В восьмеричном виде оно запишется как 002 (первая цифра – ограничения для владельца, вторая – для группы, третья – для остальных, запрещение чтения – 4, записи – 2, выполнения – 1). Владелец файла может изменить права доступа к нему командой chmod.
Дата добавления: 2022-02-05; просмотров: 252;