Что означает ошибка «Диск заполнен»
Ошибка «No space left on device» (на русском часто отображается как «Нет свободного места на устройстве» или просто «Диск заполнен») — критическое состояние, когда на выбранном разделе диска закончилось свободное место для записи.
Симптомы:
- Невозможность создания новых файлов, даже в домашней директории.
- Сбои в работе служб (например, веб-сервер не может записать логи, база данных — создавать дампы).
- Ошибки при установке/обновлении пакетов.
- В некоторых случаях система может стать неотзывчивой.
Ошибка возникает на уровне ядра Linux (errno ENOSPC) и не зависит от конкретного приложения — любая операция записи завершится с этим кодом, если место действительно исчерпано.
Причины возникновения
- Накопление логических файлов: Большие файлы логов (
/var/log/), кеш приложений (~/.cache/), базы данных, файлы дампов, временные файлы (/tmp/). - Удалённые, но ещё открытые файлы (deleted but open): Файл удалён командой
rm, но процесс продолжает на него писать, занимая место.dfпокажет место занятым, аduпо каталогам — нет. - Разрастание кеша пакетного менеджера: Накопление старых версий пакетов в кеше APT (
/var/cache/apt/archives/) или DNF/YUM. - Слишком маленький выделенный размер раздела: Раздел, например, для
/var/или/home/, изначально был создан с недостаточным объёмом. - «Тени» (shadow) файловые системы (если используется LVM, Btrfs, ZFS): Снапшоты (снимки) могут занимать значительное место, так как хранят изменения относительно исходного состояния.
- Файлы с большим количеством inodes: Хотя это другая проблема (исчерпание inodes), её симптомы могут быть похожи. Проверяется командой
df -i.
Способы решения
Способ 1: Диагностика и быстрая очистка кеша пакетного менеджера
Это первый и часто самый эффективный шаг на серверах и десктопах.
- Определите, какой раздел заполнен:
df -h
Найдите строку с 100% использованием (например,/dev/sda1или/). - Очистите кеш APT (Ubuntu/Debian):
sudo apt clean sudo apt autoremove --purge
Или для DNF (RHEL/Fedora/CentOS 8+):sudo dnf autoremove sudo dnf clean all - Проверьте результат командой
df -hснова.
💡 Совет:
apt cleanудаляет ВСЕ скачанные файлы пакетов из кеша, что может освободить сотни мегабайт или даже гигабайты.
Способ 2: Поиск и удаление больших файлов
Если очистка кеша не помогла, нужно найти «пожирателей» диска.
- Перейдите в корень проблемного раздела (например, если заполнен
/, то оставайтесь в/). - Найдите 20 самых больших файлов и каталогов:
sudo du -ahx / 2>/dev/null | sort -rh | head -n 20-a— включать файлы.-h— человеко-читаемый формат (M, G).-x— не переходить на другие файловые системы.2>/dev/null— скрыть ошибки «Permission denied».
- Проанализируйте вывод. Частые «кандидаты»:
/var/log/— старые логи./var/cache/— кеш приложений и пакетов./tmp/— временные файлы./home/<user>/Downloads/— загрузки пользователя.- Папки с дампами (
*.dump,*.sql).
- После идентификации удалите или архивируйте ненужные файлы. Будьте осторожны! Удаляйте только то, что уверенно не нужно.
# Пример: удалить старый лог (предварительно убедитесь, что он не нужен!) sudo rm -f /var/log/syslog.1.gz
Способ 3: Очистка журналов systemd и логов
Журналы системных служб через systemd-journald могут разрастаться.
- Проверьте текущий размер журнала:
sudo journalctl --disk-usage - Очистите старые записи, оставив, например, последние 3 дня:
sudo journalctl --vacuum-time=3d
Или очистите, оставив не более 500 МБ:sudo journalctl --vacuum-size=500M - Для логов в
/var/log/(не через systemd) можно вручную удалить сжатые старые файлы (например,*.gzили*.old), если политика ротации логов (logrotate) не сработала.
Способ 4: Обработка «удалённых, но открытых» файлов
Если du не находит больших файлов, а df показывает занятое место, скорее всего, проблема в открытых удалённых файлах.
- Найдите такие файлы:
sudo lsof +L1+L1— ищет файлы, у которых количество ссылок (ссылочный счётчик) меньше 1 (т.е. удалённые, но ещё открытые).
- В выводе обратите внимание на столбец
SIZEиNAME. Процесс, держащий файл, указан в столбцеCOMMAND/PID. - Чтобы освободить место, завершите процесс, который держит файл (если это безопасно), или перезапустите службу:
sudo systemctl restart <имя_службы>
После этого место освободится автоматически.
Способ 5: Расширение раздела (если возможно)
Если после всех очисток место всё равно критически мало, а данные важны, рассмотрите увеличение раздела.
- Для виртуальных машин/облачных серверов: Увеличьте виртуальный диск через панель управления хостинг-провайдера (AWS, GCP, Azure, DigitalOcean и т.д.).
- Для LVM: После увеличения виртуального диска используйте
pvresize,lvextendиresize2fs(для ext4) илиxfs_growfs(для XFS). - Для разделов без LVM: Сложнее. Часто потребуется создание нового раздела, копирование данных и изменение
fstab. Сделайте резервную копию важных данных перед любыми операциями с разделами!
⚠️ Важно: Операции изменения разделов и файловых систем несут риск потери данных. Всегда имейте актуальный бэкап.
Профилактика
- Настройте мониторинг: Используйте
cronс уведомлениями (например, черезmailили Slack-бот) при превышении 80-90% использования диска.# Пример простой проверки в cron (каждый день) 0 9 * * * df -h | grep -E '(/$|/var)' | awk '$5+0 >= 90 {print "CRITICAL: " $0}' | mail -s "Disk Usage Alert" admin@example.com - Настройте
logrotate: Убедитесь, что ротация логов работает корректно. Проверьте конфиги в/etc/logrotate.confи/etc/logrotate.d/. - Регулярно чистите кеш: Добавьте в
cronочистку кеша пакетного менеджера раз в неделю (apt clean/dnf clean all). - Используйте
tmpfsдля временных файлов: В/etc/fstabможно смонтировать/tmpили/var/tmpв оперативную память (tmpfs), что снизит нагрузку на основной диск. - Анализируйте тренды: Раз в месяц запускайте
duна ключевых разделах, чтобы понять, какие каталоги растут быстрее всего, и принять меры (архивация, удаление).