Как освободить место на диске без рестарта сервиса
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Стратегия освобождения места на диске без рестарта сервисов
Освобождение места на диске без рестарта критически важно для обеспечения непрерывности работы сервисов. Вот комплексный подход, который я применяю на практике.
1. Диагностика и анализ использования диска
Первым делом необходимо точно определить, что занимает место.
# Просмотр общего использования диска
df -h
# Детальный анализ больших директорий (отсортировано по размеру)
du -sh /* 2>/dev/null | sort -rh | head -20
# Альтернатива: использование ncdu (более наглядный инструмент)
ncdu / --exclude /mnt --exclude /proc
Ключевые точки анализа:
- /var/log/ — логи приложений и системы часто разрастаются.
- /tmp/ и /var/tmp/ — временные файлы.
- Docker/контейнеры:
/var/lib/docker— образы, контейнеры, volumes. - Кэш пакетов:
/var/cache/apt/(Debian/Ubuntu) или/var/cache/yum/(RHEL/CentOS). - Неиспользуемые ядра в
/boot. - Большие файлы (например, core-дампы):
find / -type f -size +100M 2>/dev/null | xargs ls -lh.
2. Целевая очистка без остановки сервисов
Логи и временные файлы
# Ротация и очистка логов (logrotate уже должен быть настроен, но можно запустить вручную)
logrotate -f /etc/logrotate.conf
# Безопасное удаление старых лог-файлов (например, старше 30 дней)
find /var/log -name "*.log" -type f -mtime +30 -delete
# Очистка временных директорий (убедитесь, что файлы не используются)
find /tmp -type f -atime +7 -delete
find /var/tmp -type f -atime +30 -delete
Docker и контейнеры
# Удаление остановленных контейнеров, неиспользуемых сетей, образов и build-кэша
docker system prune -af
# Более агрессивная очистка ВСЕГО неиспользуемого (включая volumes, требует подтверждения)
docker system prune -af --volumes
# Удаление конкретно "висячих" volumes
docker volume ls -qf dangling=true | xargs -r docker volume rm
Кэш пакетных менеджеров
# Для APT (Debian/Ubuntu)
apt-get clean
apt-get autoclean
# Для YUM/DNF (RHEL/CentOS/Fedora)
yum clean all
dnf clean all
Очистка кэша в памяти (PageCache, Dentries, Inodes)
Это освобождает не дисковое, а оперативной памяти пространство, но может помочь косвенно, если система активно свопится.
# Безопасно, не затрагивает данные приложений
sync; echo 3 > /proc/sys/vm/drop_caches
3. Работа с утилитой lsof для удаления удалённых (deleted) файлов
Частая проблема: файл удалён, но процесс держит его дескриптор, и место не освобождается.
# Поиск открытых дескрипторов удалённых файлов
lsof +L1 | grep -i deleted
# Пример вывода и решение:
# java 1234 user 44u REG 254,0 1073741824 0 /var/log/app.log (deleted)
# Здесь процесс с PID 1234 держит открытым удалённый файл размером 1GB.
# Решения (в порядке предпочтения):
# 1. Остановить и перезапустить КОНКРЕТНЫЙ проблемный сервис (если это допустимо):
systemctl restart application.service
# 2. Отправить сигнал на переоткрытие логов (например, для демонов, поддерживающих SIGUSR1):
kill -USR1 1234
# 3. В крайнем случае - очистить файловый дескриптор через /proc (риск потери данных!):
cat /dev/null > /proc/1234/fd/44
4. Мониторинг и автоматизация
Чтобы не доводить до критического состояния, настройте:
- Alerting в Prometheus/Grafana или Zabbix на использование диска >80-85%.
- Cron-задачи для регулярной очистки кэшей и старых логов.
- Квоты (disk quotas) для пользователей и приложений.
- Автоматический вызов
logrotateс настройкойmaxsizeиmaxage.
5. Архитектурные меры и профилактика
- Выделение отдельных партиций под
/var,/var/log,/home. Это предотвращает заполнение корневой файловой системы логами приложения. - Использование отдельного диска или LVM для данных, которые могут расти. В LVM можно динамически добавлять место.
- **Настройка корректного retention policy для логов (используйте ELK/Splunk или cloud-решения для long-term хранения).
- Для Docker настройте драйвер хранения (
overlay2) с параметромstorage-opt(dm.basesize) и регулярно чистите черезdocker system pruneв cron.
Критически важное предупреждение
Перед массовым удалением ВСЕГДА:
- Убедитесь в резервных копиях критических данных.
- Проверьте, не используются ли файлы в данный момент (
lsof | grep filename). - По возможности очищайте файлы через усечение (
truncate) или перезапись логики самого приложения, а не простоrm. - Самый безопасный способ освободить место под логами — ротация (logrotate) с последующей компрессией и отправкой в архивное хранилище.
Таким образом, освобождение места — это комбинация оперативного реагирования (анализ du/df, очистка кэшей, работа с lsof) и грамотной профилактики (партиционирование, квоты, мониторинг, политики хранения).