Что означает ошибка ENOSPC
Ошибка ENOSPC (код errno 28, сообщение No space left on device) появляется, когда файловая система не может записать новые данные из-за полного отсутствия свободного места на целевом разделе. Вы столкнётесь с ней при попытке сохранить файлы, установить обновления, развернуть контейнеры или запустить базы данных. В этот момент система переходит в режим чтения для некоторых служб, что часто приводит к зависанию процессов и потере данных.
Причины возникновения
- Накопление системных журналов: Демон
systemd-journaldили сторонние логи приложений не ротируются и занимают гигабайты в/var/logили/var/lib/docker. - Кэш пакетного менеджера: Менеджеры
apt,dnfилиpacmanсохраняют.debи.rpmархивы после установки, не удаляя их автоматически. - Устаревшие ядра ОС: После каждого крупного обновления система сохраняет предыдущие версии ядра, которые могут занимать от 500 МБ до 2 ГБ каждое.
- Изолированные или забытые контейнеры: Docker/Podman оставляют неиспользуемые образы, тома и слои, которые быстро заполняют
/var/lib/docker. - Переполнение таблицы inodes: Файловый раздел заполнен не большими файлами, а миллионами мелких (временные сессии PHP, почтовые очереди), из-за чего заканчиваются структурные указатели.
Способы решения
Способ 1: Очистка кэша пакетного менеджера
Самый безопасный метод, который не затрагивает настройки и пользовательские данные. Откройте терминал и выполните команду для вашего дистрибутива:
# Для Debian/Ubuntu
sudo apt clean
sudo apt autoremove
# Для Fedora/RHEL/CentOS
sudo dnf clean all
sudo dnf autoremove
Команда clean удаляет все предварительно загруженные пакеты из /var/cache/apt/archives, а autoremove находит библиотеки, установленные как зависимости для программ, которые вы уже удалили. После выполнения вы сразу освободите 500 МБ – 3 ГБ.
💡 Совет: Если место освободилось, но ошибка остаётся, перезапустите зависшие службы командой
sudo systemctl restart <имя_службы>, чтобы они закрыли дескрипторы к удалённым файлам.
Способ 2: Поиск и удаление крупных файлов
Если кэш не занимает много места, найдите файлы, которые разрослись со временем. Используйте утилиту find с параметром размера:
# Поиск файлов размером более 500 МБ в корневой ФС
sudo find / -xdev -type f -size +500M -exec du -h {} \; | sort -rh | head -n 10
Параметр -xdev предотвращает поиск в смонтированных внешних дисках, sort -rh сортирует результат по убыванию размера. Внимательно проверьте вывод. Если среди файлов окажутся логи приложений (например, access.log или error.log веб-сервера), очистите их без удаления:
# Безопасная очистка без перезапуска сервиса
sudo truncate -s 0 /var/log/nginx/access.log
Способ 3: Удаление старых ядер и журналов systemd
Ядра Linux часто остаются в системе после аварийных обновлений. Проверьте текущее активное ядро командой uname -r и удалите остальные через пакетный менеджер. В Ubuntu/Debian это можно автоматизировать:
sudo apt autoremove --purge
Для системных логов journalctl установите жёсткий лимит хранения. По умолчанию systemd может не ограничивать размер, что критично на SSD:
# Оставить только последние 500 МБ записей
sudo journalctl --vacuum-size=500M
# Проверить текущий объём логов
sudo journalctl --disk-usage
⚠️ Важно: Не удаляйте файлы в директориях
/bootили/lib/modulesвручную. Это нарушит загрузку системы. Всегда используйтеaptилиdnf.
Способ 4: Проверка заполненности inodes
Если df -h показывает свободное место, но запись невозможна, значит закончились inodes. Проверьте это:
df -i
Обратите внимание на колонку IUse%. Если значение близко к 100%, найдите директорию с наибольшим количеством файлов:
# Анализ количества файлов в директориях первого уровня
sudo find / -xdev -type d -exec sh -c 'echo "$(ls -1A "$1" | wc -l) $1"' _ {} \; | sort -rn | head -n 10
Обычно проблема кроется в /var/spool/postfix, /tmp или сессиях PHP. Удалите старые файлы из этих каталогов, используя find ... -delete или rm, и перезапустите затронутые сервисы.
Профилактика
Чтобы ошибка ENOSPC не повторялась, настройте автоматическую ротацию журналов. Создайте или отредактируйте файл /etc/systemd/journald.conf и укажите параметры SystemMaxUse=1G и MaxRetentionSec=1month, затем примените изменения через sudo systemctl restart systemd-journald.
Для пакетов добавьте в /etc/cron.weekly/ простой скрипт очистки кэша. Мониторинг дискового пространства интегрируйте в zabbix, prometheus или настройте email-уведомления через df -h и mail. Если вы активно работаете с контейнерами, регулярно запускайте docker system prune -f или настройте автоматическое удаление неиспользуемых образов через политику Docker daemon.json.