Ответ
Inode (index node) — это структура данных в файловых системах типа ext3/ext4, которая хранит метаданные о файле (владелец, права, временные метки, указатели на блоки данных). Их количество фиксировано при создании файловой системы.
Причины исчерпания inode при наличии свободного места на диске:
-
Огромное количество маленьких файлов. Это самая частая причина. Каждый файл, даже нулевого размера, занимает один inode. Проблема характерна для:
- Кэшей приложений (например,
pipилиnpm). - Почтовых серверов (каждое письмо — файл).
- Сессий PHP или временных файлов, которые не очищаются.
- Логов, если они ротируются по файлу на каждый запуск.
- Кэшей приложений (например,
-
Неочищенные дескрипторы удаленных файлов. Если файл удален (
rm), но какой-то процесс продолжает его держать открытым, inode и место на диске остаются занятыми до закрытия дескриптора. Такие файлы видны черезlsof +L1(полеNLINKравно 0). -
Исходно малое количество 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. Внимание: это требует резервного копирования и простоя.