Слои диска Linux от блочного устройства и раздела до файловой системы и каталога
Linux

Как понять, куда пропало место на Linux-сервере

Пошагово проверяем диски Linux: lsblk, findmnt, df, du, inode, удалённые открытые файлы и безопасная очистка без риска потерять данные.

Содержание

Сообщение No space left on device не всегда означает, что закончились гигабайты. Может заполниться отдельная файловая система, закончиться inode, остаться открытым удалённый файл или переполниться каталог на неожиданной точке монтирования.

Сначала выясните, какая файловая система содержит проблемный путь. Затем отдельно проверьте занятый объём и количество inode — записей, необходимых каждому файлу и каталогу. Только после этого ищите растущий каталог и выясняйте, какая программа им управляет. Удалять журнал или расширять диск до диагноза опасно.

Четыре разных слоя

На VPS путь к данным проходит через несколько сущностей:

  1. виртуальный блочный диск;
  2. раздел или логический том;
  3. файловую систему;
  4. точку монтирования и дерево каталогов.

Увеличение размера диска в панели хостера не обязано автоматически увеличить раздел и файловую систему. Обратная ошибка тоже распространена: пользователь проверяет весь диск, хотя заполнена отдельная /var.

Постройте карту хранения

Постройте карту от дисков и разделов до каталогов. Эти команды ничего не монтируют и не меняют:

lsblk -o NAME,SIZE,TYPE,FSTYPE,FSVER,MOUNTPOINTS
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS
findmnt --target /var/www

lsblk показывает блочные устройства и их связь, findmnt — фактические монтирования. Для автоматизации явно задавайте столбцы: набор вывода по умолчанию может меняться.

Имена вроде /dev/vda1 зависят от окружения. В постоянной конфигурации монтирования обычно используют UUID или другой стабильный идентификатор, но менять /etc/fstab в рамках диагностики не нужно.

Перед очисткой сохраните время, идентификаторы файловых систем и точку монтирования нужного каталога. Этот снимок поможет сравнить результат:

date --iso-8601=seconds
lsblk -f
findmnt --target /var/www

Проверьте блоки и inode

Проверьте общий список, а затем повторите измерение для конкретного пути. Последняя команда считает не объём, а занятые inode:

df -hT
df -hT /var/www
df -i /var/www

df сообщает использование файловой системы, содержащей указанный путь. Проверка конкретного пути надёжнее просмотра случайной строки общего списка.

Высокое использование блоков означает нехватку объёма. Значение IUse% около предела означает нехватку inode — записей для файлов и каталогов. Миллионы маленьких файлов способны исчерпать inode раньше места.

Небольшой резерв свободного пространства и пороги оповещения задаются по характеру нагрузки. Не ждите ровно 100%: службе нужны место для временного файла, журнала и атомарной замены.

Найдите крупные каталоги

Ищите размер сверху вниз и оставайтесь в пределах одной файловой системы, чтобы не просканировать примонтированный backup или сетевое хранилище:

sudo du -xhd1 /var | sort -h
sudo du -xhd1 /var/lib | sort -h
sudo du -xhd1 /var/log | sort -h

-x не переходит в другие файловые системы, -d1 ограничивает глубину. Начинайте сверху и углубляйтесь только в большой каталог. Полное сканирование корня на загруженном сервере создаёт I/O и может читать чувствительные имена.

Для отдельных крупных файлов:

sudo find /var -xdev -type f -size +500M -printf '%s %p\n' | sort -n

Порог — пример. Не удаляйте результат автоматически: образ базы, swap-файл или активный журнал могут быть критичны.

Если закончились inode

Если df -i показал нехватку inode, посчитайте количество записей по каталогам первого уровня. Команда читает дерево и на большом каталоге создаёт нагрузку, поэтому запускайте её осознанно:

sudo du --inodes -x -d1 /var | sort -n

