Почему место на диске может не освобождаться после удаления файла в Linux?

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

Ответ

Чаще всего я сталкиваюсь с этой проблемой, когда файл удалён, но дескриптор этого файла всё ещё удерживается работающим процессом. Пока процесс не закроет файл, система не освободит занимаемое им дисковое пространство. Это типично для лог-файлов приложений (например, 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): Место может быть занято другими файлами пользователя, достигшего своей квоты.