Три часа ночи. Ваш сервер начинает тормозить. Логи не пишутся. База данных отказывается принимать новые записи. Панель мониторинга светится красным. Первая мысль: «DDoS? Взлом? Отказ железа?»
А потом вы открываете консоль и видите простое, но убийственное сообщение: "No space left on device".
Диск забит. Полностью. И теперь у вас есть ровно несколько минут, чтобы найти проблему, освободить место и вернуть систему к жизни до того, как пользователи начнут замечать проблемы.
Звучит знакомо? Тогда эта статья для вас. Сегодня разберём, как быстро диагностировать проблемы с дисковым пространством в Linux, найти файлы-пожиратели места и настроить систему так, чтобы больше никогда не просыпаться от подобных сюрпризов.
Переполненный диск — это не просто неудобство. Это серьёзная проблема, которая может привести к:
По статистике системных администраторов, около 15% всех инцидентов в production-среде связаны с проблемами дискового пространства. И самое обидное — большинство из них можно было предотвратить простым мониторингом.
Команда df (disk free) — это ваш первый инструмент для оценки ситуации. Она показывает общую картину использования дискового пространства во всех смонтированных файловых системах.
Самый простой способ проверить диск:
df -h
Флаг -h (human-readable) показывает размеры в удобном для человека формате — гигабайтах и мегабайтах вместо килобайтных блоков.
Пример вывода:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 42G 8.0G 85% /
/dev/sdb1 200G 180G 20G 90% /var/www
tmpfs 7.8G 120K 7.8G 1% /dev/shm
/dev/sda1 — первый раздел первого диска).Вот на что нужно обращать внимание:
Важный нюанс: Linux резервирует 5% места на корневом разделе для системных процессов и root-пользователя. Поэтому даже при показателях в 95% у вас уже могут возникать проблемы с записью для обычных пользователей.
Проверить конкретную директорию:
df -h /var/log
Эта команда покажет информацию о файловой системе, на которой находится /var/log.
Посмотреть тип файловой системы:
df -Th
Добавляет колонку с типом ФС (ext4, xfs, btrfs и т.д.). Полезно, когда у вас несколько разных типов файловых систем.
Проверить использование inodes:
df -ih
Inode — это специальная структура данных, которая хранит метаинформацию о каждом файле. Можно исчерпать inodes, даже если на диске ещё есть место. Это происходит, когда у вас миллионы мелких файлов (например, кеш, логи, почтовые ящики).
Признак проблемы: диск показывает свободное место, но система жалуется на его отсутствие. В этом случае проверяйте inodes.
Команда df показала, что диск забит. Отлично. Но что именно занимает всё место? Для этого используется команда du (disk usage).
Вот команда, которую я использую чаще всего для быстрой диагностики:
du -h --max-depth=1 / | sort -hr | head -20
Разберём, что здесь происходит:
du -h --max-depth=1 / — показывает размер всех директорий на глубине 1 уровня от корня.sort -hr — сортирует результаты по размеру (от большего к меньшему).head -20 — показывает только топ-20 самых больших.Пример вывода:
42G /var
15G /usr
8.5G /home
2.1G /opt
850M /tmp
Теперь вы сразу видите, что проблема в /var. Идём глубже:
du -h --max-depth=1 /var | sort -hr | head -20
И так далее, пока не найдёте конкретную директорию или файл, который съел всё место.
Иногда проблема не в количестве файлов, а в одном-двух гигантских файлах. Например, забытый дамп базы данных или раздувшийся лог-файл.
Найти все файлы больше 1 ГБ:
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null
Или еще удобнее — найти 20 самых больших файлов в системе:
find / -type f -exec du -h {} \; 2>/dev/null | sort -rh | head -20
Внимание: эта команда может работать долго на больших файловых системах. Лучше сначала ограничить поиск конкретной директорией:
find /var -type f -size +1G -exec ls -lh {} \; 2>/dev/null
В 80% случаев проблемы с дисковым пространством виноваты логи. Особенно если:
Проверьте размер директории с логами:
du -sh /var/log
И посмотрите на отдельные файлы:
du -h /var/log/* | sort -rh | head -10
Проблема: Один файл лога занял 30 ГБ из 50.
Быстрое решение:
НЕ удаляйте файл! Это может сломать приложение.
Вместо этого очистите его содержимое: /var/log/application.log
Или урежьте до последних 1000 строк:
tail -n 1000 /var/log/application.log > /tmp/temp.log
mv /tmp/temp.log /var/log/application.log
Долгосрочное решение: Настройте logrotate для автоматической ротации:
/etc/logrotate.d/application
/var/log/application.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 www-data www-data
}
Проблема: Кеш-директория содержит миллионы файлов по 1-2 КБ каждый.
Диагностика:
Посчитать количество файлов:
find /var/cache/application -type f | wc -l
Если там больше 100 000 файлов — это, скорее всего, ваша проблема.
Быстрое решение.
Удалить файлы старше 7 дней:
find /var/cache/application -type f -mtime +7 -delete
Или удалить всё:
rm -rf /var/cache/application/*
Проблема: Старые бэкапы занимают 150 ГБ.
Диагностика:
du -sh /var/backups
ls -lht /var/backups | head
Решение: Удалите старые бэкапы и настройте автоматическую очистку.
Оставить только последние 5 бэкапов:
cd /var/backups
ls -t | tail -n +6 | xargs rm -f
Или удалить бэкапы старше 30 дней:
find /var/backups -type f -name "*.sql.gz" -mtime +30 -delete
Проблема: Docker накопил гигабайты неиспользуемых образов, контейнеров и volumes.
Диагностика:
docker system df
Быстрая очистка.
Удалить остановленные контейнеры, неиспользуемые сети и образы:
docker system prune -a
Удалить всё, включая volumes (ОСТОРОЖНО!):
docker system prune -a --volumes
Проблема: Вы удалили огромный лог-файл, но место не освободилось.
Причина: Если процесс держит файл открытым, место не освободится до перезапуска процесса.
Решение: Найдите процесс, который держит удалённый файл:
lsof | grep deleted
И перезапустите этот процесс.
Проблема: Удалили всё в /tmp, сломали работающие приложения.
Правильный способ: Удаляйте только старые файлы:
find /tmp -type f -atime +10 -delete
Даже при показателях df в 90%, для обычных пользователей может не быть свободного места из-за 5% резерва для root.
Решение: Уменьшите резерв на не-системных разделах.
Уменьшить резерв с 5% до 1% поможет:
tune2fs -m 1 /dev/sdb1
Проблема: Команда find - грузит диск и замедляет систему.
Решение: Используйте ionice для понижения приоритета:
ionice -c3 find / -type f -size +1G
ncdu — это интерактивный анализатор дискового пространства с удобным интерфейсом:
Установка:
apt install ncdu # Debian/Ubuntu
yum install ncdu # CentOS/RHEL
Использование:
ncdu /var
Вы получите интерактивный список директорий с возможностью навигации стрелками и удаления файлов прямо из интерфейса.
Найти самые большие директории в /var с подробностями:
du -ah /var | sort -rh | head -20
Найти файлы, изменённые за последние 24 часа и занимающие больше 100 МБ:
find /var -type f -mtime -1 -size +100M -exec ls -lh {} \;
Показать топ-10 директорий по количеству файлов:
for dir in /var/*/; do
echo -n "$dir: ";
find "$dir" -type f | wc -l;
done | sort -t: -k2 -rn | head -10
Смотреть, какие файлы изменяются прямо сейчас:
watch -n 1 'df -h; echo "---"; du -sh /var/*'
Или установите iotop для мониторинга дисковой активности:
apt install iotop
Показывать только активные процессы:
iotop -o
No space left" или "Disk quota exceeded".Убедитесь, что logrotate настроен правильно.
Проверить конфигурацию:
cat /etc/logrotate.conf
ls /etc/logrotate.d/
Протестировать ротацию в dry-run режиме:
logrotate -d /etc/logrotate.conf
Добавьте в cron ежедневную очистку.
Очищать файлы старше 7 дней:
0 3 * * * find /tmp -type f -atime +7 -delete
Если используете Docker, настройте автоматическую очистку.
Добавьте в cron еженедельную очистку:
0 2 * * 0 docker system prune -f
Проблемы с дисковым пространством — одна из самых частых причин сбоев в Linux-системах. Но при правильном подходе их легко предотвратить:
df -h.du для быстрого поиска проблемных директорий.Помните: гораздо проще потратить 10 минут на настройку мониторинга, чем час на аварийную очистку диска в три часа ночи.
Хотите хостинг, где о дисковом пространстве можно не беспокоиться?
THE.Hosting предлагает VPS и выделенные серверы с NVMe RAID 10 и возможностью быстрого масштабирования. Закончилось место? Увеличьте диск за пару кликов без простоя системы.