No space left on device при свободном месте: проверяем inode
Приложение получает No space left on device при создании маленького временного файла. df -h показывает свободные десятки гигабайт. Удаление большого архива почти ничего не меняет. На файловой системе может закончиться другой ресурс: место для учёта отдельных файлов и каталогов.
Inode хранит метаданные объекта и сведения, необходимые файловой системе. Миллионы коротких файлов занимают мало полезных байтов каждый, но требуют много объектов учёта. Возможность создавать новые inode зависит от типа и устройства файловой системы; нельзя считать, что запас всегда автоматически растёт вместе со свободными блоками.
Проверим файловую систему конкретного пути
df -h /var/spool/myapp
df -i /var/spool/myapp
findmnt -T /var/spool/myapp
Путь замените каталогом, где происходит ошибка. df без аргумента может показывать несколько разделов, и свободное место на другом mount не помогает проблемной записи. findmnt позволяет сопоставить путь, mount и тип файловой системы. В контейнере проверяйте путь с учётом volume и фактического хранилища на узле.
При inode-проблеме во второй команде важны IFree и IUse%. Если свободных inode нет, а блоки ещё доступны, направление поиска подтверждено. Если оба запаса есть, проверьте точное сообщение, quotas и ограничения конкретного окружения. Одного общего ENOSPC недостаточно для окончательного диагноза.
Найдём распределение объектов
sudo du --inodes -x --max-depth=1 /var/spool/myapp
GNU du с --inodes сравнивает каталоги по использованию inode, а не по размеру данных. -x ограничивает обход одной файловой системой. Выберите самый крупный подкаталог и повторите команду для него. Так можно спуститься от общего spool до очереди, временных выгрузок или кэша, породившего проблему.
Большой обход сам требует операций с метаданными. На перегруженном хранилище начинайте с известных каталогов приложения, а не с полного сканирования всего сервера. Сообщения о недостатке прав означают неполный результат. Параллельное создание файлов также меняет счёт во время обхода, поэтому числа служат направлением, а не точной переписью на один момент.
Жёсткие ссылки усложняют сравнение: несколько имён могут ссылаться на один inode. Поэтому количество строк find не всегда равно количеству занятых inode. Для первоначальной локализации du --inodes полезнее самодельного подсчёта строк, который ещё и ломается на переводах строки в именах.
Поймём, почему файлы остаются
Допустим, в каталоге completed лежат сотни тысяч файлов результатов, хотя потребитель уже обработал их. Уточните контракт жизненного цикла: кто создаёт объект, кто помечает его завершённым, кто удаляет и как определяется срок хранения. Возраст имени сам по себе не доказывает, что данные больше не нужны.
Если это очередь, сначала отделите незавершённые задания от подтверждённых. Если кэш — выясните, поддерживает ли приложение штатную очистку. Для sessions и lock-файлов удаление без понимания владельца может нарушить работу. Цель диагностики — выбрать набор с подтверждённой допустимостью удаления, а не запустить массовое rm по самому большому каталогу.
Проверим освобождение правильного ресурса
После согласованной очистки сравните df -i для того же пути и попробуйте штатную операцию приложения. Освобождение одного большого архива обычно возвращает один inode, поэтому почти не влияет на миллион мелких объектов. При открытом удалённом объекте освобождение может зависеть и от его закрытия процессом; это отдельный механизм.
Устойчивое решение меняет производство и удержание файлов: ограничивает срок хранения, исправляет забытый обработчик завершений, вводит пакетирование там, где оно соответствует модели данных. Если формат нагрузки действительно требует множества объектов, планируют хранилище с подходящими характеристиками вместо повторяющейся аварийной очистки.
В мониторинге отдельно отслеживайте доступные inode и блоки на нужных разделах. Эти сигналы отвечают на разные вопросы. Пример показывает, почему проверка «на диске есть место» должна называть конкретный путь и ресурс, необходимый следующей записи.
Ещё по теме
- Permission denied при доступном файле: проверяем права каталогов по пути
- Bash-скрипт сообщил об успехе после ошибки: код возврата и pipefail
Продолжить изучение
Хотите перейти от отдельных команд к сопровождению Linux-серверов? Работа с системой, скриптами и сервисами входит в программу «Linux и Bash для DevOps-инженеров».
Продолжить на практике
- Linux и Bash для DevOps-инженеров ↗
Linux для работы с серверами: процессы, права, systemd, сеть, диски и логи. Автоматизируйте повседневные задачи на Bash и разберите типичные сбои сервиса — от занятого порта до переполненного диска.
