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 и блоки на нужных разделах. Эти сигналы отвечают на разные вопросы. Пример показывает, почему проверка «на диске есть место» должна называть конкретный путь и ресурс, необходимый следующей записи.

Ещё по теме

Продолжить изучение

Хотите перейти от отдельных команд к сопровождению Linux-серверов? Работа с системой, скриптами и сервисами входит в программу «Linux и Bash для DevOps-инженеров».

Продолжить на практике

  • Linux и Bash для DevOps-инженеров ↗

    Linux для работы с серверами: процессы, права, systemd, сеть, диски и логи. Автоматизируйте повседневные задачи на Bash и разберите типичные сбои сервиса — от занятого порта до переполненного диска.