stringtranslate.com

индексный дескриптор

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

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

Этимология

В списке рассылки ядра Linux существовала неопределенность относительно причины использования «i» в «inode». В 2002 году вопрос был задан пионеру Unix Деннису Ритчи , который ответил: [4]

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

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

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

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

Подробности

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

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

Inode хранят информацию о файлах и каталогах (папках), такую ​​как владение файлом, режим доступа (разрешения на чтение, запись, выполнение) и тип файла. Данные можно назвать статистическими данными по отношению к stat системному вызову , который предоставляет данные программам.

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

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

В некоторых файловых системах в стиле Unix, таких как JFS , XFS , ZFS , OpenZFS , ReiserFS , btrfs и APFS , отсутствует таблица индексных дескрипторов фиксированного размера, но они должны хранить эквивалентные данные, чтобы обеспечить эквивалентные возможности. Распространенные альтернативы таблицам фиксированного размера включают B-деревья и производные B+-деревья .

Имена файлов и последствия для каталогов:

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

Описание индексного дескриптора POSIX

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

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

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

Файловые системы, созданные с использованием индексных дескрипторов, будут иметь следующие административные характеристики:

Файлы с несколькими именами и жесткие ссылки

Файлы могут иметь несколько имен. Если несколько имен жестко связаны с одним и тем же индексным дескриптором, тогда имена эквивалентны; т.е. тот, который будет создан первым, не имеет особого статуса. В этом отличие от символических ссылок , которые зависят от исходного имени, а не от индексного дескриптора (номера).

сохранение индексного дескриптора и несвязанные файлы

Индексный дескриптор может не иметь ссылок. Индексный дескриптор без ссылок представляет собой файл, в котором не осталось записей каталога или путей, ведущих к нему в файловой системе. Файл, который был удален или в котором отсутствуют записи каталога, указывающие на него, называется «несвязанным» файлом.

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

Хотя несвязанный файл становится невидимым в файловой системе, его удаление откладывается до тех пор, пока все процессы, имеющие доступ к файлу, не завершат его использование, включая исполняемые файлы, которые неявно остаются открытыми выполняющими их процессами.

Преобразование номера индексного дескриптора и получение пути к каталогу файлов

Обычно невозможно сопоставить открытый файл с именем файла, которое использовалось для его открытия. Когда программа открывает файл, операционная система преобразует имя файла в номер индексного дескриптора, а затем отбрасывает имя файла. В результате такие функции, как getcwd() и getwd() , которые извлекают текущий рабочий каталог процесса, не могут напрямую получить доступ к имени файла.

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

Некоторые операционные системы сохраняют дополнительную информацию, чтобы ускорить выполнение этой операции. Например, в Linux VFS [11] кэш записей каталога, [12] также известный как dentry или dcache, представляет собой записи кэша, используемые ядром для ускорения операций файловой системы путем хранения информации о ссылках на каталоги в оперативной памяти .

Историческая возможность жесткой привязки каталогов

Исторически сложилось так, что каталоги можно было жестко связать . Это сделало структуру каталогов произвольным ориентированным графом, в отличие от ориентированного ациклического графа . Каталог мог быть даже собственным родителем. Современные системы обычно запрещают это запутанное состояние, за исключением того, что родительский элемент root по-прежнему определяется как root. Наиболее заметное исключение из этого запрета обнаружено в Mac OS X (версии 10.5 и выше), которая позволяет суперпользователю создавать жесткие ссылки на каталоги. [13]

стабильность номера индексного дескриптора и файловые системы, отличные от Unix

Когда файл перемещается в другой каталог той же файловой системы или когда дефрагментация диска изменяет его физическое местоположение, номер индексного дескриптора файла остается неизменным.

Эта уникальная характеристика позволяет перемещать или переименовывать файл даже во время операций чтения или записи, обеспечивая тем самым непрерывный доступ без сбоев.

Эта функция — сохранение местоположений метаданных и блоков данных файла в центральной структуре данных независимо от переименования или перемещения файла — не может быть полностью воспроизведена во многих файловых системах, отличных от Unix, таких как FAT и ее производные, поскольку в них отсутствует механизм для поддержки этого. инвариантное свойство, когда одновременно перемещаются и запись каталога файла, и его данные. В этих файловых системах перемещение или переименование файла может привести к более значительным изменениям в структуре данных, представляющей файл, и система не ведет отдельную централизованную запись о местоположении блоков данных и метаданных файла , как это делают индексные дескрипторы в Unix-подобных системах. системы.

Упрощенная установка библиотеки с файловыми системами inode.

Файловые системы inode позволяют работающему процессу продолжать обращаться к файлу библиотеки, даже если другой процесс заменяет тот же файл.

Эта операция должна выполняться атомарно , то есть она должна выглядеть как одна операция, которая либо полностью завершена, либо не выполняется вообще, без промежуточного состояния, видимого для других процессов.

Во время замены для нового файла библиотеки создается новый индексный дескриптор , устанавливающий совершенно новое сопоставление. Впоследствии будущие запросы доступа к этой библиотеке будут получать только что установленную версию.

Когда операционная система заменяет файл (и создает новый индексный дескриптор), она блокирует [14] индексный дескриптор [15] и, возможно, содержащий его каталог. [16] Это предотвращает чтение или запись файла (inode) другими процессами во время операции обновления, тем самым избегая несогласованности или повреждения данных. [18]

После завершения операции обновления блокировка снимается. Любой последующий доступ к файлу (через индексный дескриптор) любыми процессами теперь будет указывать на новую версию библиотеки. Таким образом, можно выполнять обновления, даже если библиотека используется другим процессом.

