Индекс - inode - Wikipedia

В индекс (индексный узел) - это структура данных в Файловая система в стиле Unix это описывает файловая система объект, такой как файл или каталог. Каждый индексный дескриптор хранит атрибуты и расположение дисковых блоков данных объекта.[1] Атрибуты объекта файловой системы могут включать метаданные (время последнего изменения,[2] доступ, модификация), а также владелец и разрешение данные.[3]

Каталоги - это списки имен, присвоенных индексным дескрипторам. Каталог содержит запись для себя, своего родителя и каждого из его дочерних элементов.

Этимология

Была неопределенность в отношении Список рассылки ядра Linux о причине "i" в "inode". В 2002 году вопрос был поставлен перед пионером Unix. Деннис Ричи, который ответил:[4]

По правде говоря, я тоже не знаю. Это был просто термин, который мы начали использовать. «Индекс» - это мое лучшее предположение из-за немного необычной структуры файловой системы, в которой информация о доступе к файлам хранится в виде плоского массива на диске, а вся информация иерархического каталога находится в стороне от этого. Таким образом, i-число - это индекс в этом массиве, i-узел - это выбранный элемент массива. (Обозначение «i-» использовалось в 1-м издании руководства; его дефис постепенно удалялся.)

Статья Ритчи и Кен Томпсон подкрепляет понятие "индекс" как этимологическое происхождение индексов. Они написали:[5]

[…] Запись каталога содержит только имя связанного файла и указатель в сам файл. Этот указатель представляет собой целое число, называемое i-число (для порядкового номера) файла. При доступе к файлу его i-номер используется в качестве индекса в системной таблице ( i-список) хранится в известной части устройства, на котором находится каталог. Найденная таким образом запись (файл i-узел) содержит описание файла.

Кроме того, Морис Дж. Бах писал, что индексный дескриптор «является сокращением термина« индексный узел »и обычно используется в литературе по системе UNIX».[6]

Подробности

Дескрипторы файлов, таблица файлов и таблица inode в Unix[7]

Файловая система полагается на структуры данных о файлы, а не содержимое этого файла. Первые называются метаданные - данные, описывающие данные. Каждый файл связан с индекс, который обозначается целым числом, часто называемым i-число или же номер inode.

Inodes хранит информацию о файлах и каталогах (папках), такую ​​как право собственности на файл, режим доступа (права на чтение, запись, выполнение) и тип файла. Во многих более старых реализациях файловых систем максимальное количество inodes фиксируется при создании файловой системы, ограничивая максимальное количество файлов, которое может содержать файловая система. Типичная эвристика распределения для индексных дескрипторов в файловой системе - один индексный дескриптор на каждые 2 Кбайт, содержащихся в файловой системе.[8]

Номер индексного дескриптора индексирует таблицу индексных дескрипторов в известном месте на устройстве. По номеру inode драйвер файловой системы ядра может получить доступ к содержимому inode, включая расположение файла, тем самым разрешая доступ к файлу. Номер inode файла можно найти с помощью ls -i команда. В ls -i команда выводит номер i-узла в первый столбец отчета.

Некоторые файловые системы в стиле Unix, такие как ReiserFS, btrfs, и APFS опускать таблицу inode фиксированного размера, но должны хранить эквивалентные данные для обеспечения эквивалентных возможностей. Данные могут называться статистическими данными по отношению к стат системный вызов который предоставляет данные программам. Общие альтернативы таблице фиксированного размера включают: B-деревья и производные B + деревья.

Имена файлов и значения каталога:

  • Inodes не содержат имена жестких ссылок, только другие метаданные файла.
  • Каталоги Unix - это списки ассоциативных структур, каждая из которых содержит одно имя файла и один номер inode.
  • Драйвер файловой системы должен искать в каталоге конкретное имя файла, а затем преобразовывать имя файла в соответствующий номер inode.

