Организация UNIX-систем и ОС Solaris

       

Таблица индексных дескрипторов: детали


В ранних версиях UNIX таблица индексных дескрипторов занимала фиксированное пространство в начале устройства; в файловых системах UFS современных систем эта таблица распределена по диску, потому что каждая часть таблицы отвечает за часть диска.

В файловых системах, которые основаны на FFS (ext2, ext3, UFS), диск разбит на группы цилиндров. Каждая группа цилиндров имеет свою копию суперблока, битовую карту свободных блоков этой группы цилиндров и таблицу индексных дескрипторов для файлов, расположенных на цилиндрах этой группы. Такая структура хороша тем, что, во-первых, ускоряется доступ к системным структурам данных, во-вторых, повышается устойчивость к сбоям диска. При повреждении одного участка поверхности диска теряется только небольшая часть служебной информации о файлах и диске (такая информация в документации часто называется метаданными - metadata).

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

Каждому файлу соответствует индексный дескриптор. Он хранит информацию о различных атрибутах файла и его размещении на диске. В индексном дескрипторе записаны:

  • тип файла;
  • права доступа к файлу;
  • идентификатор владельца файла;
  • идентификатор группы файла;
  • время последней модификации файла;
  • время последнего доступа к файлу;
  • время последней модификации самого индексного дескриптора;
  • число повторных использований индексного дескриптора (т.е. случаев, когда файл был стерт и его индексный дескриптор был использован для хранения данных о другом файле);
  • длину файла в байтах (для файлов устройств это поле имеет смысл сочетания major- и minor-номера устройства, см. раздел "Файлы устройств Solaris");
  • идентификатор файловой системы, в которой расположен файл;
  • количество ссылок на файл;
  • число блоков файла (требуется для поддержки работы с файлами, содержащими большие области, заполненные символами с кодом "ноль", т.е. пустое пространство; такие файлы называются holey files - файлы с пустотами);
  • номер теневого индексного дескриптора (если требуется);
  • структура из 15 номеров блоков, описывающая размещение файла на диске; каждый номер блока занимает 4 байта.


Структура, описывающая физическое размещение файла на диске, в UFS представляет собой последовательность из номеров блоков.
Если файл занимает более двенадцати блоков (т.е. его длина больше 12*8192 =98304 байт), то предпоследние три номера обозначают не номера блоков данных, а номера косвенных блоков (indirect blocks), в которых хранятся указатели на следующие блоки данных и, возможно, на следующие косвенные блоки.
Первые двенадцать номеров блоков содержат просто номера блоков данных. Тринадцатый номер - это номер косвенного блока первого уровня. В блоке первого уровня содержится до 2048 адресов блоков данных (речь идет о 8192-байтных блоках).
Четырнадцатый номер блока содержит номер косвенного блока второго уровня. Косвенный блок второго уровня содержит 2048 номеров косвенных блоков первого уровня, таким образом, через косвенный блок второго уровня адресуется до 20482 блоков данных.
В пятнадцатый номер блока записан номер косвенного блока третьего уровня. Косвенный блок третьего уровня содержит 2048 номеров косвенных блоков второго уровня, так что через косвенный блок третьего уровня адресуется до 20483 блоков данных.
Файл не может располагаться на разных разделах UNIX. Файл может быть фрагментирован, хотя файловая система построена так, чтобы свести фрагментацию к минимуму. Теоретически рекомендуется не заполнять файловую систему более, чем на 70%, чтобы не увеличивать фрагментацию при работе.
Максимальный размер файла может быть легко посчитан, так как мы знаем правила адресации блоков данных. Если размер блока равен 512 байт, то напрямую адресуемые из индексного дескриптора блоки в сумме дают размер 12 ? 8192 байта = 98304 байта.
Адресуемые через номер косвенного блока первого уровня - 2048 ? 8192 байта = 16777216 байт.
Адресуемые через номер косвенного блока второго уровня - 20482 ? 8192 байта = 34359738368 байт.
Адресуемые через номер косвенного блока третьего уровня - 20483 ? 8192 байта = 70368744177664 байта.
Вместе получается примерно 64 Тбайт. Однако Solaris 9, насколько об этом можно судить по доступным фактам, не поддерживает файлы размером более 1 Тбайт на данный момент.
Все современные системы UNIX используют 128-байтный индексный дескриптор, который вмещает больше информации и номер блока в нем занимает не 3 байта (как в прошлом), а 4. Поэтому адресовать можно весьма большие разделы.
28 байт в таком дескрипторе отводится под разные расширения, включая место для 32-разрядных идентификаторов владельца и группы файла, а также под 64-разрядные поля времен модификации. Введение 64-разрядных полей времени в UNIX вместо прежних 32-разрядных нужно для того, чтобы избежать "проблемы 2031 года", т.к. именно в этом году перестанет хватать 32 байт для представления времени в системах UNIX. Разработчики обоснованно полагают, что до тех пор все существующие системы UNIX будут заблаговременно переведены на 64-разрядную архитектуру.

Содержание раздела