Как команды UNIX mv и rm работают с открытыми файлами?

Если я читаю файл, хранящийся в файловой системе NTFS, и пытаюсь переместить/переименовать этот файл, пока он еще читается, я не могу этого сделать. Если я попытаюсь сделать это в файловой системе UNIX, такой как EXT3, это удастся, и процесс, выполняющий чтение, не пострадает. Я даже могу rm файл, и процессы чтения не затрагиваются. Как это работает? Может ли кто-нибудь объяснить мне, почему такое поведение поддерживается в файловых системах UNIX, но не в NTFS? У меня есть смутное ощущение, что это связано с жесткими ссылками и инодами, но я был бы признателен за хорошее объяснение.


person jl6    schedule 07.03.2011    source источник


Ответы (2)


Файловые системы Unix используют подсчет ссылок и двухуровневую архитектуру для поиска файлов.

Имя файла относится к чему-то, что называется inode, для узла информации или узла индекса. Инод хранит (указатель на) содержимое файла, а также некоторые метаданные, такие как тип файла (обычный, каталог, устройство и т. д.) и его владельца.

Несколько имен файлов могут ссылаться на один и тот же индекс; тогда они называются жесткими ссылками. Кроме того, файловый дескриптор (fd) ссылается на inode. fd — это тип объекта, который процесс получает при открытии файла.

Файл в файловой системе Unix исчезает только тогда, когда исчезает последняя ссылка на него, то есть когда больше нет имен (жестких ссылок) или fd, ссылающихся на него. Таким образом, rm на самом деле не удаляет файл; он удаляет ссылку на файл.

Эта настройка файловой системы может показаться запутанной и иногда создает проблемы (особенно с NFS), но ее преимущество заключается в том, что для многих приложений блокировка не требуется. Многие программы Unix также используют ситуацию в своих интересах, открывая временный файл и удаляя его сразу после этого. Как только они заканчиваются, даже если они завершаются с ошибкой, временный файл исчезает.

person Fred Foo    schedule 07.03.2011
comment
Существуют ли какие-либо ограничения на то, куда я могу переместить открытый файл? Например. только в пределах одной файловой системы? - person ivan_pozdeev; 09.04.2017
comment
@ivan_pozdeev, выполняющий mv для файла в разных файловых системах, фактически копирует данные и удаляет исходный файл, в данном случае это похоже на rm открытого файла. - person Daniël Sonck; 30.08.2017

В Unix имя файла — это просто ссылка на фактический файл (inode). Открытие файла также создает (временную) ссылку на фактический файл. Когда все ссылки на файл исчезли (rm и close()), файл удаляется.

В NTFS логически имя файла является файлом. Нет слоя косвенности от имени файла к метаинформации файла, это один и тот же объект. Если вы открываете его, он используется и не может быть удален, так же как фактический файл (inode) в Unix не может быть удален, пока он используется.

Unix: Имя файла ➜ Информация о файле ➜ Данные файла

NTFS: имя файла + информация о файле ➜ данные файла

person Erik    schedule 07.03.2011