Представление этих данных в памяти ядра операционной системы называется struct inode в Linux. Системы, полученные из BSD использовать термин vnode ("v" относится к ядру виртуальная файловая система слой).

Описание inode POSIX

В POSIX стандарт требует поведения файловой системы, на которое сильно влияют традиционные UNIX файловые системы. Inode обозначается фразой "серийный номер файла", определяемой как файловая система уникальный идентификатор файла.[9] Этот серийный номер файла вместе с идентификатором устройства, содержащего файл, однозначно идентифицирует файл во всей системе.[10]

В системе POSIX файл имеет следующие атрибуты[10] который может быть получен стат системный вызов:

  • Идентификатор устройства (идентифицирует устройство, содержащее файл; то есть область уникальности серийного номера).
  • Серийные номера файлов.
  • В файл Режим который определяет тип файла и то, как владелец файла, его группа и другие лица могут получить к нему доступ.
  • А количество ссылок рассказывая сколько жесткие ссылки указать на индексный дескриптор.
  • В ID пользователя владельца файла.
  • В ID группы файла.
  • Идентификатор устройства файла, если это файл устройства.
  • Размер файла в байты.
  • Отметки времени сообщая, когда в последний раз был изменен сам индексный дескриптор (ctime, время смены инода), последнее измененное содержимое файла (время, время модификации) и последний доступ (время, время доступа).
  • Предпочтительный размер блока ввода-вывода.
  • Количество блоков, выделенных для этого файла.

Подразумеваемое

  • Файлы могут иметь несколько имен. Если несколько имен жесткая ссылка для одного и того же inode имена эквивалентны; т.е. тот, кто будет создан первым, особого статуса не имеет. Это не похоже символические ссылки, которые зависят от исходного имени, а не от индекса (номера).
  • Inode может не иметь ссылок. Несвязанный файл удаляется с диска, а его ресурсы освобождаются для перераспределения, но удаление должно ждать, пока все процессы, открывшие его, закончат доступ к нему. Сюда входят исполняемые файлы, которые неявно открываются исполняющими их процессами.
  • Обычно невозможно сопоставить открытый файл с именем файла, которое использовалось для его открытия. Операционная система немедленно преобразует имя файла в номер inode, а затем отбрасывает имя файла. Это означает, что getcwd () и getwd () библиотечные функции ищут родительский каталог найти файл с индексом, соответствующим рабочий каталог, затем выполните поиск в родительском каталоге и так далее, пока не дойдете до корневая директория. SVR4 и Linux системы хранят дополнительную информацию, чтобы сделать это возможным.
  • Исторически было возможно жесткая ссылка каталоги. Это сделало структуру каталогов произвольной ориентированный граф вопреки ориентированный ациклический граф. Каталог даже мог быть собственным родительским. Современные системы обычно запрещают это сбивающее с толку состояние, за исключением того, что родительский элемент корень по-прежнему определяется как root. Наиболее заметное исключение из этого запрета находится в Mac OS X (версии 10.5 и выше), что позволяет суперпользователю создавать жесткие ссылки каталогов.[11]
  • Номер inode файла остается неизменным, когда он перемещается в другой каталог на том же устройстве или когда диск дефрагментированный который может изменить свое физическое местоположение, позволяя перемещать и переименовывать его даже во время чтения и записи, не вызывая прерывания. Это также означает, что полностью соответствующее поведение inode невозможно реализовать со многими файловыми системами, отличными от Unix, такими как ТОЛСТЫЙ и его потомков, у которых нет способа сохранить эту инвариантность, когда и запись каталога файла, и его данные перемещаются.
  • Установка новых библиотек проста с файловыми системами inode. Запущенный процесс может получить доступ к файлу библиотеки, в то время как другой процесс заменяет этот файл, создавая новый индексный дескриптор, и для нового файла будет существовать совершенно новое сопоставление, так что при последующих попытках доступа к библиотеке будет получена новая версия. Эта возможность устраняет необходимость перезагрузки для замены библиотек, отображаемых в настоящее время.
  • На устройстве могут закончиться inodes. В этом случае на устройстве невозможно создать новые файлы, даже если на нем может быть свободное место. Это наиболее часто встречается в таких случаях, как почтовые серверы которые содержат множество небольших файлов. Файловые системы (например, JFS или же XFS ) избежать этого ограничения с помощью экстенты или динамическое размещение inode, которое может «увеличить» файловую систему или увеличить количество inode.

