Что означает ошибка нехватки места на диске
Ошибка нехватки дискового пространства в Linux проявляется сообщениями вида:
No space left on device
или в графическом интерфейсе — уведомлением «На диске закончилось свободное место». Она возникает, когда файловая система не может выделить блоки под новые данные или inode под новые файлы. Чаще всего это случается при установке обновлений, записи логов или создании временных файлов.
Причины возникновения
- Накопление кэша пакетного менеджера — в
/var/cache/apt/archives(Ubuntu/Debian) или/var/cache/yum(CentOS) скапливаются сотни МБ скачанных пакетов. - Старые ядра Linux — при каждом обновлении ядра старое не удаляется автоматически и занимает 200–500 МБ каждое.
- Разросшиеся логи — сервисы вроде
journald,nginx,dockerпишут логи в/var/log, которые никто не ротирует. - Удалённые, но открытые файлы — процесс держит файл после
rm, и место не освобождается до его перезапуска. - Исчерпание inode — на диске много м tiny-файлов (например, кэш PHP/Node), и закончились inode при наличии свободных блоков.
- Docker и контейнеры — неиспользуемые образы, тома и build-кэш занимают десятки ГБ.
Способы решения
Способ 1: Быстрая диагностика и очистка кэша APT
Начните с понимания масштаба проблемы и удаления самого «мусорного» слоя.
- Посмотрите заполненность разделов:
df -h
Флаг-hвыводит размеры в ГБ/МБ, понятные человеку. - Найдите, какие папки занимают место в корне:
sudo du -h --max-depth=1 / 2>/dev/null - Очистите кэш скачанных пакетов:
sudo apt clean
Эта команда удаляет всё из/var/cache/apt/archives, но не ломает систему — пакеты можно скачать заново.
Способ 2: Удаление старых ядер и ненужных зависимостей
Если apt clean не помог, скорее всего, место съедают старые ядра.
- Посмотрите установленные ядра:
dpkg --list | grep linux-image - Безопасно удалите всё неиспользуемое:
sudo apt autoremove --purge -y⚠️ Важно: команда оставит текущее и предыдущее рабочее ядро. Не удаляйте
linux-imageвручную черезdpkg -r, если не уверены, какое ядро активно.
Способ 3: Чистка логов и системных журналов
Логи часто занимают несколько ГБ на серверах.
- Очистите журнал systemd (оставьте только последние 100 МБ):
sudo journalctl --vacuum-size=100M - Удалите старые сжатые логи в
/var/log:sudo find /var/log -name "*.gz" -delete sudo find /var/log -name "*.old" -delete - Если используете Docker, очистите «мёртвые» данные:
docker system prune -a --volumes💡 Совет: эта команда удалит неиспользуемые контейнеры, сети, образы и тома. Убедитесь, что не нужные вам данные отсутствуют в volumes.
Способ 4: Освобождение места при удерживаемых файлах и нехватке inode
Если df -h показывает 100%, а du — мало, проблема в процессах или inode.
- Проверьте inode отдельно от блоков:
df -i
ЕслиIUse%близко к 100% — удаляйте мелкие файлы (кэши приложений, сессии). - Найдите удалённые, но открытые файлы:
sudo lsof | grep deleted - Перезапустите процесс, который держит файл (например,
rsyslog):sudo systemctl restart rsyslog
После рестарта место сразу вернётся вdf -h.
Профилактика
Чтобы ошибка не возвращалась, настройте автоматическую уборку:
- Включите еженедельный
apt autoremoveчерез cron или systemd timer. - Ограничьте размер журнала systemd — отредактируйте
/etc/systemd/journald.conf:
и перезапуститеSystemMaxUse=500Msudo systemctl restart systemd-journald. - Настройте logrotate для
/var/log(файл/etc/logrotate.confуже содержит базовые правила). - Для Docker добавьте в
/etc/docker/daemon.jsonлимит на логи контейнеров:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } - Раз в месяц проверяйте
df -hиdf -iна серверах, особенно на тех, где пишутся бэкапы или логи приложений.