Введение / Зачем это нужно
Постоянный мониторинг дискового пространства — критически важная задача для любого системного администратора или разработчика, работающего с серверами. Заполнение диска приводит к остановке служб, ошибкам записи логов и полной неработоспособности системы. Это руководство поможет вам не только диагностировать проблему, но и предотвратить её, освоив основные инструменты Linux для анализа использования диска на уровне файлов и каталогов. Вы научитесь быстро находить «пожирателей» места и принимать обоснованные решения по очистке.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к терминалу Linux (через SSH или локально).
- У вас есть права sudo (администратора) для анализа системных каталогов (
/var,/home,/usr) и использованияncdu/lsof. - Дистрибутив основан на Debian/Ubuntu или RHEL/CentOS/Fedora (команды универсальны, но названия пакетов могут отличаться).
- Вы знаете, какой именно раздел (
/,/home,/var) заполнился. Если нет — начните с первого шага.
Шаг 1: быстрый обзор состояния всех разделов
Первым делом получите общую картину. Команда df (disk free) показывает использование файловых систем/разделов.
df -h
Пример вывода:
Файл.система Размер Исп效益 Доступно Исп% Исп.на Примонтировано в
/dev/sda1 50G 45G 3.1G 94% /
/dev/sda2 200G 150G 45G 77% /home
/dev/sda3 20G 18G 1.5G 93% /var
Что смотреть:
Исп%— процент использования. Целевые кандидаты на очистку — разделы с >85%.Примонтировано в— точка монтирования. Именно в неё нужно «проваливаться» для детального анализа.
Шаг 2: детальный анализ проблемного раздела с du
Команда du (disk usage) оценивает использование каталогов. Она медленнее df, но даёт детализацию.
Правило: Анализируйте снизу вверх. Сначала обзорка верхнего уровня, затем углубление.
# 1. Перейдите в корень проблемного раздела (например, /var)
cd /var
# 2. Покажите размер каждого элемента в текущей директории в читаемом виде (-h)
# Сортировка по убыванию размера (-r) и вывод только топ-20
sudo du -sh * 2>/dev/null | sort -rh | head -n 20
Ключевые флаги:
-s— суммарный размер для каждого аргумента.-h— человеко-читаемый (K, M, G).2>/dev/null— подавление ошибок «Permission denied».
Пример вывода:
4.2G log
3.8G cache
1.2G lib
...
Вы видите, что /var/log — главный «пожиратель». Теперь нужно углубиться в него.
Шаг 3: интерактивный анализ с ncdu (рекомендуется)
Для удобства установите ncdu (NCurses Disk Usage). Это интерактивный текстовый браузер использования диска.
# Установка (Debian/Ubuntu)
sudo apt update && sudo apt install ncdu
# Установка (RHEL/CentOS 8+)
sudo dnf install ncdu
# Запуск для анализа раздела /var
sudo ncdu /var
Как работать в ncdu:
- Стрелки
↑/↓— навигация. Enter— войти в каталог.d— удалить выбранный файл/каталог (будет запрос подтверждения!).q— выйти.- Нажмите
?для полной справки.
ncdu автоматически сканирует выбранный каталог и показывает процентное отношение к общему размеру, что очень наглядно.
Шаг 4: поиск конкретных больших файлов
Иногда проблема не в каталогах, а в одном-двух огромных файлах (например, файл дампа базы данных, лог за годы, забытый архив).
# Поиск файлов больше 100МБ в /var/log и вывод топ-10 по размеру
sudo find /var/log -type f -size +100M -exec du -h {} + 2>/dev/null | sort -rh | head -n 10
# Более быстрый вариант (только имя и размер, без du)
sudo find /var/log -type f -size +100M -exec ls -lh {} + | awk '{ print $5, $9 }' | sort -rh | head -n 10
Для поиска по всему разделу (может быть долгим):
sudo find /var -type f -size +500M 2>/dev/null
Шаг 5: поиск «висячих» удалённых файлов
Ситуация: вы удалили большой файл через rm, но место не освободилось. Это происходит, если процесс всё ещё держит дескриптор удалённого файла.
# Показать все открытые удалённые (deleted) файлы в системе
sudo lsof | grep '(deleted)'
# Пример вывода:
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# java 1234 app rtd REG 8,2 10.0G 123456 /var/log/app.log (deleted)
Решение: Перезапустите процесс (PID 1234 в примере). После этого место освободится.
Шаг 6: проверка места, занятого кэшем пакетного менеджера
Для Debian/Ubuntu:
sudo apt clean # Удаляет все кэшированные .deb файлы из /var/cache/apt/archives
sudo apt autoremove # Удаляет зависимости, установленные автоматически и больше не нужные
Для RHEL/CentOS/Fedora:
sudo yum clean all # Очищает весь кэш yum/dnf
sudo package-cleanup --leaves # Показывает «осиротевшие» пакеты (требуется установка yum-utils)
Важно: Не выполняйте clean на продакшн-сервере без понимания последствий. Это ускорит будущие обновления, но может потребовать переустановки пакетов.
Проверка результата
После выполнения очищающих действий вернитесь к Шагу 1 и выполните df -h снова. Убедитесь, что Исп% для проблемного раздела снизился до безопасного уровня (рекомендуется <80%).
Также можно проверить изменение в конкретном каталоге:
du -sh /var/log
Возможные проблемы
duпоказывает меньше, чемdf?- Причина: Файлы, удалённые, но всё ещё открытые процессами (см. Шаг 5). Или использование
duбезsudo(вы не видите файлы других пользователей). - Решение: Используйте
sudo duи ищите «deleted» файлы черезlsof.
- Причина: Файлы, удалённые, но всё ещё открытые процессами (см. Шаг 5). Или использование
ncdu/findзависает или очень долгий?- Причина: Анализ огромного количества мелких файлов (например,
/proc,/sys, сетевые файловые системы). - Решение: Всегда указывайте конкретный путь для анализа (
ncdu /var), а не корень/. Исключите монтированные файловые системы флагом-x(sudo du -shx /).
- Причина: Анализ огромного количества мелких файлов (например,
- Не могу удалить файл из
ncduилиrm— «Permission denied»- Причина: Файл принадлежит другому пользователю или системному процессу.
- Решение: Используйте
sudoдля удаления (sudo rm путь/к/файлу). Будьте осторожны!
- Очистка логов не помогла — место вернулось через день
- Причина: Приложение продолжает бесконтрольно писать логи. Увеличился ли размер одного файла или появились новые?
- Решение: Настройте ротацию логов (
logrotate) для проблемного приложения. Найдите конфиг в/etc/logrotate.d/или настройте в самом приложении.