Файловые системы операционной системы Unix

Операционная система UNIX – это многопользовательская операционная система с разделением времени, которая предоставляет возможность пользователям запускать программы, управляет периферийными устройствами и обеспечивает работу файловой системы. При загрузке сначала запускается ядро (процесс 0), которое в свою очередь запускает командный интерпретатор shell (процесс 1). Взаимодействие пользователя с системой UNIX происходит в интерактивном режиме посредством командного языка. Оболочка операционной системы shell интерпретирует вводимые команды, запускает соответствующие программы (процессы), формирует и выводит ответные сообщения.

Важной составной частью UNIX является файловая система. Она имеет иерархическую структуру, образующую дерево каталогов и файлов. Корневой каталог обозначается символом «/», путь по дереву каталогов состоит из имен каталогов, разделенных символом «/», например:/usrlinclude/sys. В каждый момент времени с пользователем связан текущий каталог – местоположение пользователя в иерархической файловой системе.

Каждый файл UNIX может быть однозначно определен структурой данных, называемой описателем файла – дескриптором, который содержит всю информацию о файле: тип файла, режим доступа, идентификатор владельца, размер, адрес файла, даты последнего доступа и последней модификации, дату создания и пр. Обращение к файлу происходит по имени. Путь к файлу от корневого каталога называется полным именем файла. Если обращение к файлу начинается с символа «/», то считается, что указано полное имя файла и его поиск начинается с корневого каталога, в любом другом случае поиск файла начинается с текущего каталога. У любого файла может быть несколько имен. Фактически имя файла является ссылкой на файл, специфицированный номером описателя.

Работа пользователя в системе начинается с активизации сервера терминального доступа getty (программа, организующая диалог работы с пользователем), который запускает программу login, запрашивающую у пользователя имя и пароль. Далее происходит проверка аутентичности пользователя (подлинности регистрации пользователя в системе) в соответствии с той информацией, которая хранится в файле /etc/passwd. В этом файле хранятся записи, содержащие:

- регистрационное имя пользователя;

- зашифрованный пароль;

- идентификатор пользователя;

- идентификатор группы;

- информация о минимальном сроке действия пароля;

- общая информация о пользователе;

- начальный каталог пользователя;

- регистрационный shell пользователя.

Если пользователь зарегистрирован в системе и ввел правильный пароль, login запускает программу, указанную в /etc/passwd – регистрационный shell пользователя. Пользователь системы – это объект, обладающий определенными правами, определяющими возможность запуска программ на выполнение, а также владение файлами. Единственный пользователь системы, обладающий неограниченными правами – это суперпользователь или администратор системы. Система идентифицирует пользователей по идентификатору пользователя (UID – User Identifier). Каждый пользователь является членом одной или нескольких групп – списка пользователей, имеющих сходные задачи. Каждая группа имеет свой уникальный идентификатор группы (GID – Group Identifier) Принадлежность группе определяет совокупность прав, которыми обладают члены данной группы.

Права пользователя UNIX – это права на работу с файлами. Файлы имеют двух владельцев: пользователя (user owner) и группу (group owner). Соответственно, атрибуты защиты файлов определяют права пользователя-владельца файла (u), права члена группы-владельца (g) и права всех остальных (о).

Любой файл UNIX в соответствии с его типом может быть отнесен к одной из следующих групп: обычные файлы, каталоги, специальные файлы и каналы. Обычный файл представляет собой последовательность байтов. Каталог – представляет собой файл особого типа, отличающийся от обычного файла наличием структуры и ограничением по записи. Осуществить запись в каталог может только ядро UNIX. Каталог устанавливает соответствие между файлами (номерами описателей) и их локальными именами. Специальный файл представляет собой файл, поставленный в соответствие внешнему устройству, ввод/вывод информации в этот файл соответствует вводу с внешнего устройства или выводу на него.

Канал – это программное средство, связывающее процессы операционной системы UNIX буфером ввода/вывода. Например, запуск процессов в виде $процесс_1|процесс_2 означает, что стандартный вывод процесса_1 замыкается на стандартный ввод процесса_2. При этом сначала создается канал, а потом на выполнение одновременно запускаются оба процесса, причем общее время их выполнения определяется более медленным процессом.

В Unix файловая система, хранящаяся на разделе диска, должна быть смонтирована, чтобы стать доступной процессам системы. Функция mount (монтировать) связывает файловую систему из указанного раздела на диске с существующей иерархией файловых систем и предоставляет пользователям возможность обращаться к данным в дисковом разделе как к файловой системе, а не как к последовательности дисковых блоков. Функция amount (демонтировать) выключает файловую систему из иерархии. Процедура монтирования состоит в следующем. Пользователь сообщает операционной системе имя устройства и место в файловой структуре (имя пустого каталога), куда нужно присоединить файловую систему (рис. 4.23., рис. 4.24.) с помощью библиотечного вызова mount, который имеет вид:

mount (special pathname, directory pathname, options) ; где:

- special pathname – имя специального файла устройства (в общем случае имя раздела), соответствующего дисковому разделу с монтируемой файловой системой;

- directory pathname – каталог в существующей иерархии, где будет монтироваться файловая система (точка, место монтирования);