Частые источники — очереди, кеши, сессии, временные файлы и неконтролируемые логи. У каждого приложения есть собственная политика очистки. Сначала остановите источник бесконечного роста или ограничьте его штатной настройкой, затем удаляйте подтверждённо ненужные данные партиями.

Одна команда с сотнями тысяч аргументов может превысить системный лимит. Для больших наборов используйте механизм самого приложения или аккуратный find с точным каталогом, типом, возрастом и предварительным -print.

Разница между df и du

df смотрит на учёт файловой системы, du проходит видимое дерево каталогов. Они могут расходиться из-за:

  • удалённого файла, который процесс продолжает держать открытым;
  • отсутствия прав прочитать часть дерева;
  • данных под точкой монтирования;
  • служебных структур и особенностей файловой системы;
  • файлов, изменившихся во время измерения.

Найдите удалённые открытые файлы, если установлен lsof:

sudo lsof +L1

Не завершайте процесс сразу. Определите службу, проверьте журнал и выполните управляемый restart в допустимое окно. После закрытия последнего дескриптора место освободится.

Журналы и systemd journal

journalctl --disk-usage
sudo journalctl --vacuum-time=14d

Вторая команда — осознанная очистка архивных журналов старше указанного периода, а не универсальная рекомендация. Сначала убедитесь, что срок соответствует вашей диагностике и требованиям хранения. Правильное долгосрочное решение — ограничение journal, logrotate и устранение повторяющейся ошибки приложения.

Для обычных логов посмотрите конфигурацию ротации, владельца и открытые дескрипторы. Простое удаление активного файла может не освободить место и потерять данные расследования.

Что нельзя делать в спешке

  • Не запускайте rm -rf по переменной или широкому шаблону.
  • Не уменьшайте файловую систему без отдельной проверенной процедуры и backup.
  • Не редактируйте таблицу разделов, пока задача только в очистке.
  • Не форматируйте устройство, ориентируясь лишь на имя /dev/....
  • Не монтируйте новый диск поверх непустого каталога: старые данные станут невидимы, но останутся занимать место.

Изменение разделов и расширение файловой системы — отдельный продвинутый урок. Здесь цель — правильно определить слой и безопасно освободить подтверждённые данные.

Проверка после очистки

После подтверждённой очистки повторите измерения для того же пути и проверьте, что его точка монтирования не изменилась:

df -hT /var/www
df -i /var/www
findmnt --target /var/www
systemctl --failed

Затем проверьте приложение: сайт должен отвечать, база — принимать запросы, журнал — записывать новые события. Запишите, какой каталог рос, почему и какой порог мониторинга должен предупредить раньше.

Связать заполнение диска с приложением помогают диагностика процессов и ресурсов и журналы journalctl. Резервную копию храните вне этого VPS и регулярно проверяйте восстановление по процедуре monitoring и backup.

Первоисточники

  • Linux manual page: findmnt — поиск файловой системы и стабильные форматы вывода.
  • GNU Coreutils: df — использование блоков и inode файловых систем.
Рекламное местоВаша компания здесьРазместить рекламу

Самопроверка

Проверьте, что материал усвоен

Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.

01Какая команда связывает произвольный путь с его файловой системой?
02Что означает заполнение inode?
03Как безопаснее освободить место на production?

Разбираем коротко

Частые вопросы

Почему значения df и du могут различаться?

df измеряет занятое место файловой системы, а du суммирует доступные ему записи в дереве каталогов. Разницу создают удалённые, но ещё открытые файлы, права доступа, служебные данные файловой системы и точки монтирования.

Можно ли удалять файлы из /var/log вручную?

Сначала определите владельца журнала и настройку ротации. Удаление активного файла может не освободить место, пока процесс держит дескриптор, и лишит диагностики; безопаснее исправить logrotate или параметры службы.

Что делать, если закончились inode, а свободные гигабайты ещё есть?

Найдите каталоги с огромным числом мелких файлов, подтвердите назначение данных и удаляйте их штатным механизмом приложения. Увеличение объёма не заменяет контроль очередей, кешей и временных файлов.