Внутри системы файлы журнализированной файловой системы (JFS) представлены как индексные узлы (i-узлы, индексные дескрипторы). I-узлы JFS хранятся в статическом виде на диске и содержат информацию о доступе к файлу, а также указатели на фактические адреса блоков данных файла на диске. Число i-узлов на диске, доступных файловой системе, зависит от ее размера, от размера группы размещения (по умолчанию 8 Мб) и от количества байтов, отведенных для одного i-узла (по умолчанию 4096). Эти параметры задаются командой mkfs при создании файловой системы. Когда число файлов в файловой системе возрастет настолько, что все доступные i-узлы окажутся заняты, новые файлы создаваться не будут, даже если в файловой системе есть свободное место. Число доступных i-узлов можно определить с помощью команды df -v. Дисковые i-узлы определяются в файле /usr/include/jfs/ino.h.
При открытии файла операционная система создает базовый i-узел. Этот i-узел содержит копии всех полей, определенных в дисковом i-узле, а также дополнительные контрольные поля. Базовые i-узлы определяются в файле /usr/include/jfs/inode.h.
Каждый дисковый i-узел в журнализированной файловой системе (JFS) представляет собой 128-разрядную структуру.
Смещение конкретного i-узла от начала списка i-узлов файловой системы задает уникальный номер (i-номер), по которому операционная система идентифицирует данный i-узел. Контроль доступности свободных дисковых i-узлов для файловой системы осуществляется с помощью битовой карты, называемой картой i-узлов.
Дисковые i-узлы содержат следующую
информацию:
Невозможно изменить данные в файле, не изменив i-узел, но можно изменить i-узел, не изменяя содержимого файла. Например, при изменении прав доступа будет изменена информация в i-узле (i_ctime), но данные в файле останутся прежними.
Поле i_rdaddr дискового i-узла содержит 8 адресов на диске. Эти адреса указывают на первые 8 блоков данных, связанных с файлом. Адрес в поле i_rindirect указывает на ссылочный блок. Ссылочные блоки могут использовать одноуровневые или двухуровневые ссылки. Таким образом, возможны три варианта выделения блоков для файла: прямое, одноуровневая ссылка и двухуровневая ссылка. Работа со ссылочными блоками и другими способами выделения блоков обсуждается в разделе Распределение памяти в JFS.
Дисковые i-узлы не содержат ни сокращенных, ни полных имен файлов. Соответствие между именами файлов и i-узлами устанавливается с помощью записей каталогов. Любому i-узлу можно поставить в соответствие несколько имен файлов, создав дополнительные записи каталогов с помощью процедуры link или symlink. Для определения номера i-узла, соответствующего данному файлу, служит команда ls -i.
I-узлы, соответствующие файлам устройств, несколько отличаются от i-узлов для обычных файлов. Файлы, связанные с устройствами, называются особыми файлами. В особых файлах устройств нет адресов блоков данных, а в поле i_rdev указаны основной и дополнительный номера устройства.
В обычной ситуации дисковый i-узел освобождается, когда счетчик ссылок (i_nlink) на этот i-узел обнуляется. Ссылки соответствуют именам файлов, связанных с этим i-узлом. При обнулении счетчика ссылок на дисковый i-узел все блоки данных, связанные с этим i-узлом, добавляются в битовую карту свободных блоков данных файловой системы. После этого i-узел помещается в схему свободных i-узлов.
При открытии файла информация из дискового i-узла для упрощения доступа копируется в базовый i-узел. Структура базового i-узла содержит дополнительные поля, предназначенные для управления доступом к важным данным i-узла. Поля базового i-узла определяются в файле inode.h. Ниже указана некоторая дополнительная информация, отслеживаемая в базовом i-узле:
При освобождении базового i-узла (например, с помощью процедуры close) счетчик ссылок для этого i-узла уменьшается на 1. Если в результате этого счетчик обнуляется, то i-узел удаляется из таблицы базовых i-узлов и его содержимое записывается на диск в файл копии i-узла (если два этих файла различны).
Глава 5, Файловые системы и каталоги
Вводная информация об общих I-узлах (G-узлах)
Функция close