Почему переполняется диск на сервере и как найти "скрытые" файлы?

Giteqa

Приветствую, друзья!

Внезапное переполнение дискового пространства на Linux-сервере — одна из самых частых причин аварийных сбоев. Проблема даже приводит к остановке баз данных, сбоям в работе веб-серверов и зависанию процессов.

Часто администраторы сталкиваются с парадоксальной ситуацией: стандартные утилиты отображают 100% занятого места, но визуальный просмотр папок не показывает крупных файлов. В этом руководстве мы разберем системные причины утечки дискового пространства и научимся находить «скрытые» данные. Используя данный гайд, вы сможете увеличить свободное дисковое пространство и избежать возможного отключения сервисов.

Key Takeaways: Ключевые выводы

  • Удаленные, но открытые файлы (Deleted Open Files): Если удалить логирующий файл, который в этот момент активно пишется процессом (например, Nginx или MySQL), место на диске не освободится, пока процесс не будет перезапущен или закрыт.

  • Закончились Inode (индексные дескрипторы): Диск может заблокироваться даже при наличии свободных гигабайт, если система исчерпала лимит на количество созданных файлов (например, из-за миллионов мелких сессий PHP или кэша).

  • Скрытые точки монтирования: Если смонтировать новый диск или раздел поверх существующей директории с файлами, старые данные «скроются» под новым монтированием и продолжат занимать место.

5 главных причин «невидимой» утечки дискового пространства

1. Открытые дескрипторы удаленных файлов (Unlinked Open Files)

Когда вы удаляете файл командой rm, удаляется лишь запись из файловой системы. Если какой-либо процесс (например, systemd-journald, nginx или mysqld) держит этот файл открытым, операционная система не освобождает блоки на диске.

Как найти и исправить: Найдите «зависшие» файлы с помощью утилиты lsof:

Bash
sudo lsof +L1

Или альтернативной командой:

Bash
sudo lsof | grep deleted

В выводе вы увидите PID процесса и размер удерживаемого файла. Чтобы освободить место без перезагрузки всего сервера, достаточно перезапустить конкретный процесс:

Bash
sudo systemctl restart <service_name>

2. Исчерпание Inode (Индексных дескрипторов)

Файловая система Linux хранит метаданные о каждом файле в специальной структуре — Inode. Их количество фиксируется при форматировании диска. Если на сервере сгенерировались миллионы мелких файлов (кэш, файлы сессий, мелкие логи), Inode заканчиваются, и система выдает ошибку записи, несмотря на свободные гигабайты.

Как найти и исправить: Проверьте статус Inode командой:

Bash
df -i

Если значение IUse% достигает 100%, найдите директорию с наибольшим количеством файлов:

Bash
sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -nr | head -n 10

Очистите найденные папки с мелким кэшем или временными файлами.

3. Заполненный Journald и логи системных служб

Ротация логов (logrotate) может дать сбой, или стандартный журнал systemd заполнит гигабайты диска детальными отчетами об ошибках (debug logs).

Как найти и исправить: Проверьте объем, занимаемый журналами systemd:

Bash
journalctl --disk-usage

Безопасно уменьшите объем логов, оставив, например, только последние 500 МБ:

Bash
sudo journalctl --vacuum-size=500M

4. Забытые Docker-контейнеры, образы и Volumes

Среда Docker активнее всего незаметно забивает диски. Неиспользуемые образы (dangling images), остановленные контейнеры и анонимные тома (volumes) могут накапливать десятки гигабайт.

Как найти и исправить: Оцените использование диска Docker:

Bash
docker system df

Выполните безопасную глубокую очистку неиспользуемых ресурсов Docker:

Bash
docker system prune -a --volumes

5. Файлы, «спрятанные» под точкой монтирования

Если в директорию /mnt/data записали 50 ГБ файлов, а затем в эту же папку /mnt/data смонтировали отдельный новый диск, исходные 50 ГБ станут невидимы для стандартных утилит, но продолжат занимать место на основном файловом разделе /.

Как найти: Проверьте размер исходного раздела, временно смонтировав корневую файловую систему в альтернативную точку (bind mount):

Bash
sudo mount --bind / /mnt/root_check
sudo du -sh /mnt/root_check/mnt/data
sudo umount /mnt/root_check

Чек-лист: Быстрый поиск гигантских файлов на сервере

Если место закончилось прямо сейчас, выполните эти команды по шагам для локализации проблемы:

  1. Проверьте общий объем разделов и Inode:

    Bash
    df -h
    df -i
    
  2. Найдите ТОП-10 самых больших файлов на сервере:

    Bash
    sudo find / -xdev -type f -size +100M -exec ls -lh {} \; | awk '{ print $5, $9 }' | sort -n -r | head -n 10
    
  3. Используйте интерактивный сканер ncdu: Установите легкую утилиту ncdu для визуального анализа папок:

    Bash
    sudo 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, так как сервис продолжит писать в удаленный дескриптор. Правильнее обнулять содержимое файла без его удаления:

    Bash
    sudo 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