Введение
Интерфейс программирования приложений (API) файловой системы — это интерфейс программирования приложений, посредством которого служебная программа или пользовательская программа запрашивает сервисы файловой системы. Операционная система может предоставлять абстракции для прозрачного доступа к различным файловым системам. Некоторые API файловых систем могут также включать интерфейсы для операций обслуживания, таких как создание или инициализация файловой системы, проверка файловой системы на целостность и дефрагментация. Каждая операционная система включает в себя API, необходимые для поддерживаемых ею файловых систем. Microsoft Windows предоставляет API файловых систем для NTFS и нескольких файловых систем FAT. Системы Linux могут включать API для ext2, ext3, ReiserFS и Btrfs, среди прочих.
A file system API is an application programming interface through which a utility or user program requests services of a file system. An operating system may provide abstractions for accessing different file systems transparently. Some file system APIs may also include interfaces for maintenance operations, such as creating or initializing a file system, verifying the file system for integrity, and defragmentation. Each operating system includes the APIs needed for the file systems it supports. Microsoft Windows has file system APIs for NTFS and several FAT file systems. Linux systems can include APIs for ext2, ext3, ReiserFS, and Btrfs to name a few.
Письмо, чтение и положение
Запись пользовательских данных в файловую систему предназначена для непосредственного использования пользовательской программой или библиотекой времени выполнения. Библиотека времени выполнения для некоторых языков программирования может обеспечивать преобразование типов, форматирование и блочную организацию данных. Некоторые файловые системы обеспечивают идентификацию записей по ключу и могут поддерживать перезапись существующих записей. Эта операция иногда называется PUT или PUTX (если запись уже существует). Чтение пользовательских данных, иногда называемое GET, может включать указание направления (прямое или обратное) или, в случае файловой системы с ключами, конкретного ключа. Как и при записи, библиотеки времени выполнения могут выполнять операции за пользовательскую программу. Позиционирование включает изменение местоположения следующей записи для чтения или записи. Это может включать в себя пропуск записей вперед или назад, а также установку позиции в начало или конец файла.
Reading user data, sometimes called GET, may include a direction (forward or reverse) or in the case of a keyed file system, a specific key. As with writing run time libraries may intercede for the user program. Positioning includes adjusting the location of the next record. This may include skipping forward or reverse as well as positioning to the beginning or end of the file.
Управление каталогами
Переименование файла, перемещение файла (или подкаталога) из одного каталога в другой и удаление файла — это примеры операций, которые файловая система предоставляет для управления каталогами. Обычно также включаются операции с метаданными, такие как предоставление или ограничение доступа к каталогу различным пользователям или группам пользователей.
Содержание файловой системы
Поскольку в файловой системе используются каталоги, файлы и записи, они могут добавляться, удаляться или изменяться. Это обычно приводит к неэффективности базовых структур данных. К таким проблемам относятся логически последовательные блоки, разбросанные по носителю информации таким образом, что вызывают чрезмерное перемещение головок, частично заполненные и даже пустые блоки, включенные в связанные структуры. Неполные структуры или другие несоответствия могут быть вызваны ошибками устройства или носителя, недостаточным временем между обнаружением надвигающейся потери питания и фактическим отключением электроэнергии, некорректным завершением работы системы или извлечением носителя, а также, в редких случаях, ошибками в коде файловой системы. В файловой системе предусмотрены специализированные подпрограммы для оптимизации или восстановления этих структур. Обычно они не вызываются пользователем напрямую, а активируются самой файловой системой. Внутренние счетчики уровней структур и количества вставленных объектов могут сравниваться с пороговыми значениями. Это может привести к приостановке доступа пользователя к определенной структуре (что обычно вызывает недовольство пользователя или пользователей), либо к запуску асинхронных задач с низким приоритетом, либо к отсрочке выполнения до времени низкой загрузки системы. Иногда эти подпрограммы вызываются или планируются системным администратором, например, при дефрагментации.
API на уровне ядра
API считается "уровнем ядра", когда ядро предоставляет не только интерфейсы для разработчиков файловых систем, но и является средой, в которой размещается код файловой системы. Это отличается от старой схемы тем, что само ядро использует собственные средства для взаимодействия с драйвером файловой системы и наоборот, в отличие от ситуации, когда ядро управляет структурой файловой системы, а файловая система – напрямую обращается к аппаратному обеспечению. Это не самое элегантное решение, но оно позволяет избежать масштабной переработки, необходимой при старой схеме. При использовании модульных ядер это позволяет добавлять файловые системы как любые модули ядра, включая сторонние. Однако при немодульных ядрах требуется перекомпиляция ядра с новым кодом файловой системы (а в ядрах с закрытым исходным кодом это делает невозможным использование сторонних файловых систем). Unix и Unix-подобные системы, такие как Linux, используют эту модульную схему. Существует вариант этой схемы, применяемый в MS DOS (начиная с DOS 4.0) и совместимых системах для поддержки CD-ROM и сетевых файловых систем. Вместо добавления кода в ядро, как в старой схеме, или использования средств ядра, как в схеме, основанной на ядре, система перехватывает все вызовы к файлу и определяет, следует ли перенаправить их на эквивалентную функцию ядра или обработать конкретным драйвером файловой системы, при этом драйвер файловой системы "непосредственно" обращается к содержимому диска, используя функции BIOS низкого уровня.
API на основе драйверов
API считается "драйверным", когда ядро предоставляет необходимые средства, но код файловой системы полностью находится вне ядра (даже не в виде модуля для модульного ядра). Это более элегантное решение, поскольку код файловой системы полностью независим, что позволяет создавать файловые системы для ядер с закрытым исходным кодом, а также добавлять или удалять файловые системы из системы "на лету". Примерами такой реализации являются IFS в Windows NT и OS/2.
API на основе драйверов смешанного ядра
В этом API все файловые системы находятся в ядре, как и в API, основанных на ядре, но операционная система автоматически перехватывает их другим API, основанным на драйверах. Эта схема использовалась в Windows 3.1 для обеспечения драйвера файловой системы FAT в 32-битном защищенном режиме и кэшированной версии (VFAT), которая полностью обходила драйвер DOS FAT в ядре (MSDOS.SYS). Позже она применялась в серии Windows 9x (95, 98 и Me) для VFAT, драйвера файловой системы ISO9660 (вместе с Joliet), сетевых ресурсов и драйверов файловых систем сторонних разработчиков, а также для добавления к оригинальным DOS API API LFN (благодаря чему драйверы IFS могли не только перехватывать существующие DOS файловые API, но и добавлять новые из 32-битного исполняемого файла в защищенном режиме). Однако этот API был недостаточно документирован, и сторонним разработчикам пришлось разбираться с ним самостоятельно, что оказалось даже сложнее, чем работа с API, основанными на ядре.
API пользовательской среды
API находится в пользовательском пространстве, когда файловая система не использует напрямую возможности ядра, а обращается к дискам, используя функции операционной системы высокого уровня, и предоставляет функции в библиотеке, которую ряд утилит используют для доступа к файловой системе. Это полезно для работы с образами дисков. Преимущество заключается в том, что файловую систему можно сделать переносимой между операционными системами, поскольку функции операционной системы высокого уровня, которые она использует, могут быть такими же распространенными, как ANSI C, однако недостатком является то, что API уникален для каждого приложения, которое его реализует. Примерами такой реализации являются hfsutils и adflib.
Совместимость между файловыми системами API
Поскольку всем файловым системам (по крайней мере, дисковым) требуются эквивалентные функции, предоставляемые ядром, код файловой системы можно легко портировать из одного API в другой, даже если они разных типов. Например, драйвер ext2 для OS/2 — это просто обертка, преобразующая VFS Linux в IFS OS/2, и использующая ядро ext2 Linux, а драйвер HFS для OS/2 — это порт hfsutils в IFS OS/2. Существует также проект, использующий драйвер IFS Windows NT для обеспечения работы NTFS под Linux.