Физические файловые системы UNIX
Физическая файловая система формирует структуру хранения данных на физическом носителе, в первую очередь – на жестком диске. Следует еще раз напомнить, что важной отличительной особенностью построения файловых систем UNIX, является то, что каждый файл (в том числе каталог и устройство ввода-вывода) имеет персональный индексный дескриптор и может имеет несколько имен – ссылок на этот индексный дескриптор.
Рассмотри общую структуру файловых систем UNIX на примере ufs. В расположении файловой системы на диске следует выделить 4 области:
1. Загрузочный блок.
2. Суперблок, который содержит самую общую информацию о файловой системе:
· размер файловой системы;
· размер области индексных дескрипторов;
· число индексных дескрипторов;
· список свободных индексных дескрипторов (битовая карта индексных дескрипторов);
· список свободных блоков (кластеров) (битовая карта блоков);
· также другую административную информацию.
3. Область индексных дескрипторов, в которой порядок расположения индексных дескрипторов соответствует их номерам.
4. Область данных, в которой расположены как обычные файлы, так и файлы-каталоги, в том числе и корневой каталог; специальные файлы (ассоциированные с устройствами ввода-вывода) представлены в файловой системе только записями в соответствующих каталогах и индексными дескрипторами специального формата, но места в области данных не занимают.
Каждый индексный дескриптор имеет номер, который одновременно является уникальным именем файла в файловой системе и выделяется файлу из числа свободных номеров при создании файла на диске. Запись о файле в каталоге состоит всего из двух полей: символьного имени файла и номера индексного дескриптора.
Следовательно, один номер индексного дескриптора (т. е. один реальный файл) может соответствовать различным символьным именам этого файла. Файл удаляется из системы и его дескриптор освобождается лишь после удаления его последнего символьного имени.
Индексный дескриптор файла содержит следующие данные о файле:
· Идентификатор владельца файла;
· Тип файла (обычный, каталог, специальный, символьная связь);
· Временные характеристики: время последней модификации файла и т.п.;
· Число ссылок на данный индексный дескриптор, равный количеству псевдонимов (символьных имен) файла;
· Адресная информация – расположение частей файла по блокам (кластерам) в области данных диска;
· Размер файла в байтах.
Данные файла размещаются на диске блоками (так принято называть кластеры в UNIX). Обычно размер блока 1-8 Кбайт. Для номера блока выделяется 32 бита. Увеличение размера блока повышает быстродействие файловой системы, уменьшает фрагментированность диска, но менее экономно расходует дисковое пространство.
Для хранения адресной информации в индексном дескрипторе стандартно выделяется 15 полей (по 32 бита).
Если размер файла меньше или равен 12 блокам (при максимальном размере блока 8 Кбайт размер файла до 98 Кбайт), то номера этих блоков непосредственно перечисляются в первых 12 полях.
Если размер файла превышает 12 блоков (размер файла от 98 Кбайт до 12 Мбайт), то 13-е поле содержит адрес блока, в котором могут быть расположены номера следующих блоков файла.
Если размер файла больше 2060 блоков, то используется 14-е поле, в котором находится номер блока, содержащего до 2048 номеров блоков (при размере блока 8 Кбайт), каждый из которых хранит 2048 номеров блоков данных файла (объемом файла может быть до 3 × 1010 байт).
Аналогично, но уже с тройной иерархией используется 15-е поле, что позволяет адресовать блоки (кластеры) в файлах размером до 7 × 1013 байт
Файл в каталоге – это элемент в каталоге, относящийся к одному файлу, и называется связью. Файлы существуют независимо от каталогов. А связи в каталогах указывают на дескрипторы реальных файлов. Можно сказать, что каталог – это список индексных дескрипторов файлов.
В журнализируемой файловой системе после того, как транзакция (изменение) записана, она может быть выполнена повторно, что предотвращает возникновение ошибок и несогласованностей в файловой системе и необходимость запуска программы проверки файловой системы fsck. Тем самым, уменьшается время перезагрузки в случае сбоя или некорректной остановки системы.
Журнал выделяется из свободных блоков файловой системы и, обычно, имеет размер порядка 1 Мбайта на каждый 1 Гбайт файловой системы. Журнал сбрасывается по мере заполнения, после синхронизации структуры файловой системы с диском.
Различные версии ОС UNIX поддерживают разные реализации журнализируемых файловых систем. Это, например, файловая система ufs (Solaris), vxfs (Solaris, UnixWare), RaisorFS и ext3 (Linux), jfs (AIX и Linux) и другие. Некоторые файловые системы позволяют включать и отключать журнализацию (ufs, ext2/ext3). Естественно, журнализация несколько замедляет работу файловой системы, но, в большинстве случаев, гарантирует целостность данных.
Создается файловая система на указанное устройство (необходимо указать специальное символьное устройство) командой mkfs. Файловая система создается на основе указанных в командной строке типа файловой системы (ТипФС), специфических_опций и операндов, которые зависят от конкретного типа создаваемой файловой системы. Их можно посмотреть на соответствующей странице справочного руководства (например, man mkfs).
Для проверки файловой системы и исправления ошибок служит программа fsck, которая ищет и, автоматически или в интерактивном режиме, исправляет противоречия в файловых системах. Если файловая система находится в несогласованном состоянии, которое нельзя однозначно исправить, у пользователя спрашивают подтверждения перед попыткой выполнить каждое исправление. Следует иметь в виду, что некоторые исправления приводят к определенным потерям данных. Объем и серьезность потери данных можно определить по диагностическому сообщению. Стандартным действием при каждом исправлении является ожидание от пользователя утвердительного (yes) или отрицательного (no) ответа.
При использовании fsck файловая система должна быть неактивной (размонтирована или смонтирована только для чтения). Если это невозможно, необходимо обеспечить, чтобы машина находилась в состоянии покоя (без работающих пользователей) и чтобы сразу после завершения команды она была перезагружена, если исправляется критическая файловая система, например, корневая.
Для работы команде fsck необходимо указывать специальное символьное устройство.
Корневая файловая система обычно проверяется при запуске автоматически. Система при запуске может автоматически проверять и другие физические файловые системы, для которых в таблице стандартных файловых систем указана необходимость такой проверки. Эта проверка может вестись параллельно, путем запуска отдельного процесса fsck для каждой проверяемой файловой системы с одним и тем же порядковым номером проверки. Параллельно имеет смысл проверять файловые системы, расположенные на разных физических дисках.