#Что означает ошибка
No space left on device, но df -h показывает свободное место
No space left on device при том, что df -h показывает свободное место, означает исчерпание inode (индексных дескрипторов). Каждый файл или каталог занимает один inode, а их количество фиксируется при создании ФС. Миллионы мелких файлов (кэш сессий PHP, почтовые очереди, логи) заканчивают inode раньше, чем место.
Подтвердите диагноз командой df -i.
Затем найдите каталог с огромным числом файлов.
Файловая система хранит не только данные, но и индексные дескрипторы (inodes). Если их исчерпано — например, множеством мелких файлов — записать новый файл нельзя даже при свободных гигабайтах.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Множество мелких файлов | Сессии, кэш, почта. | Найдите и удалите ненужные. |
| Разросшийся кэш приложения | Каталог с миллионами файлов. | Очистите кэш. |
| Мало inodes при создании ФС | Недостаточная плотность. | Пересоздайте ФС с нужным числом inodes. |
| Ошибка в приложении | Бесконечно создаёт файлы. | Исправьте. |
#Пошаговое решение
- Выполните df -iВ терминале Linux выполните
df -h /иdf -i /, затем для проблемного каталога —df -i /путь/к/каталогу. Если в столбце IUse% близко к 100 %, закончились inode, даже при свободных гигабайтах. Запишите, какая файловая система затронута, прежде чем что-либо удалять. Если inode свободны, ищите другую причинуNo space left on device: квоты, tmpfs или отсутствие блоков. - Найдите каталоги с множеством файловОткройте терминал и выполните
df -iдля проверки inode по точкам монтирования. Если IUse% близко к 100%, найдите каталоги с множеством маленьких файлов, начиная с известного каталога приложения. Сначала просмотрите содержимое и настройки хранения, сделайте резервную копию; не удаляйте случайные файлы в /var/lib или системные записи. - Удалите ненужные мелкие файлыПосле
df -iопределите заполненный раздел. Найдите каталог с большим числом небольших файлов только среди знакомых данных приложения; предварительно покажите списокfind /реальный/каталог -type f | head -n 50(замените путь). НЕ используйтеfind -deleteбез точного фильтра и резервной копии: он может безвозвратно удалить много файлов. Удаляйте только проверенный временный каталог штатным способом. - Очистите кэши и журналыПосле выявления каталога с множеством маленьких файлов сначала выясните, какой процесс их создаёт. Для журналов выполните
journalctl --disk-usageи, если это именно журналы systemd, рассмотрите штатное ограничение размераsudo journalctl --vacuum-size=500M(изменяет журналы; сначала оцените, нужны ли они для расследования). Для кэша apt в Debian/Ubuntu применимsudo apt clean, но он не обязательно освобождает много inode. Для серверных сессий PHP используйте штатную настройку времени жизни и сборщик мусора; не удаляйте файлы из/var/lib/php/sessionsпо возрасту произвольной командой: можно оборвать работающие сеансы. После штатной очистки повторитеdf -iи проверьте, уменьшился лиIUse%. - Настройте регулярную очисткуПосле обнаружения и удаления конкретных ненужных временных файлов настройте штатное обслуживание приложения, которое их создаёт: ограничение числа логов, ротацию через logrotate или очистку кэша по документации программы. На сервере не ставьте автоматическую команду удаления всех файлов из
/tmpили/varбез проверки работающих процессов. Раз в некоторое время контролируйтеdf -i, а при повторном росте изучите источник миллионов мелких файлов. - Использование inodesLinux · Терминал (Bash)КомандаИспользование inodes.
df -i
#Диагностика
Выполните df -i: столбец IUse% близок к 100 % — причина найдена. Найдите каталоги-виновники: sudo find / -xdev -type d -size +1M 2>/dev/null (огромные каталоги) или быстро посчитайте файлы: for d in /*; do echo "$d $(sudo find "$d" -xdev 2>/dev/null | wc -l)"; done. Альтернатива: sudo du --inodes -x -d2 / 2>/dev/null | sort -n | tail. Типичные места: /var/lib/php/sessions, /var/spool/postfix, /tmp, /var/cache, ~/.cache.
#Очистка
Удаляйте мелкие файлы без rm * в огромных каталогах (аргументов слишком много): find /var/lib/php/sessions -type f -mtime +1 -delete. Для почты: postsuper -d ALL deferred (осознанно). Очистите кэш пакетов (apt clean, dnf clean all), старые ядра, журналы journalctl --vacuum-time=7d. Контейнеры Docker: docker system prune. Для каталога с миллионами файлов быстрее всего: rsync -a --delete /пустая/ /каталог/.
#Профилактика
У ext4 число inode обычно задаётся при создании файловой системы; mkfs.ext4 форматирует раздел и уничтожает данные. Не запускайте mkfs.ext4 -N или -i для «исправления» существующего тома. Если выяснилось, что приложениям постоянно не хватает inode, сначала настройте удаление исключительно известных временных файлов и ротацию журналов. Планировать новую файловую систему с подходящей плотностью inode следует только при миграции на другой том с полной резервной копией и последующей проверкой восстановления; для XFS и Btrfs механизмы учёта inode иные.
df -isudo du --inodes -x -d2 / 2>/dev/null | sort -n | tail -20