← Назад к вопросам

Как освободить место на диске без рестарта сервиса

1.8 Middle🔥 221 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стратегия освобождения места на диске без рестарта сервисов

Освобождение места на диске без рестарта критически важно для обеспечения непрерывности работы сервисов. Вот комплексный подход, который я применяю на практике.

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.

Критически важное предупреждение

Перед массовым удалением ВСЕГДА:

  1. Убедитесь в резервных копиях критических данных.
  2. Проверьте, не используются ли файлы в данный момент (lsof | grep filename).
  3. По возможности очищайте файлы через усечение (truncate) или перезапись логики самого приложения, а не просто rm.
  4. Самый безопасный способ освободить место под логами — ротация (logrotate) с последующей компрессией и отправкой в архивное хранилище.

Таким образом, освобождение места — это комбинация оперативного реагирования (анализ du/df, очистка кэшей, работа с lsof) и грамотной профилактики (партиционирование, квоты, мониторинг, политики хранения).