Почему удаление файлов в Linux не освобождает место на диске
Почему удаление файла через rm не всегда освобождает место на диске
Вы столкнулись с ситуацией: удалили огромный лог-файл командой rm, но утилита df -h по-прежнему показывает, что диск заполнен? Это распространенная проблема, с которой сталкивается каждый системный администратор. Понимание того, как Linux управляет файловой системой, поможет вам избежать подобных инцидентов.
Что такое inode?
В Linux файловая система использует inode (индексные дескрипторы). Inode — это структура данных, хранящая метаданные файла: права доступа, владельца, размер, временные метки и указатели на физические блоки данных на диске. Имя файла — это лишь запись в директории, которая связывает имя с конкретным inode.
Как работает команда rm
Команда rm удаляет запись имени файла из директории и уменьшает счетчик ссылок (link count) на соответствующий inode. Ядро операционной системы освобождает блоки данных на диске только в том случае, если счетчик ссылок равен нулю и файл не открыт ни одним процессом.
Причины того, что место остается занятым
Если процесс (например, веб-сервер Nginx) в данный момент ведет запись в файл, дескриптор файла остается открытым. В этом случае счетчик ссылок не обнуляется. Файл становится «невидимым» для команд типа ls, но данные продолжают занимать место на диске, пока процесс не закроет дескриптор.
Как найти «зависший» файл
Чтобы выявить процессы, которые продолжают удерживать удаленные файлы, воспользуйтесь командой:
lsof | grep deleted
Эта команда покажет список процессов, которые все еще используют файлы, помеченные как удаленные.
Как исправить ситуацию без перезапуска сервиса
Если вы не хотите перезагружать приложение, можно принудительно очистить содержимое открытого файла через дескриптор. Узнайте PID процесса и номер файлового дескриптора (FD) из вывода предыдущей команды, а затем выполните:
: > /proc/<PID>/fd/<FD>
Лучшие практики для администратора
Никогда не удаляйте активные файлы логов командой rm. Вместо этого используйте:
- Команду logrotate для автоматизации ротации.
- Команду
truncate -s 0 <имя_файла>для очистки содержимого без удаления самого файла.
Помните: файл в Linux — это сочетание inode, имени и открытых дескрипторов. Удаление имени не гарантирует немедленного освобождения дискового пространства.