|
|
|||||||||||||||||||||||||||||
|
Анатомия файловой системы LinuxИсточник: IBM developerWorks Россия М. Тим Джонс, инженер-консультант, Emulex
Если говорить о файловых системах, Linux по сравнению с другими операционными системами напоминает швейцарский армейский нож. Linux поддерживает множество файловых систем, от журналируемых до кластерных и систем с шифрованием. Linux - это замечательная платформа для использования стандартных и экзотических файловых систем, а также для разработки файловых систем. В этой статье рассматривается виртуальная файловая система (VFS) ядра Linux, которая иногда называется виртуальным коммутатором файловой системы, а также приводится обзор некоторых основных структур, связывающих файловые системы. Базовая архитектура файловой системыАрхитектура файловой системы Linux являет собой интересный образец абстрагирования сложностей. Единый набор функций API позволяет поддерживать множество файловых систем на множестве устройств хранения. Возьмем, например, вызов функции Что такое файловая система?Я начну с наиболее общего вопроса - определения файловой системы. Файловой системой называется некоторая организация данных и метаданных на устройстве хранения. Вы понимаете, что при таком нечетком определении код, его реализующий, будет очень интересным. Как я уже упоминал, существует множество типов носителей и файловых систем. Стоит ожидать, что при таком многообразии интерфейс файловой системы Linux будет реализован с использованием многоуровневой архитектуры, отделяющей уровень интерфейса пользователя от реализации файловой системы и от драйверов, управляющих устройствами хранения.
МонтированиеПроцесс связывания файловой системы с устройством в Linux называется монтированием ( mounting ). Для подключения файловой системы к существующей иерархии файловых систем (корню) используется команда Чтобы продемонстрировать возможности уровня файловой системы Linux (и монтирования), создадим файловую систему в файле, расположенном в существующей файловой системе. Это можно сделать путем создания файла заданного размера с помощью Листинг 1. Создание инициализированного файла
Теперь у нас есть файл file.img размером 10 МБ. Свяжем с файлом блочное устройство-заглушку (loop) с помощью команды losetup (чтобы он выглядел как блочное устройство, а не как обычный файл файловой системы):
Теперь, имея файл, который выглядит как блочное устройство (представлен /dev/loop0), создадим на этом устройстве файловую систему с помощью Листинг 2. Создание файловой системы ext2 на устройстве loop
Теперь файл file.img, представленный блочным устройством ( Листинг 3. Создание точки монтирования и монтирование файловой системы посредством устройства loop
Как показано в листинге 4, этот процесс можно продолжить, создавая новый файл в новой файловой системе, связывая его с устройством loop и создавая в нем еще одну файловую систему. Листинг 4. Создание новой файловой системы loop в уже существующей
Из этого простого примера легко понять, насколько большие возможности предоставляет файловая система (и устройство loop) в Linux. Аналогичным образом с помощью устройства loop можно создавать в файле файловые системы с шифрованием. Это может быть полезно для защиты ваших данных; при необходимости такой файл можно быстро смонтировать с помощью устройства loop. Архитектура файловой системыТеперь, когда вы увидели создание файловой системы в действии, давайте вернемся к архитектуре уровня файловой системы Linux. В этой статье файловая система Linux рассматривается с двух точек зрения. Первая точка зрения - это высокоуровневая архитектура. Вторая точка зрения рассматривает уровень файловой системы глубже и шире, со стороны основных структур, составляющих его. Архитектура высокого уровняХотя большая часть кода файловой системы реализована в ядре (за исключением файловых систем пространства пользователя, о которых я расскажу ниже), архитектура, показанная на рисунке 1, характеризует отношения между основными компонентами файловой системы, как в пространстве пользователя, так и в ядре. Рисунок 1. Архитектурное представление компонентов файловой системы Linux В пространстве пользователя размещаются приложения (в этом примере - пользователь файловой системы) и библиотека GNU C (glibc), которые предоставляют интерфейс для вызова файловой системы (открытие, чтение, запись, закрытие). Интерфейс системных вызовов действует как коммутатор, направляющий системные вызовы из пространства пользователя в соответствующую точку пространства ядра. VFS является основным интерфейсом к файловым системам нижнего уровня. Этот компонент экспортирует набор интерфейсов и после этого абстрагирует их в отдельные файловые системы, образ поведения которых может быть весьма различным. Для объектов файловой системы (узлов inodes и записей dentries) существуют два кэша, о которых я скоро расскажу. Каждый из них предоставляет пул недавно использованных объектов файловой системы. Реализация каждой файловой системы, например, ext2, JFS и так далее, экспортирует общий массив интерфейсов, который используется (и ожидается) VFS. Буферный кэш буферизирует запросы между файловыми системами и блочными устройствами, которыми они могут управлять. Например, через буферный кэш проходят запросы на чтение и запись к драйверам устройств. Это позволяет кэшировать запросы для более быстрого доступа (вместо обращения к физическому устройству). Буферный кэш управляется набором списков последних использованных элементов (least recently used, LRU). Обратите внимание, что командой
Это был общий взгляд на компоненты файловой системы и VFS. Давайте теперь рассмотрим основные структуры, составляющие эту подсистему. Основные структурыВ Linux все файловые системы рассматриваются с точки зрения общего набора объектов. К этим объектам относятся системные блоки, узлы inode, записи dentry и файлы. Корнем каждой файловой системы является системный блок, который описывает и поддерживает состояние файловой системы. Каждый объект, с которым работает файловая система (файл или директория) представлен в Linux узлом inode. Узел inode хранит в себе все метаданные для управления объектами файловой системы (в том числе и возможных операциях с ним). Другое множество структур, которое называют записями dentry, используется для осуществления преобразования между названиями и узлами inode, для чего существует кэш директорий, в котором хранятся последние использованные записи. В записях dentry также хранятся отношения между папками и файлами для обхода файловых систем. И, наконец, файл VFS представляет собой открытый файл (содержит состояние открытого файла, в том числе смещение для записи и т.п.). Уровень виртуальной файловой системыVFS действует как корневой уровень интерфейса файловой системы. VFS следит за всеми поддерживаемыми и всеми смонтированными на данный момент файловыми системами. Файловые системы в Linux можно динамически добавлять и удалять с помощью нескольких функций регистрации. В ядре хранится список поддерживаемых файловых систем, который можно просмотреть из пространства пользователя посредством файловой системы /proc. В этом виртуальном файле также показаны устройства, связанные на текущий момент с файловыми системами. Для того, чтобы добавить новую файловую систему в Linux, вызывается Регистрация новой файловой системы заключается в добавлении этой системы и относящейся к ней информации в список file_systems (см. рисунок 2 и linux/include/linux/mount.h). Этот список определяет поддерживаемые файловые системы. Просмотреть его можно, введя в командной строке Рисунок 2. Файловая система, зарегистрированная в ядре Другой структурой, поддерживаемой VFS, являются смонтированные файловые системы (см. рисунок 3). Она предоставляет список смонтированных на данный момент файловых систем (см. linux/include/linux/fs.h). Она ссылается на структуру системного блока Рисунок 3. Список смонтированных файловых систем Системный блокСистемным блоком (superblock) называется структура, представляющая файловую систему. В нее входит информация, необходимая для управления файловой системой во время работы. К такой информации относится название файловой системы (например, ext2), размер файловой системы и ее состояние, ссылку на блочное устройство и информацию метаданных (например, списки свободных блоков и т.п.). Как правило, системный блок хранится на носителе, но если его нет, он может быть создан в реальном времени. Структуру системного блока (см. рисунок 4) можно найти в ./linux/include/linux/fs.h. Рисунок 4. Структура системного блока и работа узлов inode Одним из важнейших элементов системного блока является определение его операций. Эта структура определяет набор функций для управления узлами inodes файловой системы. Например, inodes могут выделяться с помощью Узлы inode и dentryУзел inode представляет объект файловой системы с уникальным идентификатором. Каждая файловая система предоставляет методы преобразования имен файлов в уникальные идентификаторы inode и затем - в ссылки на inode. На рисунке 5 показана часть структуры inode вместе с несколькими связанными структурами. Обратите внимание, в частности, на Рисунок 5. Структура inode и связанные с ней операции Последние использованные узлы inodes и записи dentries хранятся в кэше inode и кэше директорий соответственно. Обратите внимание, что каждому inode в кэше inode соответствует запись dentry в кэше директорий. Структуры Буферный кэшЗа исключением отдельных реализаций файловых систем (которые можно найти в ./linux/fs), в нижней части уровня файловой системы располагается буферный кэш. Здесь хранятся запросы на чтение и запись от отдельных файловых систем и физических устройств (посредством драйверов устройств). Из соображений производительности в Linux предусмотрен кэш запросов, позволяющий не обращаться по каждому запросу к физическому устройству. Вместо этого в нем кэшируются последние использованные буферы (страницы), которые могут быть быстро предоставлены отдельным файловым системам. Интересные файловые системыВ этой статье не рассказывается о конкретных отдельных файловых системах, доступных в Linux, но здесь будет полезно их упомянуть, хотя бы мимоходом. Linux поддерживает множество файловых систем, начиная от самых старых - MINIX, MS-DOS и ext2. Linux также поддерживает новые файловые системы с журналированием, к которым относятся ext3, JFS и ReiserFS. Кроме того, в Linux поддерживаются файловые системы с шифрованием, такие как CFS, и виртуальные файловые системы, такие как /proc. И, наконец, отдельно стоит отметить файловую систему Filesystem in Userspace или FUSE. Это интересный проект, который позволяет вам направлять запросы к файловой системе через VFS обратно в пространство пользователя. Поэтому, если вы задумывались о создании собственной файловой системы, то это отличный шанс для того, чтобы начать. ЗаключениеНесмотря на то, что реализация файловой системы отнюдь не тривиальна, она является отличным примером расширяемой и масштабируемой архитектуры. Архитектура файловой системы развивалась годами, при этом поддерживая множество типов файловых систем и множество типов устройств хранения. Будет интересно посмотреть на развитие в ближайшем будущем файловой системы Linux, использующей архитектуру дополнений с несколькими уровнями преобразования функций.
|
|