По какой причине могут закончиться inode в Linux?

«По какой причине могут закончиться inode в Linux?» — вопрос из категории Linux, который задают на 26% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Inode (index node) — это структура данных в файловых системах типа ext3/ext4, которая хранит метаданные о файле (владелец, права, временные метки, указатели на блоки данных). Их количество фиксировано при создании файловой системы.

Причины исчерпания inode при наличии свободного места на диске:

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

    • Кэшей приложений (например, pip или npm).
    • Почтовых серверов (каждое письмо — файл).
    • Сессий PHP или временных файлов, которые не очищаются.
    • Логов, если они ротируются по файлу на каждый запуск.
  2. Неочищенные дескрипторы удаленных файлов. Если файл удален (rm), но какой-то процесс продолжает его держать открытым, inode и место на диске остаются занятыми до закрытия дескриптора. Такие файлы видны через lsof +L1 (поле NLINK равно 0).

  3. Исходно малое количество inode при создании ФС. По умолчанию mkfs.ext4 резервирует один inode на каждые 16 КБ пространства. Для файловой системы с большим количеством мелких файлов этого может не хватить.

Диагностика:

# Показать использование inode по файловым системам
$ df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      6553600 6553600      0  100% /var/log

# Найти директории с большим количеством файлов
$ sudo find /var/log -type f | cut -d '/' -f 4 | sort | uniq -c | sort -rn | head -20

Решение:

  • Краткосрочное: Найти и удалить ненужные мелкие файлы (например, старые кэши или логи).
  • Долгосрочное: Перепроектировать приложение, чтобы избегать создания огромного количества файлов. Использовать СУБД или специализированные хранилища для мелких данных.
  • Радикальное: Увеличить файловую систему или пересоздать ее с большим количеством inode, используя опцию -N в mkfs.ext4. Внимание: это требует резервного копирования и простоя.