Алексей Стахнов - Linux
Ext2 использует отдельное поле в суперблоке для индикации состояния файловой системы. Если файловая система смонтирована в режиме read/write, то ее состояние устанавливается как Not Clean. Если же она демонтирована или смонтирована заново в режиме read-only, то ее состояние устанавливается в Clean. Во время загрузки операционной системы и проверки состояния файловой системы эта информация используется для определения необходимости такой проверки. Ядро также помещает в это поле некоторые ошибки. При определении ядром какого-либо несоответствия файловая система помечается как Erroneous.
Длительное отсутствие проверки может привести к проблемам функционирования файловой системы, поэтому Ext2 включает в себя два метода для организации принудительной проверки. В суперблоке содержится счетчик монтирования системы. Этот счетчик увеличивается каждый раз, когда система монтируется в режиме read/write. Если его значение достигает максимального значения (оно также хранится в суперблоке), то запускается программа проверки файловой системы, даже если ее состояние является Clean. В суперблоке также хранится последнее время проверки, и максимальный интервал между проверками. При превышении этого интервала также запускается программа проверки файловой системы.
В системе Ext2 имеются утилиты для ее настройки. Так, программа tune2fs используется для определения порядка действий при обнаружении ошибки. Может быть выполнено одно из трех следующих действий:
• продолжение выполнения;
• монтирование файловой системы заново в режиме read-only;
• перезагрузка системы для проверки файловой системы.
Кроме того, эта программа позволяет задать:
• максимальное значение числа монтирований файловой системы;
• максимальный интервал между проверками файловой системы;
• количество логических блоков, зарезервированных для пользователя root.
Физическая структура Ext2
Как и во многих файловых системах, в Ext2 существует загрузочная область. На первичном разделе (primary, в терминологии программы Fdisk фирмы Microsoft) она содержит загрузочную запись – фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. Все остальное пространство раздела делится на блоки стандартного размера. Блок может иметь размер 1, 2 или 4 Кбайт. Блок является минимальной логической единицей дискового пространства (в других операционных системах такой блок называют кластером). Выделение места файлам осуществляется целыми блоками.
Блоки, в свою очередь, объединяются в группы блоков. Каждая группа блоков имеет одинаковое строение. Рассмотрим подробнее их структуру (рис. 4.1).
Рис. 4.1. Структура группы блоков
Суперблок (Superblock) Описание группы блоков (Group Descriptors) Битовая карта блока (Block Bitmap) Битовая карта индексного дескриптора (Inode Bitmap) Таблица индексных дескрипторов (Inode Table) Блоки данных
Суперблок одинаков для всех групп, все же остальные поля индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков, является начальной точкой файловой системы, имеет размер 1024 байта и располагается по смещению 1024 байта от начала файловой системы. Копии суперблока используются при восстановлении файловой системы после сбоев.
Информация в суперблоке служит для доступа к остальным данным на диске. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства. При старте операционной системы суперблок считывается в память, и все изменения файловой системы сначала записываются в копию суперблока, находящуюся в оперативной памяти, и только затем сохраняются на диске. При описании структуры суперблока используются следующие значения:
• SHORT – короткое целое – 1 байт;
• USHORT – беззнаковое короткое целое – 1 байт;
• LONG – длинное целое – 4 байта;
• ULONG – беззнаковое длинное целое – 4 байта.
Структура суперблока приведена в приложении I (табл. П1.1).
После суперблока следует являющееся массивом описание группы блоков (Group Descriptors). Структура описания группы блоков приведена в приложении I (табл. П1.2).
Битовая карта блоков (Block Bitmap) – это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл.
Битовая карта индексных дескрипторов (Inode Bitmap) выполняет аналогичную функцию по отношению к таблице индексных дескрипторов – показывает, какие дескрипторы заняты.
Индексные дескрипторы файлов
Индексные дескрипторы файлов содержат информацию о файлах группы блоков. Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером – индексом файла. Отсюда следует, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов. Структура индексного дескриптора файла приведена в приложении 1 (табл. П1.3).
Поле типа и прав доступа к файлу (i_mode) представляет собой слово, каждый бит которого служит флагом. Список флагов, описывающих тип и права доступа к файлу, приведен в приложении 1 (табл. П1.4).
Некоторые индексные дескрипторы используются файловой системой в специальных целях. Описание специальных индексных дескрипторов приведено в приложении 1 (табл. П1.5).
Каталог, по сути, является специальным файлом, содержимое которого состоит из записей определенной структуры. Структура записи в файле каталога приведена в приложении 1 (табл. П1.6).
Система адресации данных
Система адресации данных позволяет находить нужный файл среди блоков на диске. В Ext2 система адресации реализуется полем i_block индексного дескриптора файла.
Поле i_block в индексном дескрипторе файла представляет собой массив из 15 адресов блоков. Первые 12 адресов в этом массиве (EXT2 NDIR BLOCKS [12]) представляют собой прямые ссылки на номера блоков, в которых хранятся данные из файла. Следующий адрес в этом массиве является косвенной ссылкой (адресом блока), в котором хранится список адресов следующих блоков с данными из этого файла. Следующий адрес в поле i_block индексного дескриптора указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые, в свою очередь, содержат списки адресов следующих блоков данных того файла, который задается индексным дескриптором.
Последний адрес в поле i_block индексного дескриптора задает адрес блока тройной косвенной адресации, т. е. блока со списком адресов блоков, которые являются блоками двойной косвенной адресации.
Оптимизация производительностиФайловая система Ext2 при операциях ввода/вывода использует буферизацию данных. При считывании блока информации ядро выдает запрос операции ввода/вывода на несколько расположенных рядом блоков. Такие oneрации сильно ускоряют извлечение данных при последовательном считывании файлов.
При занесении данных в файл файловая система Ext2, записывая новый блок, заранее размещает рядом до 8 смежных блоков. Такой метод позволяет размещать файлы в смежных блоках, что ускоряет их чтение и дает возможность достичь высокой производительности системы.
Средства управления файловой системы Ext2Средства управления файловой системы служат для создания, модификации и коррекции любых искажений файловой структуры:
• mke2fs – применяется для установки дискового раздела, содержащего пустую файловую систему Ext2;
• tune2fs – используется для настройки параметров файловой системы;
• e2fsck – предназначена для устранения несоответствий в файловой системе;
• ext2ed – применяется для правки файловой системы;
• debugfs – предназначена для определения и установки состояния файловой системы.
Программа e2fsck спроектирована таким образом, что выполняет проверку с максимально возможной скоростью. В первом проходе e2fsck просматривает все индексные дескрипторы файловой системы и проверяет их как отдельные элементы системы. Также проверяются карты битов, указывающие использование блоков и дескрипторов.
Если e2fsck находит блоки данных, номера которых содержатся более чем в одном дескрипторе, то запускаются проходы с IB по 1D для устранения несоответствия: либо путем увеличения разделяемых блоков, либо удалением одного или более дескрипторов.
Во втором проходе производится проверка каталогов как отдельных элементов файловой системы. Блок каждого каталога проверяется отдельно, без ссылки на другие блоки каталогов. Для первого блока каталога в каждом дескрипторе каталога, проверяется существование записей "." (ссылка на себя) и ".." (ссылка на родительский каталог), и соответствие номера дескриптора для записи "." текущему каталогу.
В третьем проходе проверяются связи каталогов. Программа e2fsck проверяет пути каждого каталога по направлению к корневому. В этом же проходе проверяется запись ".." для каждого каталога. Все каталоги, не имеющие связи с корневым каталогом, помещаются в каталог /lost+found.