Ответ
Чаще всего я сталкиваюсь с этой проблемой, когда файл удалён, но дескриптор этого файла всё ещё удерживается работающим процессом. Пока процесс не закроет файл, система не освободит занимаемое им дисковое пространство. Это типично для лог-файлов приложений (например, app.log), которые были «ротированы» (переименованы) и удалены, но само приложение продолжает писать в старый дескриптор.
Как диагностировать и решить:
# 1. Найти процессы, удерживающие удалённые (deleted) файлы
sudo lsof +L1
# Или более конкретно:
sudo lsof | grep deleted
# Пример вывода:
# java 12345 user 1w REG 8,1 2.1G 1234567 /var/log/app.log (deleted)
# 2. Освободить место. Варианты:
# а) Перезапустить процесс-владелец (если это безопасно):
sudo systemctl restart myapp.service
# б) Очистить место, обнулив файл через дескриптор (более безопасно, чем kill):
sudo truncate -s 0 /proc/12345/fd/1 # где 1 - это FD из вывода lsof
Другие причины из практики DevOps:
- Docker/контейнеры: Удаление файлов внутри запущенного контейнера не освобождает место на хосте. Нужно останавливать контейнеры и очищать данные через
docker system prune -a --volumes. - Монтирования (mount): Файл может находиться на отдельном смонтированном разделе или томе. Удаление не освобождает место на корневом разделе.
- Жёсткие ссылки (hard links): Удаление одной ссылки на файл не удалит данные, пока существует хотя бы одна оставшаяся ссылка. Проверить можно через
find / -samefile /path/to/file. - Квоты диска (disk quotas): Место может быть занято другими файлами пользователя, достигшего своей квоты.