Ошибка No space left on device в Linux не всегда означает, что на диске закончились гигабайты. Создание новых файлов также может прекратиться из-за исчерпания inode — структур файловой системы, в которых хранится информация о файлах и каталогах.
Ещё одна возможная причина — удалённый файл продолжает оставаться открытым работающим процессом. В этом случае файл уже не виден в каталоге, но всё ещё занимает место на диске.
Типичные сообщения об ошибке:
При создании файла:
No space left on device
При выполнении SQL-запроса:
Can't create/write to file '/var/tmp/#sql_***_*.MAI' (Errcode: 28 "No space left on device")
В системном журнале:
imjournal: fopen() failed: No space left on device
Быстрая диагностика
Сначала проверьте файловую систему, на которой расположен проблемный каталог. Например, если ошибка связана с /var/tmp:
# Свободное и занятое дисковое пространство df -hT /var/tmp # Использование inode df -ih /var/tmp # Удалённые файлы, которые всё ещё открыты процессами sudo lsof +L1
Если проблемный каталог неизвестен, выведите информацию обо всех смонтированных файловых системах:
df -hT df -ih
Обратите внимание на колонки:
Use%— процент занятого дискового пространства;IUse%— процент использованных inode;Mounted on— точка монтирования файловой системы.
Если закончилось место на диске
Найдите каталоги, которые занимают больше всего места. Параметр -x запрещает переход на другие файловые системы:
sudo du -xhd1 / 2>/dev/null | sort -h
Затем последовательно уточняйте проблемный путь:
sudo du -xhd1 /var 2>/dev/null | sort -h sudo du -xhd1 /var/lib 2>/dev/null | sort -h sudo du -xhd1 /var/log 2>/dev/null | sort -h
На сервере чаще всего разрастаются журналы, резервные копии, кэши, временные файлы, почтовые очереди, файлы баз данных, образы, контейнеры и тома Docker.
Не удаляйте незнакомые файлы только потому, что они занимают много места. Сначала определите, какой программе они принадлежат и можно ли безопасно выполнить очистку.
Если закончились inode
Если свободное место есть, но значение IUse% близко к 100%, файловая система исчерпала доступные inode. Обычно это происходит из-за большого количества небольших файлов.
Найдите каталоги, использующие больше всего inode:
sudo du --inodes -x -d1 / 2>/dev/null | sort -n
Параметр --inodes поддерживается GNU Coreutils. В минимальных системах на базе BusyBox он может отсутствовать.
Затем углубитесь в найденный каталог:
sudo du --inodes -x -d1 /var 2>/dev/null | sort -n sudo du --inodes -x -d1 /var/lib 2>/dev/null | sort -n sudo du --inodes -x -d1 /var/www 2>/dev/null | sort -n
Частые причины нехватки inode:
- файлы PHP-сессий;
- кэш CMS или приложения;
- временные файлы;
- почтовые сообщения и очереди;
- миллионы миниатюр изображений;
- неправильно настроенная ротация журналов;
- файлы очередей и незавершённых заданий.
После очистки повторите проверку:
df -ih
Если показания df и du не совпадают
Команда du подсчитывает файлы, доступные через файловую систему. Команда df показывает фактически занятые блоки. Поэтому после удаления большого журнала du может показывать свободное место, а df — по-прежнему заполненный диск.
Причиной может быть процесс, который продолжает удерживать удалённый файл:
sudo lsof +L1
В выводе найдите процесс и путь к удалённому файлу. Для окончательного освобождения места обычно требуется корректно перезапустить соответствующий сервис.
# Примеры. Перезапускайте только сервис, # который действительно удерживает удалённый файл. sudo systemctl restart nginx sudo systemctl restart php-fpm
Если удалить файлы нельзя
Возможные решения:
- увеличить файловую систему;
- перенести логи, кэш или данные на другой раздел;
- настроить ротацию и срок хранения журналов;
- настроить автоматическую очистку временных файлов и сессий;
- добавить мониторинг свободного места и inode.
Простого увеличения виртуального диска может быть недостаточно: иногда дополнительно требуется расширить раздел, LVM-том и файловую систему. Конкретный порядок зависит от разметки диска и используемой файловой системы — например, ext4 или XFS.
Комментарии
0Нашли ошибку или хотите дополнить материал?