Почему переполняется диск на сервере и как найти "скрытые" файлы?
Приветствую, друзья!
Внезапное переполнение дискового пространства на Linux-сервере — одна из самых частых причин аварийных сбоев. Проблема даже приводит к остановке баз данных, сбоям в работе веб-серверов и зависанию процессов.
Часто администраторы сталкиваются с парадоксальной ситуацией: стандартные утилиты отображают 100% занятого места, но визуальный просмотр папок не показывает крупных файлов. В этом руководстве мы разберем системные причины утечки дискового пространства и научимся находить «скрытые» данные. Используя данный гайд, вы сможете увеличить свободное дисковое пространство и избежать возможного отключения сервисов.
Key Takeaways: Ключевые выводы
Удаленные, но открытые файлы (Deleted Open Files): Если удалить логирующий файл, который в этот момент активно пишется процессом (например, Nginx или MySQL), место на диске не освободится, пока процесс не будет перезапущен или закрыт.
Закончились Inode (индексные дескрипторы): Диск может заблокироваться даже при наличии свободных гигабайт, если система исчерпала лимит на количество созданных файлов (например, из-за миллионов мелких сессий PHP или кэша).
Скрытые точки монтирования: Если смонтировать новый диск или раздел поверх существующей директории с файлами, старые данные «скроются» под новым монтированием и продолжат занимать место.
5 главных причин «невидимой» утечки дискового пространства
1. Открытые дескрипторы удаленных файлов (Unlinked Open Files)
Когда вы удаляете файл командой rm, удаляется лишь запись из файловой системы. Если какой-либо процесс (например, systemd-journald, nginx или mysqld) держит этот файл открытым, операционная система не освобождает блоки на диске.
Как найти и исправить: Найдите «зависшие» файлы с помощью утилиты lsof:
sudo lsof +L1
Или альтернативной командой:
sudo lsof | grep deleted
В выводе вы увидите PID процесса и размер удерживаемого файла. Чтобы освободить место без перезагрузки всего сервера, достаточно перезапустить конкретный процесс:
sudo systemctl restart <service_name>
2. Исчерпание Inode (Индексных дескрипторов)
Файловая система Linux хранит метаданные о каждом файле в специальной структуре — Inode. Их количество фиксируется при форматировании диска. Если на сервере сгенерировались миллионы мелких файлов (кэш, файлы сессий, мелкие логи), Inode заканчиваются, и система выдает ошибку записи, несмотря на свободные гигабайты.
Как найти и исправить: Проверьте статус Inode командой:
df -i
Если значение IUse% достигает 100%, найдите директорию с наибольшим количеством файлов:
sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -nr | head -n 10
Очистите найденные папки с мелким кэшем или временными файлами.
3. Заполненный Journald и логи системных служб
Ротация логов (logrotate) может дать сбой, или стандартный журнал systemd заполнит гигабайты диска детальными отчетами об ошибках (debug logs).
Как найти и исправить: Проверьте объем, занимаемый журналами systemd:
journalctl --disk-usage
Безопасно уменьшите объем логов, оставив, например, только последние 500 МБ:
sudo journalctl --vacuum-size=500M
4. Забытые Docker-контейнеры, образы и Volumes
Среда Docker активнее всего незаметно забивает диски. Неиспользуемые образы (dangling images), остановленные контейнеры и анонимные тома (volumes) могут накапливать десятки гигабайт.
Как найти и исправить: Оцените использование диска Docker:
docker system df
Выполните безопасную глубокую очистку неиспользуемых ресурсов Docker:
docker system prune -a --volumes
5. Файлы, «спрятанные» под точкой монтирования
Если в директорию /mnt/data записали 50 ГБ файлов, а затем в эту же папку /mnt/data смонтировали отдельный новый диск, исходные 50 ГБ станут невидимы для стандартных утилит, но продолжат занимать место на основном файловом разделе /.
Как найти: Проверьте размер исходного раздела, временно смонтировав корневую файловую систему в альтернативную точку (bind mount):
sudo mount --bind / /mnt/root_check
sudo du -sh /mnt/root_check/mnt/data
sudo umount /mnt/root_check
Чек-лист: Быстрый поиск гигантских файлов на сервере
Если место закончилось прямо сейчас, выполните эти команды по шагам для локализации проблемы:
Проверьте общий объем разделов и Inode:
Bashdf -h df -iНайдите ТОП-10 самых больших файлов на сервере:
Bashsudo find / -xdev -type f -size +100M -exec ls -lh {} \; | awk '{ print $5, $9 }' | sort -n -r | head -n 10Используйте интерактивный сканер
ncdu: Установите легкую утилитуncduдля визуального анализа папок:Bashsudo apt install ncdu -y # Ubuntu/Debian sudo dnf install ncdu -y # AlmaLinux/Rocky sudo ncdu -x /(Флаг
-xуказывает утилите оставаться в пределах одной файловой системы и не сканировать смонтированные сетевые диски).
FAQ: Часто задаваемые вопросы
Почему команда
duиdfпоказывают разный объем занятого места? Командаdf(Disk Free) опрашивает ядро и учитывает все заблокированные блоки (включая удаленные файлы, которые удерживаются процессами). Командаdu(Disk Usage) рекурсивно проходит по дереву каталогов и считает только физически существующие файлы. Разница между их показателями — это объем «удаленных, но открытых» файлов.Можно ли очищать логи командой
rm? Не рекомендуется просто удалять активные.logфайлы черезrm, так как сервис продолжит писать в удаленный дескриптор. Правильнее обнулять содержимое файла без его удаления:Bashsudo truncate -s 0 /var/log/nginx/access.logЧто делать, если место переполняется постоянно за считанные часы? Настройте мониторинг процесса с помощью
fatraceили встроенной утилитыauditd, чтобы отследить, какой именно процесс в реальном времени совершает аномальный объем дисковой записи (Disk I/O).
Заключение
Переполнение диска — это всегда следствие недостаточного контроля за автоматическими процессами: ротацией логов, очисткой временных данных и заполнением баз данных. Настройка правильной конфигурации logrotate, периодическая сборка мусора Docker (prune) и быстрый поиск открытых дескрипторов позволяют предотвратить 99% аварийных остановок.
Однако для критически важных сервисов и растущих проектов важную роль играет запас дисковой подсистемы и возможность оперативного масштабирования хранилища без простоя.
Если вашему проекту требуется гибкая инфраструктура с гарантированными ресурсами, оцените NVMe VPS от MivoCloud. Мы предоставляем быстрое расширение дискового пространства в пару кликов, чистую KVM-виртуализацию и высокоскоростные Enterprise NVMe-накопители, устойчивые к высоким нагрузкам I/O.
Автор статьи: Anatolie Cohaniuc

