Linux ENOSPCКритическая

Освобождаем место на диске Linux: решение ошибки ENOSPC

Ошибка ENOSPC возникает, когда на системном разделе заканчивается свободное место, что приводит к сбоям в работе сервисов и невозможности сохранения файлов. Разберём безопасные методы очистки диска с помощью терминала и графических утилит.

Обновлено 6 апреля 2026 г.
10-15 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 20.04/22.04/24.04Debian 11/12Fedora 37+CentOS 9 Stream / RHEL 9

Что означает ошибка 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.

Часто задаваемые вопросы

Почему df показывает 100% места, но файлы не занимают весь диск?
Можно ли удалять файлы из директории /var/log вручную?
Как предотвратить ошибку ENOSPC в будущем?

Полезное

Проверьте текущее использование дискового пространства
Очистите кэш пакетного менеджера
Удалите старые ядра и неиспользуемые зависимости
Сократите объём системных журналов

Эта статья помогла вам решить проблему?