В файловой системе ext2fs жесткий диск физически разбит на секторы размером 512 байт. Первый (нулевой) сектор дискового раздела в любой ОС считается загрузочной областью. В первичном разделе содержится загрузочная запись, на других разделах загрузочная область не используется.
Остальные секторы диска объединены в логические блоки размером 1,2 или 4 килобайт. Логический блок — это наименьшая адресуемая порция данных: любой файл занимает целое число блоков. Чем больше размер блока, тем меньше обращений к диску, но и выше процент неиспользуемого места.
Блоки объединяются в группы блоков. Группы блоков и блоки внутри групп последовательно нумеруются с 1. Первый блок на диске имеет номер 1 и принадлежит группе блоков с номером 1. Общее число блоков во всех группах является делителем объема диска, выраженного в секторах. Число групп блоков не обязано быть делителем числа блоков, так как последняя группа блоков может быть неполной. Начало каждой группы блоков имеет адрес, вычисляемый как
(номер_группы - 1)×(число_блоков_в_группе)
Структура файловой система ext2fs описана в файле ext2_fs.h в каталоге /usr/include/linux/.
Раздел диска с файловой системой ext2fs имеет следующую логическую структуру:
Загрузочный
сектор
Суперблок
Группа
блоков
Группа
блоков
…
Группа
блоков
Суперблок (superblock) хранит всю информацию о файловой системе. Он имеет размер 1024 байта и располагается по смещению 1024 байта от начала файловой системы. В суперблоке определяются:
— размер файловой системы;
— максимальное число файлов в разделе;
— количество свободных блоков;
— список свободных блоков в файловой системе;
— индексный дескриптор следующего свободного блока в списке свободных блоков;
— размер списка индексных дескрипторов;
— количество свободных индексных дескрипторов;
— следующий свободный индексный дескриптор;
— другие служебные поля.
При загрузке ОС суперблок считывается в оперативную память. Все изменения в файловой системе находят отражение сначала в копии суперблока в оперативной памяти. Эта копия периодически записывается на диск для согласования полей суперблока и реальным состоянием файловой системы.
Каждая группа блоков имеет следующую структуру:
Копия
суперблока
Описание
группы
блоков
Битовая
карта
блоков
Битовая карта
индексных
дескрипторов
Таблица
индексных
дескрипторов
Область
блоков
данных
Суперблок одинаков для всех групп и является копией основного суперблока. Это позволяет восстановить суперблок в случае сбоев.
Описание (дескриптор) группы блоков позволяет найти битовые карты блоков и индексных дескрипторов, а также таблицу индексных дескрипторов.
Битовая карта блоков (block bitmap) — это структура, каждый бит которой показывает, отведен ли такой же по счету блок какому-либо файлу. Если бит равен 1, то блок занят. Битовая карта служит для поиска свободных блоков, когда необходимо выделить место под файл. Битовая карта блоков занимает число блоков, равное
Каждому файлу соответствует один и только один дескриптор (i-node, информационный узел), который идентифицируется своим индексом (номером). В индексном дескрипторе хранятся метаданные файла и указатель на собственно данные.
Для обычного файла или каталога этот указатель представляет массив из 15 адресов блоков. Первые 12 адресов — это ссылки на номера блоков, в которых хранятся данные файла. Если, например, размер блока равен 4 килобайт, то эти 12 адресов используются для файлов с максимальным размером 4×12=48 килобайт.
Номер i-node
Длина записи
Длина имени файла
Имя файла
Номер i-node
Длина записи
Длина имени файла
Имя файла
…
Если файл имеет больший размер, то используется 13-й адрес, указывающий на номер блока, в котором хранится список адресов следующих блоков (относительная адресация). Т.к. адрес блока занимает 4 байта, то при размере блока 4 килобайт с помощью 13-го поля можно указать на 4096/4=1024 блока. 14-й адрес используется для двойной относительной адресации: а нем указывается адрес блока, в котором хранятся адреса блоков относительной адресации. 15-й адрес используется для тройной относительной адресации по аналогичному принципу.
Т.о., максимальный размер файловой системы равен (12+1024×1024×1024) ×4»4 терабайт.
Имя файла не хранится в индексном дескрипторе, а хранится только в каталоге, к которому приписан файл. Структура каталога в файловых системах ext2fs и ext3fs имеет вид, представленный на рисунке. Исходя из подобной структуры, можно сделать следующие выводы:
— одному индексному дескриптору может соответствовать множество имен, приписанных к разным каталогам. Количество имен (жестких ссылок) учитывается в индексном дескрипторе. Это количество отображает команда ls -l;
— удаление файла означает просто удаление записи о нем из каталога и уменьшения на 1 счетчика ссылок;
— сопоставить имя номеру индексного дескриптора можно только внутри одной файловой системы: именно поэтому нельзя создать жесткую ссылку на файл в другой файловой системе.