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

Особенно часто с этим сталкиваются при работе с каталогами, в которых накопились миллионы небольших файлов — кэш, временные данные, сессии, логи или файлы очередей. Ниже разберём, что такое inode, чем он отличается от файла и как проверить его использование на сервере.

Что такое inode простыми словами

Представьте файловую систему как архив. Каждый файл в нём имеет условный «паспорт». В паспорте записано, кому принадлежит файл, какие у него права, когда его создавали и изменяли, какого он размера и где на диске находятся его данные. Вот этот «паспорт» и есть inode.

Каждому inode присваивается уникальный номер inode (inode number) в пределах файловой системы. По нему ядро Linux может найти нужную структуру и получить информацию о файле.

В inode хранится:

  • владелец файла;

  • группа владельца;

  • права доступа

  • размер;

  • временные метки;

  • количество жёстких ссылок

  • информация о расположении блоков или extent'ов с данными;

  • различные атрибуты файловой системы.

В ext4 структура inode содержит режим файла, UID/GID, размер, временные метки, количество жёстких ссылок и информацию о блоках. Имя файла в inode не хранится. Оно находится в записи каталога, которая связывает имя с номером inode. Считать inode файлом неверно. Потому что это структура, описывающая файл и помогающая файловой системе найти его данные.

Чем inode отличается от файла и блока данных

У файла можно условно выделить три составляющие:

  • Имя;

  • inode;

  • данные.

Имя находится в каталоге. inode содержит метаданные и сведения о размещении данных. А само содержимое файла находится в блоках файловой системы. В качестве примера – есть текстовый файл размером 5 МБ и он занимает определенное количество блоков данных. Его inode остаётся одной структурой метаданных.

Отсюда возникает важный момент: место на диске и количество доступных inode — два разных ресурса. Можно представить сервер, на котором осталось 20 ГБ свободного пространства. Если файловая система исчерпала доступные inode, создать ещё один обычный файл уже не получится.

Команда df -h покажет свободное место, а создание нового файла всё равно завершится ошибкой:

touch: cannot touch 'newfile': No space left on device

В такой ситуации проверьте не только свободные блоки, но и inode. Хороший пример — жёсткие ссылки (hard links). Несколько имен указывают на один и тот же inode. Наличие нескольких имён не означает наличие нескольких независимых наборов данных. В ext4 записи каталогов содержат имена и номера inode, а несколько записей могут ссылаться на один inode.

Как узнать номер inode файла

Посмотрите inode конкретного файла с помощью ls -i:

ls -i example.txt

Результат будет:

123456 example.txt

Число слева — номер inode, а справа — имя файла.

Для каталога используйте ту же команду:

ls -id /var/log

Так можно легко и быстро проверить inode конкретного объекта. Сам по себе номер inode не говорит, сколько места занимает файл. Он является идентификатором структуры, связанной с объектом файловой системы.

Как проверить использование inode на сервере

Для проверки количества доступных и занятых inode используем:

df -i

Опция -i переключает df с отображения использования блоков на информацию об inode.

Пример вывода:

Filesystem       Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1       6553600  420000 6133600    6% /

Здесь:

  • Inodes — общее количество inode

  • IUsed — сколько inode занято;

  • IFree — сколько осталось свободно;

  • IUse% — процент использования;

  • Mounted on — точка монтирования файловой системы.

Для сравнения команда df -h показывает использование дискового пространства в байтах/блоках. При проблемах с диском лучше запускайте две команды:

df -h
df -i

Если df -h покажет свободное место, а df -i — почти 100% использования inode, причина ошибки именно в количестве файлов.

Можно ли увеличить количество inode?

Здесь всё зависит от файловой системы. В ext4 количество inode, как правило, закладывается при создании файловой системы: оно определяется параметрами форматирования, например заданным числом inode или соотношением байт на inode (см. man mke2fs).

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

В XFS есть параметр maxpct: он ограничивает максимальную долю пространства файловой системы, которая может быть отдана под inode, и, как правило, его можно изменить (см. man mkfs.xfs и man xfs_growfs). Нельзя давать универсальный совет вроде «для увеличения inode нужно только переформатировать диск». Сначала нужно определить тип файловой системы и понять, что именно ограничивает ее использование.

На VPS Leneex при такой диагностике сначала смотрите фактическое состояние файловой системы командами df -h, df -i, если нужно – df -T. Если проблема регулярно возникает из-за конфигурации сервера, уже после диагностики оцените, требуется ли другая конфигурация VPS.

Что делать, если закончились inode

Если df -i показывает почти 100% использования, задача сводится к поиску каталогов, в которых накопилось слишком много файлов.

Типичные причины:

  • кэш приложений;

  • PHP-сессии;

  • временные файлы;

  • многочисленные небольшие логи;

  • почтовые очереди;

  • файлы, оставшиеся после работы приложений;

  • каталоги с большим количеством служебных объектов;

  • ошибки в приложении, из-за которых временные файлы не удаляются.

Диагностировать проблему лучше последовательно.

Найдите файловую систему с дефицитом inode

df -i

Сначала определяем точку монтирования, где IUse% близок к 100%.

Посмотрите, где находится большое количество файлов

Для поиска каталогов с большим числом обычных файлов на конкретной файловой системе используйте:

find /var -xdev -type f -printf '%h\n' 2>/dev/null |
sort | uniq -c | sort -nr | head -20

Команда группирует найденные файлы по каталогам и показывает каталоги с наибольшим количеством файлов. Для другой файловой системы вместо /var указывают соответствующий каталог.

Разберитесь, что создаёт эти файлы

Не стоит сразу удалять найденный каталог. Сначала определите, какое приложение его использует. Большое количество файлов в /var/cache/ и такое же количество файлов в каталоге приложения — совершенно разные ситуации. В первом случае это может быть обычный кэш, во втором — ошибка в приложении или неправильная настройка хранения данных.

Удаляйте только то, назначение чего понятно

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

Проверьте inode повторно

После очистки:

df -i

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

Итог

inode — отдельный ресурс файловой системы, который нельзя смешивать со свободным дисковым пространством. Сервер может иметь свободные гигабайты, но при этом не позволять создавать новые файлы, если закончились доступные inode.

При ошибке No space left on device недостаточно посмотреть только df -h. Проверяйте и df -i, а если inode почти закончились — ищите каталоги с большим количеством небольших файлов. Если подобные ограничения регулярно становятся проблемой для проекта, стоит не просто увеличивать диск, а разобраться, что именно расходует ресурсы файловой системы, и уже после этого подобрать подходящую конфигурацию VPS.