Вы здесь

Inode и каталоги

Inode

C каждым файлом в ОС Unix связана особая структура данных - индексный дескриптор (inode), хранящий метаинформацию файла (владелец, права доступа и т.п.).

Индексные дескрипторы в традиционной файловой системе (ФС) Unix объединялись в последовательно нумерованный массив, что и дало название самой структуре (индексированный node). Для хранения массива индексных дескрипторов в традиционной ФС на диске выделялся непрерывный участок логических блоков. Размер этого участка определял максимальное число файлов, которые могли быть созданы в ФС. В современных ФС эта структура может иметь разные размеры и набор полей или отсутствовать вовсе. Соответственно, классические утилиты мониторинга ФС могут выдавать неверные данные о количестве занятых и свободных inode ФС.

Индексный дескриптор можно рассматривать в двух ипостасях:

В реализации API доступа к ФС – это стандартизованная структура данных для обобщённого представления атрибутов файла. В оперативной памяти индексный дескриптор может быть представлен в виртуальном виде – vnode. Для ФС , не хранящих индексные дескрипторы, vnode создаётся на основе других подходящих источников данных.

Номер индексного дескриптора уникален в рамках одной ФС, однако, при монтировании нескольких ФС в одно дерево номера индексных дескрипторов будут повторяться. Поэтому vnode хранит номер индексного дескриптора плюc идентификатор ФС, в которой он находится. Для диcковых ФС в Linux номером ФС является число, составленное из мажора и минора блочного устройства, на котором ФС расположена. Для NFS, похоже, номер ФС определяется порядком монтирования и последовательно возрастает начиная с 1Ah.

Каталоги

Древовидную структуру файловой системы в Unix обеспечивают каталоги, которые хранят таблицу соответствий ИМЯ->inode. В этой таблице требуется уникальность имен, но не уникальность номеров Inode. Благодаря этому, каждый объект ФС может иметь несколько имён. Счётчик имён хранится в inode объекта.

У каталогов есть одно "нормальное" имя в каталоге верхнего уровня, имя '.' в самом каталоге, и имя '..' в каждом из подкаталогов. В Linux другие имена для каталога создать нельзя. Нарушение этого правила привело к тому, что в структуре файловой системы могли бы образоваться циклы, а это бы нарушило работу алгоритмов обхода дерева каталогов.

У других типов объектов (файлов, FIFO, файлов устройств, сокетов, символических ссылок) может быть много имен в одном или в нескольких каталогах. Такие имена называют "жёсткими ссылками" (hard links), поскольку они гарантированно ссылаются на существующий inode. В противоположность этому, "мягкие ссылки" (soft links) - это особые объекты файловой системы, которые хранят, вообще говоря, произвольные текстовые строки, которые интерпретируются, как пути к файлам. Мягкие ссылки могут ссылаться на несуществующие объекты и не отражаются в счетчике Inode.

Поскольку нумерация Inode в каждой файловой системе своя, жёсткие ссылки могут указывать только на объекты в той же файловой системе, что и каталог, в котором они опубликованы.

В Linux обычные пользователи могут создавать жёсткие ссылки лишь на объекты, владельцами которых они являются. Нарушение этого правила привело бы к тому, что пользователь не мог бы быть уверенным в том, что файл, который он удаляет действительно удаляются из ФС, т.к. файл удаляется лишь в том случае, когда на него нет ни одной жёсткой ссылки.