- options – указывает, следует ли монтировать файловую систему «только для чтения» (при этом не будут выполняться такие функции, как write и creat, которые производят запись в файловую систему).


 

Затем операционная система должна убедиться, что устройство содержит файловую систему ожидаемого формата с суперблоком, списком индексов и корневым индексом. Некоторые операционные системы осуществляют монтирование автоматически при первой встрече с диском, причем на жестком диске – на этапе загрузки, на гибком диске – после его установки в дисковод. Если файловая система на устройстве имеется, она монтируется на корневом уровне, при этом к цепочке имен абсолютного имени файла (pathname) добавляется буква раздела.

Ядро UNIX поддерживает таблицу монтирования с записями о каждой смонтированной файловой системе. В каждой записи содержится информация о вновь смонтированном устройстве, о его суперблоке и корневом каталоге, а также сведения о точке монтирования. Для устранения потенциально опасных побочных эффектов число ссылок (link) к каталогу (точке монтирования) должно быть равно 1. Занесение информации в таблицу монтирования производится немедленно, поскольку может возникнуть конфликт между двумя процессами. Например, если монтирующий процесс приостановлен для открытия устройства или считывания суперблока файловой системы, другой процесс может попытаться смонтировать файловую систему.

Наличие в логической структуре файлового архива точек монтирования требует аккуратной реализации алгоритмов, осуществляющих навигацию по каталогам. Точку монтирования можно пересечь двумя способами: из файловой системы, где производится монтирование, в файловую систему, которая монтируется (в направлении от глобального корня к листу), и в обратном направлении.

При одновременной работе пользователей над одним проектом возникает проблема совместного использования файлов. Поэтому часто оказывается удобным, чтобы совместно используемый файл присутствовал в разных каталогах, принадлежащих разным пользователям, например, файл пользователь С присутствует в каталоге пользователя А (рис. 4.25). Соединение между каталогом пользователя А и совместно используемым файлом называется связью, а дерево файловой системы – ориентированный ациклический граф.


 

Иерархическая организация, положенная в основу древовидной структуры файловой системы современных операционных систем, не предусматривает выражения отношений, в которых потомки связываются более чем с одним предком. Такая негибкость частично устраняется возможностью реализации связывания файлов или организации линков (link – связь, ссылка) – соединений между директорией и разделяемым файлом. Ядро операционной системы позволяет пользователю связывать каталоги, упрощая написание программ, требующих пересечения дерева файловой системы. Часто имеет смысл хранить одну команду под разными именами, например, выполняемый файл текстового редактора операционной системы Unix может вызываться под именами ex, edit, vi, view и vedit.

Простейший способ реализовать связывание файла – дублировать информацию о нем в обеих директориях, но может возникнуть проблема совместимости в случае, если владельцы этих директорий попытаются независимо друг от друга изменить содержимое файла. Например, в операционной системе СР/М запись в директории о файле содержит адреса дисковых блоков. Поэтому копии тех же дисковых адресов должны быть сделаны и в другой директории, куда файл линкуется. Если один из группы пользователей что-то добавляет к файлу, то новые блоки будут перечислены только в его директории и не будут видны другим пользователям. Такая ситуация может быть разрешена двумя способами:

1.С помощью жесткой связи (hard link) – блоки данных файла перечисляются не в директории, а в небольшой структуре данных (например, в индексном узле), которая связана с файлом, то второй пользователь может связаться с этой, уже существующей структурой. Недостаток: возникает необходимость поддержки счетчика ссылок на файл для корректной реализации операции удаления файла. Например, в Unix счетчик ссылок является одним из атрибутов, хранящихся в индексном узле. Удаление файла одним из пользователей уменьшает количество ссылок на файл на 1. Реальное удаление файла происходит тогда, когда число ссылок на файл становится равным 0.

2.С помощью символической линковки (soft или symbolic link) – созданием нового файла, который содержит путь к связываемому файлу В соответствующем каталоге создается элемент, в котором имени связи сопоставляется некоторое имя файла (этот файл даже не обязан существовать к моменту создания символической связи). Для символической связи может создаваться отдельный индексный узел и даже заводиться отдельный блок данных для хранения потенциально длинного имени файла. Ссылку на индексный узел файла имеет только реальный владелец. Если собственник удаляет файл, то он разрушается и становится недоступным для других пользователей. Удаление символического линка на файл не влияет. Недостаток: снижение скорости доступа к файлу, так как файл символического линка хранит путь к файлу, содержащий список вложенных директорий, для прохождения по которому необходимо осуществить несколько обращений к диску. Достоинство: метод может использоваться для организации удобного доступа к файлам удаленных компьютеров, например, если добавить к пути сетевой адрес удаленной машины.

Ациклический граф представляет собой более гибкую структуру по сравнению с простым деревом, но работа с ним требует большой аккуратности. Поскольку теперь к файлу существует несколько путей, программа поиска файла может найти его на диске несколько раз. Простейшее практическое решение данной проблемы состоит в ограничении числа директорий при поиске. Полное устранение циклов при поиске достаточно трудоемкая процедура, выполняемая специальными утилитами и связанная с многократной трассировкой директорий файловой системы.