Ответ
Эта ситуация часто возникает из-за того, что удаленный файл все еще остается открытым каким-либо процессом. Пока файловый дескриптор процесса активен, ядро не освобождает дисковое пространство, занятое этим файлом, даже после его удаления из файловой системы (это называется "deleted but held open"). Команда df показывает использование пространства с точки зрения файловой системы, которая считает эти блоки все еще занятыми.
Как это диагностировать и исправить:
-
Найти процесс, удерживающий удаленный файл. Используйте утилиту
lsof(list open files).# Поиск удаленных, но все еще открытых файлов $ lsof +L1 | grep '/mount/point' # Файлы с количеством ссылок <1 # Или более конкретно $ lsof /mount/point | grep deletedВывод покажет PID и команду процесса.
-
Освободить пространство. Есть два основных пути:
- Перезапустить процесс-владелец: Это самый чистый способ. Найдите сервис (например,
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, которые также могут "держать" данные.