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