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

Ошибка 'No space left on device' в Linux: быстрое решение

Статья помогает быстро диагностировать и исправить ошибку 'No space left on device' (ENOSPC) в Linux. Вы узнаете, как найти большие файлы, очистить кэш и логи, а также настроить мониторинг для предотвращения сбоев.

Обновлено 16 февраля 2026 г.
10-15 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 10+CentOS 7+Все дистрибутивы Linux

Что означает ошибка ENOSPC

Ошибка No space left on device (код ENOSPC) возникает, когда операционная система Linux не может записать данные на диск из-за отсутствия свободного места. Система возвращает это исключение при попытке создания файла, расширения существующего или записи в журнал.

Типичные симптомы:

  • Команды apt install, yum update завершаются с ошибкой.
  • Веб-сервер (Nginx/Apache) не записывает логи, приложения падают с IOException.
  • Почтовые серверы (Postfix) не принимают письма.
  • Базы данных (MySQL/PostgreSQL) отказываются выполнять операции.

Ошибка критична: система становится неработоспособной для любых операций, требующих записи на диск.

Причины возникновения

  1. Заполнение раздела диска — свободное место на разделе (/, /var, /home) опустилось ниже 1-5%.
  2. Исчерпание inode — на разделе закончились индексные дескрипторы (много маленьких файлов). Проверьте: df -i.
  3. Кэш пакетного менеджера — накопленные .deb/.rpm пакеты в /var/cache/apt или /var/cache/yum.
  4. Старые системные логи — логи в /var/log (особенно syslog, kern.log, journalctl) не ротируются.
  5. Старые ядра Linux — каждый установленное ядро занимает 200-500 МБ в /boot.
  6. Временные файлы — остатки в /tmp, /var/tmp, кэш браузеров, файлы отменённых задач.
  7. Утечки файловых дескрипторов — процессы держат открытыми удалённые файлы (проверьте lsof | grep deleted).
  8. Ограничения квот — на раздел установлены квоты (quota), и пользователь/группа исчерпал лимит.

Способы решения

Способ 1: Быстрая диагностика и очистка (рекомендуется)

Этот способ решает 90% случаев за 5-10 минут.

  1. Определите, какой раздел заполнен:
    df -h
    

    Пример вывода:
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        20G   19G  0G   100% /
    

    Здесь раздел / заполнен на 100%.
  2. Найдите самые большие каталоги в проблемном разделе:
    sudo du -sh /* 2>/dev/null | sort -rh | head -20
    

    Для раздела /var (если он отдельный):
    sudo du -sh /var/* 2>/dev/null | sort -rh | head -20
    
  3. Освободите место в найденных каталогах:
    • Кэш apt (Debian/Ubuntu):
      sudo apt clean
      
    • Кэш yum/dnf (CentOS/RHEL):
      sudo yum clean all
      
    • Старые логи (более 7 дней):
      sudo find /var/log -type f -mtime +7 -delete
      
    • Временные файлы:
      sudo rm -rf /tmp/*
      sudo rm -rf /var/tmp/*
      
  4. Проверьте результат:
    df -h
    

    Убедитесь, что Avail (свободное место) стало больше 1-2 ГБ.

Способ 2: Очистка системного журнала (journalctl)

Если используется systemd, журнары могут занимать гигабайты.

  1. Проверьте текущий размер журнала:
    sudo journalctl --disk-usage
    
  2. Очистите журналы старше 2 дней (без потери актуальных):
    sudo journalctl --vacuum-time=2d
    
  3. Или ограничьте размер журнала на постоянной основе: Отредактируйте /etc/systemd/journald.conf:
    [Journal]
    SystemMaxUse=500M
    

    Затем перезапустите службу:
    sudo systemctl restart systemd-journald
    

Способ 3: Удаление старых ядер Linux

Заброшенные ядра в /boot часто занимают сотни мегабайт.

  1. Посмотрите установленные ядра:
    dpkg -l 'linux-image*' | grep '^ii'  # Debian/Ubuntu
    rpm -qa | grep kernel  # CentOS/RHEL
    
  2. Удалите старые версии, оставив последнюю и одну запасную:
    sudo apt-get remove --purge linux-image-5.4.0-42-generic  # Ubuntu пример
    

    Важно: Не удаляйте текущее ядро (проверьте uname -r).
  3. Для CentOS/RHEL:
    sudo package-cleanup --oldkernels --count=2
    

Способ 4: Расширение раздела (если есть свободное место на диске)

Если на физическом диске есть неразмеченное пространство или используется LVM.

  1. Для LVM:
    sudo vgextend <имя_группы_томов> /dev/sdX  # добавьте физический диск
    sudo lvextend -l +100%FREE /dev/<группа_томов>/<логический_том>
    sudo resize2fs /dev/<группа_томов>/<логический_том>  # для ext4
    # или для XFS:
    sudo xfs_growfs /mount/point
    
  2. Для обычных разделов (без LVM): требуется переразметка с помощью gparted (живой CD) или fdisk/parted (риск потери данных).

Способ 5: Очистка inode (если df -i показывает 100%)

Когда закончились not inode, а не байты.

  1. Найдите директории с огромным количеством файлов:
    sudo find / -type f | awk '{dir=gensub(/([^/]+$)/, "", 1, $0); count[dir]++} END {for (d in count) print count[d], d}' | sort -rn | head -20
    
  2. Удалите массовые временные файлы:
    • Кэш PHP: sudo rm -rf /var/cache/php/*
    • Кэш npm: sudo rm -rf /usr/local/lib/node_modules/npm/cache/*
    • Файлы сессий: sudo rm -rf /var/lib/php/sessions/*

Профилактика

  1. Настройте мониторинг: Добавьте в crontab (crontab -e):
    */30 * * * * /usr/bin/df -h | grep -E '^/dev' | awk '$5+0 >= 80 {print "Диск "$1" заполнен на "$5" на "$6}' | mail -s "Предупреждение: диск почти полон" admin@example.com
    
  2. Включите ротацию логов: Убедитесь, что logrotate настроен в /etc/logrotate.conf и /etc/logrotate.d/.
  3. Регулярно очищайте кэш:
    • Для apt: sudo apt autoremove && sudo apt clean (раз в неделю).
    • Для Docker: docker system prune -a (если используется).
  4. Установите ncdu для интерактивного анализа:
    sudo apt install ncdu  # Debian/Ubuntu
    sudo yum install ncdu  # CentOS/RHEL
    sudo ncdu /
    
  5. Настройте квоты (quota) для пользователей, если несколько пользователей/сервисов на одном разделе.

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

Что делать, если место освободилось, но ошибка 'No space left on device' остаётся?
Как предотвратить повторение ошибки автоматически?
Можно ли увеличить дисковое пространство без удаления данных?
Ошибка возникает только в одной папке. Почему?

Полезное

Проверьте использование дискового пространства
Анализируйте большие файлы и папки
Очистите кэш пакетного менеджера
Удалите старые логи и временные файлы
Проверьте и удалите старые ядра