Linux: нет места на диске, хотя df показывает свободное место (inodes)

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Файловая система хранит не только данные, но и индексные дескрипторы (inodes). Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Диагностика
  5. Очистка
  6. Профилактика

#Что означает ошибка

Сообщение
No space left on device, но df -h показывает свободное место

No space left on device при том, что df -h показывает свободное место, означает исчерпание inode (индексных дескрипторов). Каждый файл или каталог занимает один inode, а их количество фиксируется при создании ФС. Миллионы мелких файлов (кэш сессий PHP, почтовые очереди, логи) заканчивают inode раньше, чем место.

Подтвердите диагноз командой df -i.

Затем найдите каталог с огромным числом файлов.

Файловая система хранит не только данные, но и индексные дескрипторы (inodes). Если их исчерпано — например, множеством мелких файлов — записать новый файл нельзя даже при свободных гигабайтах.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Множество мелких файловСессии, кэш, почта.Найдите и удалите ненужные.
Разросшийся кэш приложенияКаталог с миллионами файлов.Очистите кэш.
Мало inodes при создании ФСНедостаточная плотность.Пересоздайте ФС с нужным числом inodes.
Ошибка в приложенииБесконечно создаёт файлы.Исправьте.

#Пошаговое решение

  1. Выполните df -iВ терминале Linux выполните df -h / и df -i /, затем для проблемного каталога — df -i /путь/к/каталогу. Если в столбце IUse% близко к 100 %, закончились inode, даже при свободных гигабайтах. Запишите, какая файловая система затронута, прежде чем что-либо удалять. Если inode свободны, ищите другую причину No space left on device: квоты, tmpfs или отсутствие блоков.
  2. Найдите каталоги с множеством файловОткройте терминал и выполните df -i для проверки inode по точкам монтирования. Если IUse% близко к 100%, найдите каталоги с множеством маленьких файлов, начиная с известного каталога приложения. Сначала просмотрите содержимое и настройки хранения, сделайте резервную копию; не удаляйте случайные файлы в /var/lib или системные записи.
  3. Удалите ненужные мелкие файлыПосле df -i определите заполненный раздел. Найдите каталог с большим числом небольших файлов только среди знакомых данных приложения; предварительно покажите список find /реальный/каталог -type f | head -n 50 (замените путь). НЕ используйте find -delete без точного фильтра и резервной копии: он может безвозвратно удалить много файлов. Удаляйте только проверенный временный каталог штатным способом.
  4. Очистите кэши и журналыПосле выявления каталога с множеством маленьких файлов сначала выясните, какой процесс их создаёт. Для журналов выполните journalctl --disk-usage и, если это именно журналы systemd, рассмотрите штатное ограничение размера sudo journalctl --vacuum-size=500M (изменяет журналы; сначала оцените, нужны ли они для расследования). Для кэша apt в Debian/Ubuntu применим sudo apt clean, но он не обязательно освобождает много inode. Для серверных сессий PHP используйте штатную настройку времени жизни и сборщик мусора; не удаляйте файлы из /var/lib/php/sessions по возрасту произвольной командой: можно оборвать работающие сеансы. После штатной очистки повторите df -i и проверьте, уменьшился ли IUse%.
  5. Настройте регулярную очисткуПосле обнаружения и удаления конкретных ненужных временных файлов настройте штатное обслуживание приложения, которое их создаёт: ограничение числа логов, ротацию через logrotate или очистку кэша по документации программы. На сервере не ставьте автоматическую команду удаления всех файлов из /tmp или /var без проверки работающих процессов. Раз в некоторое время контролируйте df -i, а при повторном росте изучите источник миллионов мелких файлов.
  6. Использование inodes
    Linux · Терминал (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 иные.

Linux · Терминал (Bash)КомандаНужен sudo
Запуск в терминале Linux. Первая команда показывает использование inode; вторая только подсчитывает файловые объекты внутри корневой файловой системы. Ничего не удаляет. Для обхода больших томов может потребоваться время.
df -i
sudo du --inodes -x -d2 / 2>/dev/null | sort -n | tail -20

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.