Одним из существенных преимуществ этого механизма является то, что он устраняет необходимость перезагрузки системы для замены используемых в данный момент библиотек. Следовательно, системы могут беспрепятственно обновлять или обновлять библиотеки программного обеспечения , не прерывая запущенные процессы или операции.

Потенциал исчерпания индексных дескрипторов и решения

При создании файловой системы некоторые файловые системы выделяют фиксированное количество индексных дескрипторов. [19] Это означает, что в файловой системе могут закончиться индексные дескрипторы, даже если в файловой системе осталось свободное пространство. Такая ситуация часто возникает в случаях использования, когда имеется много небольших файлов, например, на сервере, хранящем сообщения электронной почты, поскольку каждому файлу, независимо от его размера, требуется собственный индексный дескриптор.

Другие файловые системы обходят это ограничение, используя динамическое распределение индексных дескрипторов. [20] Динамическое распределение индексных дескрипторов позволяет файловой системе создавать больше индексных дескрипторов по мере необходимости вместо того, чтобы полагаться на фиксированное количество, созданное во время создания файловой системы. [21] Это может «разрастить» файловую систему за счет увеличения количества индексных дескрипторов, доступных для новых файлов и каталогов, что позволит избежать проблемы нехватки индексных дескрипторов. [22]

Встраивание

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

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

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

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

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

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

  1. ^ Таненбаум, Эндрю С. Современные операционные системы (3-е изд.). п. 279.
  2. ^ ЙВСАНТЕН. «Разница между mtime, ctime и atime — инструкции по Linux и часто задаваемые вопросы». Linux Howtos и часто задаваемые вопросы . Архивировано из оригинала 20 ноября 2016 г.{{cite web}}: CS1 maint: неподходящий URL ( ссылка )
  3. ^ «Анатомия переключателя виртуальной файловой системы Linux» . IBM.com .
  4. Лэндли, Роб (20 июля 2002 г.). «Вперёд: Re: Что означает буква «i» в индексном дескрипторе? Деннис Ритчи тоже не знает». linux-kernel (список рассылки) . Проверено 12 января 2011 г.
  5. ^ Ричи, Деннис М.; Томпсон, Кен (1978). «Система разделения времени UNIX». Технический журнал Bell System . 57 (6): 1913–1914 . Проверено 19 декабря 2015 г.
  6. ^ Морис Дж. Бах (1986). Проект операционной системы UNIX . Прентис Холл. ISBN 978-0132017992.
  7. ^ Бах, Морис Дж. (1986). Проект операционной системы UNIX . Прентис Холл. п. 94. Бибкод : 1986duos.book.....Б.
  8. ^ "Линфо". Информационный проект Linux . Проверено 11 марта 2020 г.
  9. ^ «Определения - Серийный номер файла 3.176» . Открытая группа . Проверено 10 января 2018 г.
  10. ^ ab "<sys/stat.h>". Открытая группа . Проверено 15 января 2018 г.
  11. ^ Гуч, Ричард. Энберг, Пекка (ред.). «Обзор виртуальной файловой системы Linux». ядро.орг . Проверено 20 мая 2023 г.
  12. ^ Ричард Гуч. Энберг, Пекка (ред.). «Кэш записей каталога (dcache)». ядро.орг . Проверено 20 мая 2023 г.
  13. ^ «Какова команда Unix для создания жесткой ссылки на каталог в OS X?». Переполнение стека . 16 января 2011 г. Архивировано из оригинала 5 января 2020 г. . Проверено 5 января 2020 г.
  14. ^ Сообщество разработчиков ядра. «Запирание». ядро.орг . Проверено 21 мая 2023 г.
  15. ^ Гуч, Ричард. Энберг, Пекка (ред.). «структура inode_operations». ядро.орг . Проверено 21 мая 2023 г.
  16. ^ Сообщество разработчиков ядра. «Блокировка каталога». ядро.орг . Проверено 21 мая 2023 г.
  17. ^ Сообщество разработчиков ядра. «Типы блокировок и их правила». ядро.орг . Проверено 21 мая 2023 г.
  18. ^ ван де Вен, А., Молнар, И. «Валидатор правильности блокировки во время выполнения». ядро.орг . Проверено 21 мая 2023 г.{{cite web}}: CS1 maint: несколько имен: список авторов ( ссылка )
  19. ^ Сообщество разработчиков ядра. «2. Дизайн высокого уровня». ядро.орг . Проверено 21 мая 2023 г.
  20. ^ Сообщество разработчиков ядра. «Метаданные с самоописанием XFS». ядро.орг . Проверено 21 мая 2023 г.
  21. ^ Сообщество разработчиков ядра. «2.7. Политика распределения блоков и индексных дескрипторов». ядро.орг . Проверено 21 мая 2023 г.
  22. ^ Вадала, Дерек (2002). «6. Файловые системы». Управление RAID в Linux . O'Reilly Media, Inc. ISBN 9781565927308.
  23. ^ «Ядро Linux: файловые системы». вт.nl.
  24. ^ «Схема диска Ext4» . ядро.org . Проверено 18 августа 2013 г.
  25. ^ «Есть ли в Windows номера индексных дескрипторов, как в Linux?». Переполнение стека .
  26. ^ abc «Функция GetFileInformationByHandle (fileapi.h) — приложения Win32». docs.microsoft.com .
  27. ^ «[MS-FSCC]: Типы атрибутов NTFS» . docs.microsoft.com .
  28. ^ «Windows — максимальный размер файла, который может быть полностью сохранен в главной таблице файлов NTFS (MFT)» .

Внешние ссылки