Что такое inode в Linux?

  Дмитрий Бушуев  | 

  Обновл. 31 Авг 2021  | 

 1823

Ваша система когда-нибудь жаловалась на то, что у вас не осталось свободного места, в то время как его было явно более чем достаточно?

Иноды и метаданные

Файловая система должна хранить файлы, которые могут находиться в каталогах, которые, в свою очередь, могут иметь подкаталоги. При этом что-то где-то должно записывать информацию о расположении всех файлов файловой системы, имена файлов, их размер, к каким учетным записям они принадлежат, какие у них разрешения и т.д. Данная информация называется метаданными — данные, которые описывают другие данные. Метаданные хранятся в иноде файла.

Инод (или «индексный дескриптор», «inode», от англ. «index node») — это структура данных, в которой хранятся метаданные о стандартных файлах, каталогах или других объектах файловой системы. Каждый используемый инод ссылается на 1 файл. Каждый файл имеет 1 инод. Каталоги, символьные и блочные устройства — всё это является файлами, а значит у каждого из них есть по 1 иноду.

   Информация об инодах хранится в специальной таблице, расположенной, обычно, в начале каждого раздела диска. Каждый раздел имеет свою, отдельную таблицу инодов.

   Для каждого файла в каталоге есть запись, содержащая имя файла и связанный с ним номер инода. Вся остальная информация о файле извлекается из таблицы инодов с помощью номера инода файла.

   Иноды уникальны только в границах разделов своих файловых систем. Если у вас есть два файла, которые находятся на разных разделах диска, то у них могут быть одинаковые номера инодов.

Если у вас закончатся иноды, то вы больше не сможете создавать новые файлы, даже если у вас осталось место в разделе диска.

Как получить информацию об инодах в Linux?


Вы можете легко вывести список номеров инодов с помощью следующей команды:

ls –li /

На следующем скриншоте показан мой корневой каталог с соответствующими номерами инодов:

Количество инодов в каждой файловой системе задается на этапе её создания, и, как правило, для большинства пользователей их количества более чем достаточно.

По умолчанию параметры файловой системы таковы, что создается 1 инод на 2 КБ пространства диска. Такого количества инодов достаточно для большинства систем. Скорее место на вашем жестком диске исчерпается раньше, чем закончатся все иноды. При необходимости, во время определения первоначальных параметров файловой системы, вы можете указать, сколько инодов требуется создать.

Если у вас всё-таки закончатся иноды, то ни вы, ни ваша система больше не сможете создавать новые файлы. Это довольно редкая ситуация, но все же она может возникнуть. Например, в старые времена некоторые почтовые серверы, которые хранили сообщения электронной почты в виде отдельных файлов (что быстро приводило к созданию больших коллекций маленьких файлов размером менее 2 килобайт), довольно часто сталкивались с данной проблемой. Однако, когда они перешли на использование баз данных, проблема решилась.

В некоторых файловых системах, таких как Btrfs, JFS, XFS, реализованы динамические иноды. При необходимости такие файловые системы могут увеличить количество доступных инодов.

Как работает инод?

При создании нового файла ему назначается номер инода и имя файла. Номер инода — это уникальный номер файла в файловой системе. И имя, и номер инода хранятся в виде записи в каталоге.

Когда я запустил команду ls –li /, то тем самым отобразил имена файлов корневого каталога и номера их инодов. Оставшаяся информация о владельце файла, принадлежности к группе, разрешениях на доступ, размере и т.д. была получена из таблицы инодов при помощи номера инода.

Вы можете перечислить информацию об инодах для каждой файловой системы с помощью следующей команды:

df -hi


Иноды и ссылки


Символьные ссылки являются хорошо известной особенностью Linux. Но что происходит с инодами, когда мы создаем символьную ссылку? На следующем скриншоте у меня есть файл с именем file1, каталог под названием dir1, внутри которого расположилась символьная ссылка под названием slink1, которая указывает на ../file1:

Теперь сравним их номера инодов:

ls -liR

Как и ожидалось, dir1 и file1 имеют разные номера инодов. Но то же самое относится и к символьной ссылке. Когда вы определяете символьную ссылку, то тем самым создаете новый файл. В своих метаданных он указывает на целевой объект. Для каждой создаваемой вами символьной ссылки вы используете новый инод.

Теперь давайте создадим жесткую ссылку и посмотрим, что произойдет с инодами:

ln ../file1 hlink1

Выводим список номеров инодов:

Вы можете видеть, что file1 и hlink1 имеют одинаковый номер инода. Жесткая ссылка не создает новый файл, она лишь предоставляет новое имя для тех же данных. Такое возможно благодаря введению механизма инодов.

Примечание: В более старых версиях Linux можно было создать жесткую ссылку на каталог. Было даже возможно сделать так, чтобы каталог стал родительским самому себе. Но теперь установлены некоторые ограничения, чтобы пользователи не создавали очень запутанную структуру каталогов.

Польза от инодов

Принцип работы инодов также объясняет, почему невозможно создать жесткую ссылку из одной файловой системы в другую. Разрешение такой задачи открыло бы возможность наличия конфликтующих номеров инодов. В то же время, символьная ссылка может быть создана в разных файловых системах.

Поскольку жесткая ссылка имеет тот же номер инода, что и исходный файл, то вы можете удалить исходный файл, и данные по-прежнему будут доступны по жесткой ссылке. Всё, что вы сделали в этом случае, — это удалили одно из имен, указывающих на заданный номер инода. Данные, связанные с этим инодом, будут оставаться доступными до тех пор, пока все имена, связанные с ним, не будут удалены.

Иноды также являются важной причиной, по которой Linux-системы могут обновляться без необходимости перезагрузки: один процесс может использовать библиотечный файл, в то время как другой процесс заменяет этот файл новой версией. Уже запущенный процесс будет продолжать использовать старый файл, в то время как каждый новый вызов к нему приведет к использованию новой версии.

Еще одна интересная функция, которая поставляется с инодами, — это возможность хранить данные в самом иноде. Это называется встраиванием (англ. «inlining»). Этот метод хранения имеет преимущество в экономии места, поскольку не требует использования блоков данных, но при этом также увеличивает время поиска, избегая дополнительного доступа к диску для получения данных.

В некоторых файловых системах, таких как ext4, есть опция под названием inline_data, которая позволяет операционной системе хранить данные вышеописанным способом. Из-за ограничения размера встраивание работает только для очень маленьких файлов.

Заключение


Иноды — это не то, с чем вы взаимодействуете напрямую, но они играют важную роль в работе операционной системы. Если раздел должен содержать очень много маленьких файлов, то знание и понимание того, что такое иноды и как они работают, может избавить вас от многих проблем в будущем.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (10 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *