Виртуальные файловые системы

Люди пользуются множеством файловых систем, зачастую на одном и том же компьютере и даже для одной и той же операционной системы. Система Windows может иметь не только основную файловую систему NTFS, но и устаревшие приводы или разделы с файловой системой FAT-32 или FAT-16, на которых содержатся старые, но все еще нужные данные, а время от времени могут понадобиться также флеш-накопитель, старый компакт-диск или DVD (каждый со своей уникальной файловой системой).
Windows работает с этими совершенно разными файловыми системами, идентифицируя каждую из них по разным именам дисководов, таким как C:, D: и т. д. Когда процесс открывает файл, имя дисковода фигурирует в явном или неявном виде, поэтому Windows знает, какой именно файловой системе передать запрос. Интегрировать разнородные файловые системы в одну унифицированную никто даже не пытается.

В отличие от этого для всех современных систем UNIX предпринимаются весьма серьезные попытки интегрировать ряд файловых систем в единую структуру. У систем Linux в качестве корневой файловой системы может выступать ext2, и она может иметь ext3-раздел, подключенный к каталогу /usr, и второй жесткий диск, имеющий файловую систему ReiserFS, подключенный к каталогу /home, а также компакт-диск, отвечающий стандарту ISO 9660, временно подключенный к каталогу /mint. С пользовательской точки зрения это будет единая иерархическая файловая система, поскольку объединение нескольких несовместимых файловых систем невидимо для пользователей или процессов.

Существование нескольких файловых систем становится необходимостью, и начиная с передовой разработки Sun Microsystems (Kleiman, 1986) большинство UNIX-систем, пытаясь интегрировать несколько файловых систем в упорядоченную структуру, использовали концепцию виртуальной файловой системы (virtual file system (VFS)). Ключевая идея состоит в том, чтобы выделить какую-то часть файловой системы, являющуюся общей для всех файловых систем, и поместить ее код на отдельный уровень, из которого вызываются расположенные ниже конкретные файловые системы с целью фактического управления данными. Вся структура показана на рис. 4.15. Рассматриваемый далее материал не имеет конкретного отношения к Linux, или FreeBSD, или любой другой версии UNIX, но дает общее представление о том, как в UNIX-системах работают виртуальные файловые системы.

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




ских процессов, являются стандартными POSIX-вызовами, такими как open, read, write, lseek и т. д. Таким образом, VFS обладает «верхним» интерфейсом к пользовательским процессам, и это хорошо известный интерфейс POSIX.

У VFS есть также «нижний» интерфейс к конкретной файловой системе, который на рис. 4.15 обозначен как VFS-интерфейс. Этот интерфейс состоит из нескольких десятков вызовов функций, которые VFS способна направлять к каждой файловой системе для достижения конечного результата. Таким образом, чтобы создать новую файловую систему, работающую с VFS, ее разработчики должны предоставить вызовы функций, необходимых VFS. Вполне очевидным примером такой функции является функция, считывающая с диска конкретный блок, помещающая его в буферный кэш файловой системы и возвращающая указатель на него. Таким образом, у VFS имеются два интерфейса: «верхний» — к пользовательским процессам и «нижний» — к конкретным файловым системам.

Хотя большинство файловых систем, находящихся под VFS, представляют разделы локального диска, так бывает не всегда. На самом деле исходной мотивацией для компании Sun при создании VFS служила поддержка удаленных файловых систем, использующих протокол сетевой файловой системы (Network File System (NFS)). Конструктивная особенность VFS состоит в том, что пока конкретная файловая система предоставляет требуемые VFS функции, VFS не знает или не заботится о том, где данные хранятся или что собой представляет находящаяся под ней файловая система.

По внутреннему устройству большинство реализаций VFS являются объектно-ориентированными, даже если они написаны на C, а не на C++. Как правило, в них поддерживается ряд ключевых типов объектов. Среди них суперблок (superblock), описывающий файловую систему, v-узел (v-node), описывающий файл, и каталог (directory), описывающий каталог файловой системы.

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

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

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

