Почему после удаления больших файлов команда df все еще показывает, что раздел заполнен?

«Почему после удаления больших файлов команда df все еще показывает, что раздел заполнен?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эта ситуация часто возникает из-за того, что удаленный файл все еще остается открытым каким-либо процессом. Пока файловый дескриптор процесса активен, ядро не освобождает дисковое пространство, занятое этим файлом, даже после его удаления из файловой системы (это называется "deleted but held open"). Команда df показывает использование пространства с точки зрения файловой системы, которая считает эти блоки все еще занятыми.

Как это диагностировать и исправить:

  1. Найти процесс, удерживающий удаленный файл. Используйте утилиту lsof (list open files).

    # Поиск удаленных, но все еще открытых файлов
    $ lsof +L1 | grep '/mount/point'  # Файлы с количеством ссылок <1
    # Или более конкретно
    $ lsof /mount/point | grep deleted

    Вывод покажет PID и команду процесса.

  2. Освободить пространство. Есть два основных пути:

    • Перезапустить процесс-владелец: Это самый чистый способ. Найдите сервис (например, nginx, docker, java) и перезапустите его: systemctl restart service-name.
    • Очистить файловый дескриптор вручную: Если перезапуск невозможен, можно "обнулить" открытый файл, перенаправив в него пустоту. Внимание: это может нарушить работу процесса.
      # Найдем PID (например, 1234) и файловый дескриптор (FD, например, 15w)
      $ lsof -p 1234 | grep deleted
      # Обнуляем содержимое файла через дескриптор
      $ : > /proc/1234/fd/15

      После этих действий команда df должна показать освободившееся пространство.

Другие, менее частые причины:

  • Кэши ядра: Иногда df может показывать устаревшие данные из кэша. Команда sync может помочь, но обычно проблема именно в открытых файлах.
  • Журналирование (journal) или снапшоты LVM: Убедитесь, что не работает процесс, активно пишущий в журнал, и что у вас нет активных снапшотов LVM, которые также могут "держать" данные.