С логической точки зрения ФС образуется за счёт двух элементов: массива индексных дескрипторов и системы каталогов, связывающих имена файлов с номерами индексных дескрипторов. Индексные дескрипторы хранят метаинформацию файлов и ссылки на блоки данных файлов. Каталоги объединены в дерево с двунаправленной системой ссылок между узлами.
Дисковое пространство в ext2fs разбивается на логические блоки размером 1, 2 или 4 КБ. Блоки используются под хранение нескольких служебных структур, массива индексных дескрипторов и, собственно, под хранение содержимого файлов. Для оптимизации времени доступа блоки поделены на группы. По возможности индексный дескриптор файла и его данные размещаются в пределах одной группы, что снижает время на перемещение головок по диску.
В одном из начальных блоков (со смещением 1024 байта от начала раздела) размещается Суперблок – структура данных размером 1024 байта, описывающая основные настраиваемые параметры ФС. В этих параметрах задаётся размер блока, количество индексных дескрипторов, количество блоков, отведенных под хранение данных и т.п. Размер блока влияет на потери дискового пространства в "хвостах" файлов (больше блок – больше потери) и на максимальную длину файла (больше блок – больше максимальная длина). Количество индексных дескрипторов определяет максимальное число объектов, которые могут быть размещены в данной ФС.
Для повышения надёжности Суперблок дублируется в начале каждой группы. За ним следует массив дескрипторов групп, который также дублируется во всех группах. Далее идут битовые карты свободных индексных дескрипторов и свободных блоков данных группы. Эти битовые карты нужны для быстрого создания файлов и быстрого выделения блоков хранения данных. Далее находятся область хранения индексных дескрипторов и область хранения данных.
Структура группы блоков в ext2fs
Суперблок |
Массив дескрипторов групп |
Карта свободных блоков |
Карта свободных индексных дескрипторов |
Массив индексных дескрипторов |
Блоки данных |
Дублируются во всех группах блоков для надёжности |
|
Данные, индивидуальные для каждой группы |
|
|
|
Суперблок
поле |
описание |
s_inodes_count |
Число индексных дескрипторов во всей ФС |
s_blocks_count |
Число блоков, отведённых под ФС |
s_r_blocks_count |
Число зарезервированных блоков данных |
s_free_blocks_count |
Число свободных блоков данных |
s_free_inodes_count |
Число свободных индексных дескрипторов |
s_first_data_block |
Адрес первого блока данных |
s_log_block_size |
Размер блока |
s_log_frag_size |
|
s_blocks_per_group |
Число блоков в группе |
s_frags_per_group |
|
s_inodes_per_group |
Число индексных дескрипторов в группе |
s_mtime |
Время последнего монтирования |
s_wtime |
Время последней записи |
s_mnt_count |
Количество монтирований |
s_max_mnt_count |
Количество монтирований без проверки на ошибки |
s_magic |
Магическое число ex2fs |
s_state |
Флаг "чистого" выключения |
.... |
|
s_reserved[235] |
дополнение до 1024 байтов |
Дескриптор группы
поле |
описание |
bg_block_bitmap |
Адрес битовой карты свободных блоков |
bg_inode_bitmap |
Адрес битовой карты свободных индексных дескрипторов |
bg_inode_table |
Адрес таблицы индексных дескрипторов |
bg_free_blocks_count |
Количество свободных блоков в группе |
bg_free_inodes_count |
Количество свободных индексных дескрипторов в группе |
bg_used_dirs_count |
Количество каталогов группе (для fsck, например) |
bg_pad |
выравнивание до удобного размера |
Поля индексного дескриптора
поле |
описание |
i_mode |
Тип, suid, sgid, sticky, права доступа |
i_uid |
Владелец |
i_size |
Размер |
i_atime |
Access time |
i_ctime |
Creation time |
i_mtime |
Modification time |
i_dtime |
Deletion Time |
i_gid |
Группа |
i_links_count |
Число имён |
i_blocks |
Число занимаемых блоков |
i_flags |
Флаги |
i_reserved1 |
|
i_block[15] |
Указатели на блоки данных |
i_version |
Версия (для NFS) |
i_file_acl |
File ACL |
i_dir_acl |
Directory ACL |
.... |
прочее, дополненное до удобного размера |
Указатели на блоки данных
номер |
описание |
1 |
адрес блока или 0 |
... |
... |
12 |
адрес блока или 0 |
13 |
адрес блока косвенной адресации или 0 |
14 |
адрес блока двойной косвенной адресации или 0 |
15 |
адрес блока тройной косвенной адресации или 0 |
Блоки адресуются с единицы. Ноль в указателе означает, что блок не выделялся.
Зарезервированные номера индексных дескрипторов
идентификатор |
номер |
Описание |
EXT2_BAD_INO |
1 |
Сбойные блоки |
EXT2_ROOT_INO |
2 |
Корневой каталог |
EXT2_ACL_IDX_INO |
3 |
ACL (списки доступа) |
EXT2_ACL_DATA_INO |
4 |
ACL (списки доступа) |
EXT2_BOOT_LOADER_INO |
5 |
Загрузчик |
EXT2_UNDEL_DIR_INO |
6 |
Каталог для восстановления стёртых файлов |
EXT2_FIRST_INO |
11 |
Первый нормальный inode. Часто занят каталогом lost+found |
Запись в каталоге
поле |
описание |
inode |
Номер индексного дескриптора |
rec_len |
Длина записи |
name_len |
Длина имени файла |
name |
Имя файла (переменной длины до 255 символов) |
Простая программа для проверки максимальной длины имени
F=""
for I in {1..1024};do
F=${F}Z
if touch $F; then
rm $F
else
echo "Maximum name length="$((I-1))
break
fi
done 2>/dev/null
Ссылки
http://uranus.chrysocome.net/explore2fs/es2fs.htm