2004 г.
Linux для пользователя
Виктор Костромин,
http://rus-linux.net/
Глава 16. Обратная сторона файловой системы
16.2. Структура дискового раздела в ext2fs
Производители жестких дисков обычно поставляют свои изделия отформатированными на низком уровне. Насколько я знаю, это означает, что все дисковое пространство с помощью специальных меток разбито на "сектора", размером 512 байт. Такой диск (или дисковый раздел) должен быть подготовлен для использования в определенной операционной системе. В MS-DOS или Windows процедура подготовки называется форматированием, а в Linux — созданием файловой системы. Создание файловой системы ext2fs заключается в создании в разделе диска определенной логической структуры. Эта структура строится следующим образом.
Во-первых, на диске выделяется загрузочная область. Загрузочная область создается в любой файловой системе. На первичном разделе она содержит загрузочную запись — фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Все остальное пространство на диске делится на блоки. Блок может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой единицей дискового пространства. Выделение места файлам осуществляется целыми блоками, поэтому при выборе размера блока приходится идти на компромисс. Большой размер блока, как правило, сокращает число обращений к диску при чтении или записи файла, но зато увеличивает долю нерационально используемого пространства, особенно при наличии большого числа файлов маленького размера.
Блоки, в свою очередь, объединяются в группы блоков (рис. 16.1). Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ((номер_группы — 1)* (число_блоков_в_группе)).
Загрузочная запись | Группа блоков 1 | Группа Блоков 2 | ... | Группа блоков n |
Рис.16.1. Структура дискового раздела в ext2fs
Каждая группа блоков имеет одинаковое строение:
Супер-блок | Описание группы блоков (Group Descriptors) | Битовая карта блоков (Block Bitmap) | Битовая карта индексных дескрипторов (Inode Bitmap) | Таблица индексных дескрипторов(Inode Table) | Область блоков данных |
Такая структура служит повышению производительности файловой системы за счет того, что сокращается расстояние между таблицей индексных дескрипторов и блоками данных, а, следовательно, сокращается время поиска нужного места головками в процессе операций записи/считывания файла.
Первый элемент каждой группы блоков (суперблок) одинаков для всех групп, а все остальные — индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков. Суперблок является начальной точкой файловой системы. Он имеет размер 1024 байта и всегда располагается по смещению 1024 байта от начала файловой системы. Наличие нескольких копий суперблока объясняется чрезвычайной важностью этого элемента файловой системы. Дубликаты суперблока используются при восстановлении файловой системы после сбоев.
Информация, хранимая в суперблоке, используется для организации доступа к остальным данным на диске. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память, и все изменения файловой системы вначале находят отображение в копии суперблока, находящейся в ОП, и записываются на диск только периодически. Это позволяет повысить производительность системы, так как многие пользователи и процессы постоянно обновляют файлы. С другой стороны, при выключении системы суперблок обязательно должен быть записан на диск, что не позволяет выключать компьютер простым выключением питания. В противном случае, при следующей загрузке информация, записанная в суперблоке, окажется не соответствующей реальному состоянию файловой системы.
Структура суперблока приведена в табл. 16.2.
Таблица 16.4. Структура суперблока
Название поля | Тип | Комментарий |
s_inodes_count | ULONG | Число индексных дескрипторов в файловой системе |
s_blocks_count | ULONG | Число блоков в файловой системе |
s_r_blocks_count | ULONG | Число блоков, зарезервированных для суперпользователя |
s_free_blocks_count | ULONG | Счетчик числа свободных блоков |
s_free_inodes_count | ULONG | Счетчик числа свободных индексных дескрипторов |
s_first_data_block | ULONG | Первый блок, который содержит данные. В зависимости от размера блока, это поле может быть равно 0 или 1. |
s_log_block_size | ULONG | Индикатор размера логического блока: 0 = 1 Кб; 1 = 2 Кб; 2 = 4 Кб. |
s_log_frag_size | LONG | Индикатор размера фрагментов (кажется, понятие фрагмента в настоящее время не используется) |
s_blocks_per_group | ULONG | Число блоков в каждой группе блоков |
s_frags_per_group | ULONG | Число фрагментов в каждой группе блоков |
s_inodes_per_group | ULONG | Число индексных дескрипторов (inodes) в каждой группе блоков |
s_mtime | ULONG | Время, когда в последний раз была смонтирована файловая система. |
s_wtime | ULONG | Время, когда в последний раз производилась запись в файловую систему |
s_mnt_count | USHORT | Счетчик числа монтирований файловой системы. Если этот счетчик достигает значения, указанного в следующем поле (s_max_mnt_count), файловая система должна быть проверена (это делается при перезапуске), а счетчик обнуляется. |
s_max_mnt_count | SHORT | Число, определяющее, сколько раз может быть смонтирована файловая система |
s_magic | USHORT | "Магическое число" (0xEF53), указывающее, что файловая система принадлежит к типу ex2fs |
s_state | USHORT | Флаги, указывающее текущее состояние файловой системы (является ли она чистой (clean) и т.п.) |
s_errors | USHORT | Флаги, задающие процедуры обработки сообщений об ошибках (что делать, если найдены ошибки). |
s_pad | USHORT | Заполнение |
s_lastcheck | ULONG | Время последней проверки файловой системы |
s_checkinterval | ULONG | Максимальный период времени между проверками файловой системы |
s_creator_os | ULONG | Указание на тип ОС, в которой создана файловая система |
s_rev_level | ULONG | Версия (revision level) файловой системы. |
s_reserved | ULONG[235] | Заполнение до 1024 байт |
Вслед за суперблоком расположено описание группы блоков (Group Descriptors). Это описание представляет собой массив, имеющий структуру, приведенную в табл. 16.3.
Таблица 16.3. Структура описания группы блоков
Название поля | Тип | Назначение |
bg_block_bitmap | ULONG | Адрес блока, содержащего битовую карту блоков (block bitmap) данной группы |
bg_inode_bitmap | ULONG | Адрес блока, содержащего битовую карту индексных дескрипторов (inode bitmap) данной группы |
bg_inode_table | ULONG | Адрес блока, содержащего таблицу индексных дескрипторов (inode table) данной группы |
bg_free_blocks_count | USHORT | Счетчик числа свободных блоков в данной группе |
bg_free_inodes_count | USHORT | Число свободных индексных дескрипторов в данной группе |
bg_used_dirs_count | USHORT | Число индексных дескрипторов в данной группе, которые являются каталогами |
bg_pad | USHORT | Заполнение |
bg_reserved | ULONG[3] | Заполнение |
Размер описания группы блоков можно вычислить как
(размер_группы_блоков_в_ext2 * число_групп) / размер_блока,
при необходимости округляем.
Информация, которая хранится в описании группы, используется для того, чтобы найти битовые карты блоков и индексных дескрипторов, а также таблицу индексных дескрипторов. Не забывайте, что блоки и группы блоков нумеруются, начиная с 1.
Битовая карта блоков (block bitmap) — это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл, Битовая карта блоков занимает число блоков, равное (число_блоков_в_группе / 8) / размер_блока (при необходимости округляем).
Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает, какие именно дескрипторы заняты.
Следующая область в структуре группы блоков служит для хранения таблицы индексных дескрипторов файлов. Структура самого индексного дескриптора подробнее рассматривается ниже в разд. 16.3.
И, наконец, все оставшееся место в группе блоков отводится для хранения собственно файлов.