open("/usr/include/unistd.h",ORDONLY)

то при анализе пути VFS увидит, что к /usr была подключена новая файловая система, определит местоположение ее суперблока, просканировав список суперблоков установленных файловых систем. После этого она может найти корневой каталог установленной файловой системы, а в нем — путь include/unistd.h. Затем VFS создает v-узел и направляет вызов конкретной файловой системе, чтобы вернулась вся информация, имеющаяся в i-узле файла. Эта информация копируется в v-узел (в оперативной памяти) наряду с другой информацией, наиболее важная из которой — указатель на таблицу функций, вызываемых для операций над v-узлами, таких как чтение — read, запись — write, закрытие — close и т. д.

После создания v-узла VFS создает запись в таблице описателей файлов вызывающего процесса и настраивает ее так, чтобы она указывала на новый v-узел. (Для особо дотошных — описатель файла на самом деле указывает на другую структуру данных, в которой содержатся текущая позиция в файле и указатель на v-узел, но эти подробности для наших текущих задач не очень важны.) И наконец, VFS возвращает описатель файла вызывавшему процессу, чтобы тот мог использовать его при чтении, записи и закрытии файла.

В дальнейшем, когда процесс осуществляет чтение, используя описатель файла, VFS находит v-узел из таблиц процесса и описателей файлов и следует по указателю к таблице функций, каждая из которых имеет адрес внутри конкретной файловой системы, где и расположен нужный файл. Теперь вызывается функция, управляющая чтением, и внутри конкретной файловой системы запускается код, извлекающий требуемый блок. VFS не знает, откуда приходят данные, с локального диска или по сети с удаленной файловой системы, с флеш-накопителя USB или из другого источника. Задействованные структуры данных показаны на рис. 4.16. Они начинаются с номера вызывающего процесса и описателя файла, затем задействуется v-узел, указатель на функцию read и отыскивается доступ к функции внутри конкретной файловой системы.

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


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

4.4.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Виртуальные файловые системы:

  1. Виртуальное послесловие
  2. ГЛАВА 11 ПРАВОВЫЕ ПРОБЛЕМЫ ВИРТУАЛЬНОЙ СРЕДЫ ИНТЕРНЕТ
  3. Виртуальное сексуальное насилие над детьми
  4. § 39 Классификация договоров в отдельных видах. – Римская классификация. – Система прусского закона, французского и австрийского кодекса. – Система русского свода. – Система настоящего изложения.
  5. Тема 15 Правова система і система права. Система законодавства та систематизація нормативно-правових актів
  6. Глава 4. Система права и система законодательства
  7. §5. Система военных судов в РФ как часть системы судов общей юрисдикции
  8. Единство и взаимосвязь правовой системы и системы правового общества
  9. § 1.3. Система трудового права і система трудового законодавства
  10. § 33 Общее правило о переходе наследства к детям. – Отличие отделенных от неотделенных. – Право представления. – Право родительское. – Право боковых родственников. – Римская система определения прав по классам и степеням. – Германская система определения прав по линиям и коленам.
  11. § 14 Отношения супругов по имуществу. – Германское начало общения имуществ в браке и римская система приданого. – Особое имущество жены. – Разнообразные системы западных законодательств. – Раздел имуществ по прекращении брака. – Ограничения брачных договоров и сделок между супругами. – Английский закон об отношениях супругов по имуществу.
  12. § 34 Смешанные системы в новейших законодательствах. – Происходящее от различия сих систем различие в порядке раздела и в допущении права представления. – Ограничение наследственного права пределами родства. – Ограничение женщин. – Разделение наследства между родами. – Возвращение подаренного родителями. – Наследование супругов и незаконных детей и родителей. – Закон наследования в Англии.
  13. Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание, 2007
  14. СИСТЕМА
  15. СИСТЕМА НЕРВНАЯ
  16. 11.1. Интернет и правовая система
  17. Тема 20. Смешанные правовые системы
  18. СИСТЕМА ТЕЙЛОРА
  19. 3. Система законодавства