Встраивание

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

Если данные файла умещаются в пространстве, выделенном для указателей на данные, это пространство можно удобно использовать. Например, ext2 и его преемники хранят данные символических ссылок (обычно имена файлов) таким образом, если размер данных не превышает 60 байт («быстрые символические ссылки»).[12]

Ext4 имеет параметр файловой системы, называемый inline_data что позволяет ext4 выполнять встраивание, если оно включено во время создания файловой системы. Поскольку размер inode ограничен, это работает только для очень маленьких файлов.[13]

В системах, отличных от Unix

  • NTFS имеет основную файловую таблицу (MFT), хранящую файлы в B-дереве. У каждой записи есть «fileID», аналогичный номеру inode, который однозначно ссылается на эту запись.[14] Три метки времени, идентификатор устройства, атрибуты, счетчик ссылок и размеры файлов находятся в записи, но в отличие от POSIX, разрешения выражаются через другой API.[15] Схема на диске более сложная.[16] Более ранние файловые системы FAT не имели такой таблицы и не могли создавать жесткие ссылки.
  • Такой же стат GetFileInformationByHandle API можно использовать на ReFS, Общие тома кластера, и SMB 3.0, так что эти системы предположительно имеют аналогичную концепцию идентификатора файла. ReFS имеет 128-битный идентификатор файла; это расширение также было перенесено в NTFS, которая изначально имела 64-битный идентификатор файла.[15]

Смотрите также

Рекомендации

  1. ^ Таненбаум, Эндрю С. Современные операционные системы (3-е изд.). п. 279.
  2. ^ JVSANTEN. «Разница между mtime, ctime и atime - Linux Howtos и часто задаваемые вопросы». Linux Howtos и часто задаваемые вопросы.
  3. ^ «Анатомия коммутатора виртуальной файловой системы Linux». ibm.com.
  4. ^ Архив списка ядер Linux. Проверено 12 января 2011.
  5. ^ Ричи, Деннис М .; Томпсон, Кен (1978). «Система разделения времени UNIX». Технический журнал Bell System. 57 (6): 1913–1914. Получено 19 декабря 2015.
  6. ^ Морис Дж. Бах (1986). Дизайн операционной системы UNIX. Прентис Холл. ISBN  978-0132017992.
  7. ^ Бах, Морис Дж. (1986). Дизайн операционной системы UNIX. Прентис Холл. п. 94. Bibcode:1986duos.book ..... B.
  8. ^ "линфо". Информационный проект Linux. Получено 11 марта 2020.
  9. ^ «Определения - 3,176 серийный номер файла». Открытая группа. Получено 10 января 2018.
  10. ^ а б "". Открытая группа. Получено 15 января 2018.
  11. ^ «Что такое команда Unix для создания жесткой ссылки на каталог в OS X?». Переполнение стека. 16 января 2011 г. В архиве из оригинала на 5 января 2020 г.. Получено 5 января 2020.
  12. ^ «Ядро Linux: файловые системы». вт.нл.
  13. ^ "Схема диска Ext4". kernel.org. Получено 18 августа, 2013.
  14. ^ «Есть ли в Windows номера Inode, как в Linux?». Переполнение стека.
  15. ^ а б "Функция GetFileInformationByHandle (fileapi.h) - приложения Win32". docs.microsoft.com.
  16. ^ «[MS-FSCC]: типы атрибутов NTFS». docs.microsoft.com.

внешняя ссылка