Работа с i-узлами JFS2
Внутреннее представление файла в JFS2 называется индексным узлом (или i-узлом).
Дисковые i-узлы JFS2 хранятся в статическом виде на диске и содержат параметры доступа к файлам, а также указатели на фактические адреса блоков данных файлов на диске. I-узлы динамически распределяются файловой системой. Дисковые i-узлы определены в файле /usr/include/j2/j2_dinode.h.
При открытии файла операционная система создает базовый i-узел. Этот i-узел содержит копии всех полей, определенных в дисковом i-узле, а также дополнительные контрольные поля. Базовые i-узлы определяются в файле /usr/include/j2/j2_inode.h.
Структура дискового i-узла JFS2
Размер дисковых i-узлов в JFS2 составляет 512 байт. Всем i-узлам присвоены уникальные номера, которые хранятся в индексе схемы размещения индексных узлов файловой системы. Эта схема предназначена для контроля за расположением i-узлов на диске и их доступностью.
| Поле | Оглавление |
|---|---|
| di_mode | Тип файла и биты прав доступа |
| di_size | Размер файла в байтах |
| di_uid | Права доступа для пользователя с данным ИД |
| di_gid | Права доступа для группы с данным ИД |
| di_nblocks | Число блоков, отведенных для размещения файла |
| di_mtime | Время последнего изменения файла |
| di_atime | Время последнего обращения к файлу |
| di_ctime | Время последнего изменения i-узла |
| di_nlink | Число жестких связей с данным файлом |
| di_btroot | Корень дерева B+ с фактическими адресами данных на диске |
Содержимое файла нельзя изменить, не изменяя i-узел, однако можно изменить i-узел, не изменяя содержимого файла. Например, при изменении прав доступа будет изменена информация в i-узле (di_mode), но данные в файле останутся прежними.
Узел di_btroot соответствует корню дерева B+. Он содержит описание данных, хранящихся в i-узлах. Одно из полей дерева di_btroot указывает, как много записей в его i-узле уже используется, а другое поле указывает тип этих записей - листья или внутренние узлы дерева B+.
Дисковые i-узлы не содержат ни сокращенных, ни полных имен файлов. Соответствие между именами файлов и i-узлами устанавливается с помощью записей каталогов. Любому i-узлу можно поставить в соответствие несколько имен файлов, создав дополнительные записи каталогов с помощью процедуры link или symlink. Для того чтобы узнать номер i-узла, соответствующего файлу, нужно ввести команду ls -i.
I-узлы, соответствующие файлам устройств, несколько отличаются от i-узлов для обычных файлов. Файлы, связанные с устройствами, называются особыми файлами. В особых файлах устройств нет адресов блоков данных, а в поле di_rdev указаны основной и дополнительный номера устройства.
Дисковый i-узел освобождается, когда счетчик связей ( di_nlink) с этим i-узлом становится равен 0. Связи представляют имена файлов, которым назначен данный i-узел. При обнулении счетчика связей на дисковый i-узел все блоки данных, связанные с этим i-узлом, добавляются в битовую карту свободных блоков данных файловой системы. После этого i-узел помещается в схему свободных i-узлов.
Структура базового i-узла JFS2
- Состояние базового i-узла, в том числе флаги для индикации:
- Блокировки i-узла
- Наличия процесса, ожидающего освобождения i-узла
- Изменения информации в i-узле данного файла
- Изменения данных в файле
- Номер логического устройства файловой системы, содержащей файл
- i-номер, служащий для идентификации i-узла
- Счетчик ссылок. Когда счетчик ссылок обнуляется, базовый i-узел освобождается.
При освобождении базового i-узла (например, с помощью функции close) счетчик ссылок этого i-узла уменьшается на 1. Если в результате счетчик становится равен нулю, то базовый i-узел освобождается в таблице базовых i-узлов, и его содержимое записывается в копию i-узла, хранящуюся на диске (если две версии i-узла отличаются друг от друга).