Linux Диск Полный: Быстрое Освобождение Места Пошагово
Ситуация, когда на Linux-сервере или рабочей станции внезапно появляется ошибка «No space left on device», знакомая многим администраторам и пользователям. Система перестаёт работать корректно: не устанавливаются обновления, не пишутся логи, не работают базы данных. Эта проблема критична и требует немедленного решения.
В этом гайде вы получите конкретный, пошаговый план по диагностике и освобождению дискового пространства в Linux. Мы рассмотрим только рабочие команды, актуальные для большинства дистрибутивов (Ubuntu, Debian, CentOS, RHEL, Arch), и дадим рекомендации по профилактике.
🔍 Шаг 1: Диагностика — где именно закончилось место?
Первым делом нужно понять, какой именно раздел (filesystem) заполнен. Ошибка может быть не в корневом /, а в отдельном смонтированном разделе, например /var или /home.
df -h
Ключевые колонки:
- Filesystem — устройство или раздел.
- Size — общий размер.
- Used — использованное место.
- Use% — процент использования. Внимание на значения 90-100%.
- Mounted on — точка монтирования.
Пример вывода:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 48G 1.5G 97% /
/dev/sdb1 200G 30G 160G 16% /home
tmpfs 7.8G 1.2G 6.6G 16% /tmp
Здесь проблема в корневом разделе (/).
⚠️ Важно: Если команда
dfне показывает проблему, проверьте inodes (индексы файлов) — они тоже могут закончиться:df -i.
📊 Шаг 2: Поиск «пожирателей» дискового пространства
После определения проблемного раздела нужно найти, какие каталоги и файлы занимают больше всего места.
Способ A: Стандартные утилиты du и sort
# Анализ 20 самых больших каталогов в корне (игнорируем ошибки доступа)
sudo du -x / 2>/dev/null | sort -n | tail -20
-x— оставаться в одной файловой системе (не заглядывать в другие смонтированные разделы).sort -n— числовая сортировка по размеру (по возрастанию).tail -20— взять последние 20 строк (самые большие).
Результат будет выглядеть так:
5242880 /var/lib/docker
3145728 /usr/lib/jvm
2097152 /var/log
...
Это показывает, что /var/lib/docker — главный кандидат на очистку.
Способ B: Интерактивный анализ с ncdu (рекомендуется)
Установите ncdu — самый удобный инструмент для анализа дискового пространства.
# Для Ubuntu/Debian
sudo apt update && sudo apt install ncdu
# Для CentOS/RHEL (EPEL репозиторий)
sudo yum install epel-release && sudo yum install ncdu
# Для Arch
sudo pacman -S ncdu
Запустите анализ нужного раздела:
sudo ncdu /
Вы получите интерактивный интерфейс (в текстовом режиме), где можно перемещаться по папкам, видеть их размер и удалять файлы прямо из программы (клавиша d). Это значительно ускоряет процесс.
🗑️ Шаг 3: Очистка — что можно безопасно удалить?
После анализа вы увидите «виновников». Вот основные категории для очистки.
1. Кэш пакетного менеджера и старые версии ПО
Для Debian/Ubuntu:
# Удалить локальные кэшированные файлы пакетов (.deb)
sudo apt-get clean
# Удалить старые, ненужные зависимости
sudo apt-get autoremove --purge
# Показать старые ядра (не удаляйте текущее!))
dpkg -l 'linux-image*' | grep '^ii'
# Удаление конкретного старого ядра (пример)
sudo apt-get purge linux-image-5.4.0-42-generic
Для RHEL/CentOS/Fedora:
# Очистка кэша yum/dnf
sudo yum clean all # или sudo dnf clean all
# Удаление старых ядер (осторожно!)
package-cleanup --oldkernels --count=2
# Или вручную: rpm -qa kernel | sort -V | head -n -2 | xargs sudo yum remove -y
Для Arch Linux:
sudo pacman -Sc # Очистка кэша установленных пакетов (старые версии)
sudo pacman -Scc # Очистить ВЕСЬ кэш (включая текущие) — не рекомендуется для производительности
2. Логи приложений и системы
Логи в /var/log могут бесконечно расти, особенно если есть ошибки в сервисах.
# Просмотр размера логов
sudo du -sh /var/log/*
# Безопасное удаление старых сжатых логов (например, .gz файлов старше 30 дней)
sudo find /var/log -name "*.gz" -type f -mtime +30 -delete
# Удаление старых неархивированных логов (осторожно!)
sudo find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;
💡 Совет: Лучше не удалять, а архивировать старые логи (
gzip) или настроить logrotate (обычно уже настроен). Проверьте конфиг в/etc/logrotate.confи/etc/logrotate.d/.
3. Временные файлы и кэш пользователей
# Очистка /tmp (часто безопасно, но могут быть временно используемые файлы)
sudo rm -rf /tmp/* /tmp/.* 2>/dev/null
# Кэш текущего пользователя (браузеры, приложения)
rm -rf ~/.cache/*
⚠️ Важно: Не удаляйте файлы в
/tmpи~/.cache, если не уверены, что они не используются текущими процессами. Лучше перезагрузить систему для очистки/tmp.
4. Большие файлы, найденные через ncdu или find
Найдите файлы больше 100 МБ:
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{ print $5, $9 }' | sort -rh
Проверьте, можно ли их удалить или архивировать. Частые кандидаты:
- Дампы баз данных (
*.sql,*.sqlite). - Изображения Docker (
/var/lib/docker/overlay2,/var/lib/docker/containers). - Файлы резервных копий (
*.bak,*.backup). - Изолированные диски виртуальных машин (
*.qcow2,*.vmdk).
🛠️ Шаг 4: Специфичные случаи
Docker / Podman
Контейнеры и образы могут занимать гигантские объемы.
# Просмотр占用-го места
docker system df
# Очистка неиспользуемых данных (образы, контейнеры, сети, тома)
docker system prune -a --volumes
# Более безопасно: только остановленные контейнеры и dangling образы
docker container prune
docker image prune
Базы данных (MySQL/PostgreSQL)
Удаление старых логов бинарных журналов (binlogs) или дампов.
- MySQL:
PURGE BINARY LOGS BEFORE '2026-01-01 00:00:00';(выполнить в клиенте mysql). - PostgreSQL: Настройка
archive_cleanup_commandили удаление старых файлов вpg_wal/pg_xlog.
Старые ядра Linux
Оставьте только текущее загруженное ядро и, возможно, одно предыдущее для резерва.
# Для Ubuntu/Debian (узнайте текущее ядро)
uname -r
# Удалите ВСЕ остальные через apt (смотрите список из п.3.1)
🚨 Шаг 5: Что делать, если место не освобождается?
Иногда df показывает свободное место, а система всё равно пишет «No space left». Это может быть из-за:
- Заполнения inodes:
df -i. Решение — удалить миллионы мелких файлов (например, старые сессии в/var/lib/php/sessions). - Резервирование места root: В ext4 по умолчанию 5% резервируется для root-пользователя. Для диска 1 ТБ это 50 ГБ, которые обычный пользователь не может занять, но
dfпокажет их как использованные. Проверьтеtune2fs -l /dev/sda1 | grep 'Reserved block count'. Уменьшить можно:sudo tune2fs -m 1 /dev/sda1(оставить 1%). - Занятые удалённые (deleted) файлы: Файл удалён, но процесс ещё держит его дескриптор. Найти:
lsof | grep '(deleted)'. Решение — перезапустить процесс или завершить его.
📈 Шаг 6: Профилактика и мониторинг
Чтобы проблема не повторялась:
- Настройте мониторинг: Добавьте в
cron(например,/etc/cron.weekly/disk-check) скрипт:#!/bin/bash THRESHOLD=90 df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $6 }' | while read output; do usep=$(echo $output | awk '{ print $1 }' | cut -d'%' -f1) partition=$(echo $output | awk '{ print $2 }') if [ $usep -ge $THRESHOLD ]; then echo "Внимание: раздел $partition заполнен на $usep% на $(hostname)!" | mail -s "Диск почти полный" admin@example.com fi done - Настройте logrotate: Убедитесь, что он активен и сжимает логи (
compress), удаляет старые (rotate 4). - Ограничьте размер логов приложений: Для nginx, apache, mysql настройте ротацию в их конфигах.
- Регулярно чистите кэш: Добавьте
apt-get cleanилиyum clean allв еженедельный cron. - Используйте
ncduдля периодической ручной проверки «горячих» точек:/var,/home,/usr.
❓ Часто задаваемые вопросы
Q: Можно ли просто удалить всё в /tmp?
A: В большинстве случаев да, особенно после перезагрузки. Но если система работает давно без перезагрузки, некоторые приложения могут хранить там временные файлы. Лучше удалять только старые (
find /tmp -type f -mtime +7 -delete) или перезагрузиться.
Q: После очистки df показывает свободное место, но приложения всё равно падают с ошибкой «no space».
A: Проверьте inodes (
df -i). Также проверьте, не занято ли место под резерв root (см. Шаг 5). Или есть ли занятые удалённые файлы (lsof | grep deleted).
Q: Безопасно ли удалять файлы в /var/lib/docker?
A: Нет, напрямую — никогда! Используйте только команды Docker:
docker system prune -a. Прямое удаление файлов в/var/lib/dockerприведёт к неработоспособности контейнеров и повреждению данных.
Q: Как автоматически удалять старые файлы в какой-то папке?
A: Используйте
findсcron. Пример: удалить файлы в/backupстарше 30 дней:find /backup -type f -mtime +30 -delete. Добавьте в crontab (crontab -e):0 2 * * * /usr/bin/find /backup -type f -mtime +30 -delete.
Q: Почему du показывает меньше места, чем df?
A: Потому что
duне учитывает:
- Файлы, удалённые, но ещё открытые процессами.
- Резервирование места для root (в ext4).
- Скрытые системные файлы (если не запущен с
sudoи есть доступные только root каталоги).
Выполнив этот гайд, вы не только оперативно решите проблему «диск полный», но и получите инструменты для её предотвращения в будущем. Ключевой принцип: регулярный мониторинг и понимание, что занимает место на вашем сервере.