
Интересно, считается ли это безопасным. Я знаю, что дескрипторы файлов работают нормально, пока сохраняется ссылка, и я знаю, что идентификатор — это инода, а не имя, но я не уверен, как это работает в разных ФС.
Например, копирование с жесткого диска ext4 на USB-накопитель NTFS или копирование с USB-накопителя FAT на диск ext4.
Я просто копировал кучу больших медиафайлов и переименовал их перед копированием. Контрольные суммы совпадают. Интересно, всегда ли это безопасно, будет ли работать в обратном направлении, есть ли какие-то особенности, о которых мне следует знать, или причины избегать этого?
Операционная система/дистрибутив — Ubuntu с ядром Linux 5.0.0-15.
решение1
Я не уверен, как это работает в разных ФС.
Сама операция переименования не работает в разных файловых системах; нет никакой разницы между записью в файл, скажем, из текстового редактора и записью в файл с использованием cp
исходного файла в другой файловой системе.
В Linux rename
системный вызов прозрачен для других ссылок на файл, включая другие жесткие ссылки и описания открытых файлов (и дескрипторы).На странице руководства явно указано
Открытые файловые дескрипторы длястарый путьтакже не затронуты.
(Я указываю «на Linux» только потому, что не смог найти ссылку в POSIX; я думаю, что это распространено во всех операционных системах в стиле POSIX.)
Итак, когда вы копируете файл между файловыми системами, cp
открывает источник для чтения, цель для записи и начинает копирование. Операции переименования не влияют на используемые дескрипторы файлов; вы можете переименовать источник и/или цель, не затрагивая cp
.
Другой способ думать об этом заключается в том, что имя файла в его содержащем каталоге является частью его записи каталога, которая указывает на его inode; описания открытых файлов являются другими указателями на inode, как и другие жесткие ссылки. Изменение имени файла не влияет ни на какие другие существующие указатели.
Предостережения, на которые следует обратить внимание, заключаются в том, что такие инструменты, как , mv
не ограничивают себя тем, что rename
может сделать системный вызов; если вы mv
переписываете файлы между файловыми системами, то rename
произойдет сбой (или mv
они поймут, что операция выполняется между файловыми системами, и даже не попытаются ее выполнить), а mv
затем прибегнут к ручному копированию содержимого файла и удалению оригинала. Это не даст хороших результатов, если переименовываемый файл одновременно изменяется.