Что означает ошибка ENOSPC
Ошибка No space left on device (код ENOSPC) возникает, когда операционная система Linux не может записать данные на диск из-за отсутствия свободного места. Система возвращает это исключение при попытке создания файла, расширения существующего или записи в журнал.
Типичные симптомы:
- Команды
apt install,yum updateзавершаются с ошибкой. - Веб-сервер (Nginx/Apache) не записывает логи, приложения падают с
IOException. - Почтовые серверы (Postfix) не принимают письма.
- Базы данных (MySQL/PostgreSQL) отказываются выполнять операции.
Ошибка критична: система становится неработоспособной для любых операций, требующих записи на диск.
Причины возникновения
- Заполнение раздела диска — свободное место на разделе (
/,/var,/home) опустилось ниже 1-5%. - Исчерпание inode — на разделе закончились индексные дескрипторы (много маленьких файлов). Проверьте:
df -i. - Кэш пакетного менеджера — накопленные
.deb/.rpmпакеты в/var/cache/aptили/var/cache/yum. - Старые системные логи — логи в
/var/log(особенноsyslog,kern.log,journalctl) не ротируются. - Старые ядра Linux — каждый установленное ядро занимает 200-500 МБ в
/boot. - Временные файлы — остатки в
/tmp,/var/tmp, кэш браузеров, файлы отменённых задач. - Утечки файловых дескрипторов — процессы держат открытыми удалённые файлы (проверьте
lsof | grep deleted). - Ограничения квот — на раздел установлены квоты (quota), и пользователь/группа исчерпал лимит.
Способы решения
Способ 1: Быстрая диагностика и очистка (рекомендуется)
Этот способ решает 90% случаев за 5-10 минут.
- Определите, какой раздел заполнен:
df -h
Пример вывода:Filesystem Size Used Avail Use% Mounted on /dev/sda1 20G 19G 0G 100% /
Здесь раздел/заполнен на 100%. - Найдите самые большие каталоги в проблемном разделе:
sudo du -sh /* 2>/dev/null | sort -rh | head -20
Для раздела/var(если он отдельный):sudo du -sh /var/* 2>/dev/null | sort -rh | head -20 - Освободите место в найденных каталогах:
- Кэш 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/*
- Кэш apt (Debian/Ubuntu):
- Проверьте результат:
df -h
Убедитесь, чтоAvail(свободное место) стало больше 1-2 ГБ.
Способ 2: Очистка системного журнала (journalctl)
Если используется systemd, журнары могут занимать гигабайты.
- Проверьте текущий размер журнала:
sudo journalctl --disk-usage - Очистите журналы старше 2 дней (без потери актуальных):
sudo journalctl --vacuum-time=2d - Или ограничьте размер журнала на постоянной основе:
Отредактируйте
/etc/systemd/journald.conf:[Journal] SystemMaxUse=500M
Затем перезапустите службу:sudo systemctl restart systemd-journald
Способ 3: Удаление старых ядер Linux
Заброшенные ядра в /boot часто занимают сотни мегабайт.
- Посмотрите установленные ядра:
dpkg -l 'linux-image*' | grep '^ii' # Debian/Ubuntu rpm -qa | grep kernel # CentOS/RHEL - Удалите старые версии, оставив последнюю и одну запасную:
sudo apt-get remove --purge linux-image-5.4.0-42-generic # Ubuntu пример
Важно: Не удаляйте текущее ядро (проверьтеuname -r). - Для CentOS/RHEL:
sudo package-cleanup --oldkernels --count=2
Способ 4: Расширение раздела (если есть свободное место на диске)
Если на физическом диске есть неразмеченное пространство или используется LVM.
- Для LVM:
sudo vgextend <имя_группы_томов> /dev/sdX # добавьте физический диск sudo lvextend -l +100%FREE /dev/<группа_томов>/<логический_том> sudo resize2fs /dev/<группа_томов>/<логический_том> # для ext4 # или для XFS: sudo xfs_growfs /mount/point - Для обычных разделов (без LVM): требуется переразметка с помощью
gparted(живой CD) илиfdisk/parted(риск потери данных).
Способ 5: Очистка inode (если df -i показывает 100%)
Когда закончились not inode, а не байты.
- Найдите директории с огромным количеством файлов:
sudo find / -type f | awk '{dir=gensub(/([^/]+$)/, "", 1, $0); count[dir]++} END {for (d in count) print count[d], d}' | sort -rn | head -20 - Удалите массовые временные файлы:
- Кэш 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/*
- Кэш PHP:
Профилактика
- Настройте мониторинг:
Добавьте в
crontab(crontab -e):*/30 * * * * /usr/bin/df -h | grep -E '^/dev' | awk '$5+0 >= 80 {print "Диск "$1" заполнен на "$5" на "$6}' | mail -s "Предупреждение: диск почти полон" admin@example.com - Включите ротацию логов:
Убедитесь, что
logrotateнастроен в/etc/logrotate.confи/etc/logrotate.d/. - Регулярно очищайте кэш:
- Для apt:
sudo apt autoremove && sudo apt clean(раз в неделю). - Для Docker:
docker system prune -a(если используется).
- Для apt:
- Установите
ncduдля интерактивного анализа:sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # CentOS/RHEL sudo ncdu / - Настройте квоты (quota) для пользователей, если несколько пользователей/сервисов на одном разделе.