Подтвердить что ты не робот

Можно ли использовать inode и crtime как уникальный идентификатор файла?

У меня есть база данных индексирования файлов на Linux. В настоящее время я использую путь к файлу в качестве идентификатора. Но если файл перемещается/переименовывается, его путь изменяется, и я не могу сопоставить свою запись с базой данных с новым файлом и удалять/воссоздавать запись. Хуже того, если каталог перемещается/переименовывается, мне приходится удалять/воссоздавать записи для всех файлов и вложенных каталогов.

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

Итак, интересно, могу ли я использовать пару {inode,crtime} как уникальный идентификатор файла. Я надеюсь использовать i_crtime на ext4 и creat_time на NTFS. В моем ограниченном тестировании (с ext4) inode и crtime действительно остаются неизменными при переименовании или перемещении файлов или каталогов в пределах одной файловой системы.

Итак, вопрос в том, есть ли случаи, когда inode или crtime файла могут измениться. Например, может ли fsck или дефрагментация или изменение размера раздела изменить inode или crtime или файл?

Интересно, что http://msdn.microsoft.com/en-us/library/aa363788%28VS.85%29.aspx говорит:

  • "В файловой системе NTFS файл сохраняет тот же идентификатор файла, пока он не будет удален."
    но также:
  • "В некоторых случаях идентификатор файла для файла может меняться со временем".

Итак, что они упомянули в этих случаях?

Обратите внимание, что я изучил похожие вопросы:

но они не отвечают на мой вопрос.

4b9b3361

Ответ 1

  • {device_nr, inode_nr} - уникальный идентификатор для inode в системе
  • перемещение файла в другой каталог не изменяет его inode_nr
  • интерфейс linux inotify позволяет отслеживать изменения в inodes (файлы или каталоги).

Дополнительные примечания:

  • перемещение файлов в файловых системах осуществляется по-разному. (это infact copy + delete)
  • сетевые файловые системы (или смонтированные NTFS) не всегда гарантируют стабильность inodenumbers
  • Microsoft не является поставщиком Unix, ее документация не распространяется на Unix или ее файловые системы и должна игнорироваться (кроме внутренних NTFS).

Дополнительный текст: старый adagium Unix "все является файлом" на самом деле должен быть: "все является inode". Индекс несет всю метаинформацию о файле (или каталоге или специальном файле) кроме имени. Имя файла на самом деле является только записью в каталоге, которая связана со ссылкой на конкретный индекс. Перемещение файла подразумевает: создание новой ссылки на один и тот же индекс, завершение удаления старой записи каталога, связанной с ней. Метаданные inode можно получить с помощью системных вызовов stat() и fstat() и lstat().

Ответ 2

Распределение и управление i-узлами в Unix зависит от файловой системы. Таким образом, для каждой файловой системы ответ может отличаться.

Для файловой системы Ext3 (наиболее популярной) i-узлы повторно используются и, следовательно, не могут использоваться как уникальный идентификатор файла, и повторное использование не выполняется в соответствии с любым предсказуемым шаблоном.

В Ext3 i-узлы отслеживаются в битовом векторе, каждый бит представляет один номер i- node. Когда i- node освобождается, бит устанавливается в ноль. Когда требуется новый i-node, бит-бит ищет первый нулевой бит, а номер i- node (который ранее был выделен другому файлу) используется повторно.

Это может привести к наивному выводу о том, что наименьшее количество доступных i- node будет использоваться повторно. Тем не менее, файловая система Ext3 является сложной и оптимизированной, поэтому не следует делать никаких предположений о том, когда и как i- node числа могут быть повторно использованы, хотя они явно будут.

Из исходного кода для ialloc.c, где выделяются i-узлы:

Существует две политики для назначения индексного дескриптора. Если новый индексный дескриптор, то выполняется поиск в прямом порядке для группы блоков с обоими свободное пространство и низкое отношение каталога к inode; если это не удастся, то он группируется со средним свободным пространством, эта группа с наименьшим количеством каталоги уже выбраны. Для других инодов поиск вперед родительскую группу блоков каталогов, чтобы найти бесплатный индексный дескриптор.

Исходный код, который управляет этим для Ext3, называется ialloc, а окончательная версия здесь: https://github.com/torvalds/linux/blob/master/fs/ext3/ialloc.c