Структуры данных ext2fs

С логической точки зрения ФС образуется за счёт двух элементов: массива индексных дескрипторов и системы каталогов, связывающих имена файлов с номерами индексных дескрипторов. Индексные дескрипторы хранят метаинформацию файлов и ссылки на блоки данных файлов. Каталоги объединены в дерево с двунаправленной системой ссылок между узлами.

Дисковое пространство в 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