Главная » Ядро Linux » Уровень обобщенной файловой системы

0

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

Обобщенный  уровень работает путем определения  базовых интерфейсов  и структур данных,  которые нужны для поддержки  всех файловых  систем. Код поддержки каждой файловой  системы должен формировать  все концепции своей работы в соответствии с шаблонными требованиями подсистемы VFS, например "так открываем файл" , а "так представляем каталог". Код файловой системы скрывает все детали реализации.  По отношению к уровню VFS и остальным частям ядра все файловые системы выглядят одинаково,  т.е. все файловые  системы начинают  поддерживать такие объекты, как файлы и каталоги, и такие операции,  как создание и удаление файла.

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

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

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

write(f, &buf, len);

Этот  системный вызоп  записывает len  байт  из области  памяти по  адресу  &buf в файл, представленный с помощью дескриптора f, начиная с текущей  позиции файла. Этот  системный вызов  вначале  обрабатывается общей  функцией ядра  sys_writ e () , которая определяет функцию записи в файл  для той файловой системы, на которой находится файл, представленный дескриптором f. Далее  общий системный вызов вызывает найденную функцию,  которая является частью  реализации файловой системы  и служит  для  записи данных  на  физический носитель (или  для других действий, которые файловая система  выполняет при записи файла). На рис. 12.2 показана диаграмма выполнения операции записи, начиная от пользовательской функции writ e ()  и заканчивая поступлением данных  на физический носитель. Далее  в этой главе  будет показано, как  подсистема VFS позволяет достичь  необходимой абстракции и какие  для этого обеспечиваются интерфейсы.

ФайловыесистемыUnix

Исторически так сложилось, что ОС Unix  обеспечивает четыре  абстракции, связанные с файловыми системами: файлы, элементы каталогов (directory  entry), индексы (inode) и точки  монтирования (mount point).

Файловая система — это иерархическое хранилище данных  определенной структуры.  Файловые системы содержат  файлы, каталоги и соответствующую управляющую информацию. Обычные операции, которые выполняются с файловыми системами, — это создание (create), удаление  (delete)  и монтирование (mount). В ОС Unix файловые системы монтируются на определенную точку монтирования в общей  иерархии1, которая называется пространством имен (namespace).  Это позволяет все файловые  системы сделать  элементами одной  древовидной структуры2.

Файл  (file) — это упорядоченный поток  байтов.  Первый байт соответствует началу файла, а последний байт концу  файла.  Каждому  файлу  присваивается удобочитаемое имя, по которому файл  идентифицируется как пользователями, так и системой. Обычные файловые операции— это  чтение  (read), запись  (write), создание (create) и удаление  (delete).

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

2   В отличие  от указания  буквы,  котора я соответствует  определенному диску,  наприме р С:. В последнем  случае  пространств о  имен  разбиваетс я  на  части,   которы е  соответствуют  различны м  устройствам  ил и  разделам  устройств .  Поскольку   тако е  разделени е  выполняетс я  случайным   образом,   в качестве  представления для  пользователя  его  можно  считать  не  самым  идеальным  вариантом.

Файлы помещаются в каталогах  (directory). Каталог — это аналог  папки, которая обычно  содержит связанные между собой  файлы. Каталоги могут содержать подкаталоги.  В этой  связи  каталоги могут быть вложены друг в друга и образуют  пути  (path). Каждый компонент пути  называется элементом каталога  (directory  entry).  Пример пути— "/home/wolfman/foo". Корневой каталог  "/", каталоги home  и  wolfman, a также  файл  f оо — это элементы каталогов, которые называются dentry. В операционной системе  Unix  каталоги представляют собой  обычные файлы, которые просто содержат  список файлов каталога. Так как каталог  по отношению к виртуальной файловой системе — это файл, то с каталогами можно  выполнять те же операции, что и с файлами.

Unix-подобные операционные системы отличают концепцию файла  от любой  информации об этом  файле  (права  доступа, размер, владелец, время  создания и т.д.). Последняяинформацияиногданазываетсяметаданнымифайла(file,metadata),т.е.данные  о данных, и хранится отдельно  от файлов в специальных структурах, которые называются индексами (inode). Это сокращенное название от index node (индексный узел), хотя в наши  дни термин "inode" используется значительно чаще.

Вся указанная информация, а также связанная с ней информация о самой  файловой системе  хранится в суперблоке (superblock). Суперблок— это  структура  данных, которая содержит информацию о файловой системе  в целом.  Иногда эти общие данные называются метаданными файловой системы. Метаданные файловой системы содержат информацию об индивидуальных файлах  и о файловой системе  в целом.

Традиционно файловые системы ОС  Unix  реализуют эти  понятия как  структуры данных, которые определенным образом расположены на физических дисках. Например, информация о файлах  хранится в индексе, в отдельном блоке  диска, каталоги являются файлами, информация по управлению файловой системой хранится  централизованно в суперблоке и т.д. Подсистема VFS операционной системы Linux  рассчитана на работу  с файловыми системами, в которых  поддерживаются аналогичные концепции. Не Unix-подобные файловые системы, такие  как FAT или NTFS, также  работают  в ОС  Linux, однако  их программный код должен  обеспечить наличие аналогичных концепций. Например, если файловая система  не поддерживает отдельные индексы файлов, то код должен  построить в оперативной памяти структуры  данных  таким  образом, чтобы  казалось, что такая  поддержка работает. Если  файловая система  рассматривает каталоги как объекты  специальных типов, для VFS каталоги должны  представляться как  обычные файлы. Часто  код не файловых систем  не  в стиле  Unix  требует  выполнять некоторую дополнительную обработку чтобы уложиться в парадигму Unix и требования VFS. Такие  файловые системы также поддерживаются, и обычно  качество не особенно страдает.

write()

sys_write()                              Метод записи файловой системы

Пространство пользователя

VFS                                       Файловая  система

Физический  носитель

Рис, 12.2. Схема прохождения данных из  пространства пользователя,  где  вызывается функция wri  te  (),  через общий системный вызов VFS,  к  специфическому методу записи  файловой системы и,  наконец,  поступление па   физический  носитель

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии