На просторах Сети часто-густо можно встретить обсуждения работы файловых систем. В подобных дискуссиях часто можно встретить термин «inode» — индексный дескриптор. Многие новички задаются вопросом: «что же такое, этот inode?», поскольку без понимания значения этого термина они не могут вникнуть в суть обсуждения тех или иных тонкостей работы файловых систем. В этой заметке мы с вами попробуем разобраться, что же такое inode и с чем её едят. Автор не является экспертом в области файловых систем, поэтому будет рад любым конструктивным замечаниям и поправкам.
Файловые системы, как правило, состоят из двух частей:
- метаданных, т. н. данных о данных;
- самих данных.
Первый пункт звучит довольно забавно: «данные о данных», однако он является ключевым моментов в работе файловых систем. Если быть более точным, метаданные содержат информацию о данных, хранящихся на диске, таких как имена файлов, время их создания, права доступа и так далее. Роль метаданных крайне важна, поскольку без них файловая система представляла бы из себя лишь набор байт, в котором невозможно было бы определить что и где физически находится на диске.
Индексный дескриптор
В общем случае в файловых системах операционных систем *NIX с каждым файлом и каталогом связан соответствующий дескриптор — inode, который обычно обозначается целым числом и в котором хранятся метаданные. Происхождение термина «inode» точно неизвестно.
Каким образом создаются дескрипторы и вообще, создаются ли они, зависит от реализации конкретной файловой системы. Некоторые файловые системы создают дескрипторы в момент создания файловой системы, в результате располагая фиксированным количеством индексных дескрипторов, то есть фиксированным пределом количества файлов, хранящихся в ФС. Так, например, работает файловая система Ext-3. Таким образом получается, что вы в какой-то момент не сможете создать файл, даже если свободного пространства на диске будет достаточно. Такое случается крайне редко, но, тем не менее, не исключено. Если, используя такую файловую систему, вам понадобиться больше индексных дескрипторов, вам придётся заново создавать ФС, средств увеличить количество inode без потери данных нет.
Одним из способов обойти вышеописанное поведение ФС являются экстенты и/или динамическое выделение индексных дескрипторов. Такие системы могут динамически расширяться и/или увеличивать количество inode.
Индексные дескрипторы не являются чем-то мистическим, они являются частью Linux. Вы можете увидеть их присутствие, например при помощи команды 'ls -i':
laytonjb@laytonjb-laptop:~/Documents/FEATURES/STORAGE088$ ls -il
total 1024
8847368 -rw-r--r-- 1 laytonjb laytonjb 115020 2011-04-24 07:33 Figure_1.png
8847366 -rw-r--r-- 1 laytonjb laytonjb 39200 2011-04-24 07:38 Figure_2.png
8847361 -rw-r--r-- 1 laytonjb laytonjb 30691 2011-04-24 07:40 Figure_3.png
8847367 -rw-r--r-- 1 laytonjb laytonjb 28835 2011-04-24 07:42 Figure_4.png
8847363 -rw-r--r-- 1 laytonjb laytonjb 115103 2011-04-24 07:43 Figure_5.png
8847362 -rw-r--r-- 1 laytonjb laytonjb 125513 2011-04-24 07:44 Figure_6.png
8847365 -rw-r--r-- 1 laytonjb laytonjb 77831 2011-04-24 07:44 Figure_7.png
7790593 -rw-r--r-- 1 laytonjb laytonjb 15632 2011-04-26 19:40 storage088.html
8847364 -rw-r--r-- 1 laytonjb laytonjb 183 2011-04-24 07:33 text1.txt
3089319 drwxr-xr-x 2 laytonjb laytonjb 4096 2011-04-24 07:54 TRIM_WORKS
5554211 -rw-r--r-- 1 laytonjb laytonjb 449110 2011-04-24 07:52 trim_works.tar.gz
Числа в первом столбце и есть номера inode. Также обратите внимание на каталог "TRIM_WORKS”, который тоже имеет номер inode, связанный с ним.
Linux, которая в большинстве реализаций является POSIX-совместимой ОС, требует обязательного наличия атрибутов файла, располагающегося на ФС, в частности:
- размер файла в байтах;
- идентификатор устройства;
- идентификатор владельца файла;
- идентификатор группы-владельца файла;
- режим доступа к файлу, определяющий кто и какой доступ имеет к файлу;
- дополнительные системные и пользовательские флаги, которые дополнительно могут ограничивать доступ к файлу и его модификацию;
- таймштампы, отражающие время модификации индексного дескриптора (ctime, changing time), время модификации содержимого файла (mtime, modification time) и время последнего доступа к файлу (atime, access time);
- счётчик для учёта количества жёстких ссылок на файл;
- указатели на физические блоки диска, в которых хранится содержимое файла (об этом ниже).
Любая POSIX-совместимая Linux ОС должна хранить указанную информацию в индексных дескрипторах или же быть способной представлять эту информацию так, будто бы она хранится в них. Например, ReiserFS не использует традиционные inode. Вместо этого для хранения метаданных в ReiserFS используется комбинированное B±дерево, к роли ключей которого выступают универсальные идентификаторы объектов. Однако при запросе информации ReiserFS предоставляет её в POSIX-совместимом виде.
Структура указателя индексного дескриптора
Согласно POSIX, в файловой системе есть элемент, называемый inode pointer structure —структурой указателя индексного дескриптора. Как говорилось выше, inode хранит метаданные, включая список блоков на диске, в которых располагается непосредственно содержимое файла. Структура указателя индексного дескриптора используется для извлечения списка дисковых блоков, ассоциированных с файлом.
Согласно описанию с Википедии, эта структура хранит 11 или 13, а в самых современных ФС — 15 указателей. Назначение этих указателей следующее:
- 12 указателей используются для хранения номеров блоков, содержащих непосредственно данные файла, и называются прямыми указателями;
- один одиночный косвенный указатель. Этот указатель указывает на блок прямых указателей, хранящих данные файла;
- один двойной косвенный указатель. Указывает на блок одиночных косвенных указателей;
- один тройной косвенный указатель. Указывает на блок двойных косвенных указателей.
Чтобы вышеописанное было проще понять, взгляните на иллюстрацию, взятую с Википедии:
На рисунке выше вы можете видеть прямые, одиночные косвенные и двойные косвенные блоки. Тройные косвенные блоки одним уровнем глубже двойных.
Заключение
Концепция inode является фундаментальной частью *NIX , а также других ОС. По своей сути смысл inode является очень простым для понимания — это всего лишь метаданные о данных. То есть, он хранит полезную информацию о данных, хранящихся на диске. Такой информацией является, например, идентификатор владельца файла, идентификатор его группы-владельца, права доступа к файлу, а также различные временные штампы. Таким образом, когда вы используете, например, команду 'ls', она извлекает информацию о метаданных файлов и каталогов из их индексных дескрипторов.
Некоторые файловые системы, например Ext3, создают все индексные дескрипторы в момент создания файловой системы. Такой подход может быть не совсем удачным, поскольку вы не сможете создавать новые файлы в случае, если все доступные inode будут использованы, даже если на диске достаточно места. Чтобы избежать подобных ограничений, можно использовать файловые системы вроде Ext4 и XFS, которые создают индексные дескрипторы по мере необходимости.
Понимание назначения inode может оказаться весьма полезным для читателя. Вооружённые даже базовыми знаниями об inode, вы сможете лучше оценивать возможности различных файловых систем при выборе подходящей для вашей задачи.
Источник: linux-mag.com