Отношение между “Размером блока” и “Верхними пределами” в ext2

Вопрос или проблема

Похожий вопрос спрашивает о том, почему верхний предел размера файла может быть 2 ТБ в ext2. Я пытаюсь понять, но документация по ext2 кажется мне сложной. Поправьте меня, если я ошибаюсь:

  • Блоки могут быть размером 1 – 4 КБ
  • доступное количество блоков основывается на 32-битном значении: 232 = 4.294.967.296 блоков

В документации я нашел: 231-1 = 2.147.483.647 адресуемых блоков. Мне не хватает 2.147.483.649 блоков.

Мое предположение заключается в том, что это «зарезервировано» для Суперблока, Описателей группы блоков, их резервных копий и т.д. (правильно?)

Вопрос

Как именно рассчитываются ограничения размера файлов в ext2

И, заранее спрашиваю: возможно ли это перевести на ext3 и ext4 (или другие файловые системы…) – я все еще далек от них и не ленюсь разобраться сам; просто запутался, откуда берутся основы.

Ответ вводит меня в замешательство.

Смотрите исходный код ext2 (он менее 9K строк, совсем не страшно), функция ext2_block_to_path.

Здесь поле i_block (обозначающее номер блока) определено как long, что означает знаковый long. i_block проверяется на неотрицательность, установка предела на 2^31 блоков в файловой системе. Смотрите комментарий:

Указание по переносимости: последнее сравнение (проверка того, умещаемся ли мы в тройной косвенный блок) написано по-другому, потому что иначе на
архитектуре с 32-битными long и 8Кб страницами мы можем попасть в неприятности,
если у нашей файловой системы были блоки по 8Кб. Мы могли бы использовать long long, но это убьет нас на x86. Ну, по крайней мере, знаковое расширение не имеет значения -
i_block должен был быть отрицательным в самом начале, так что мы бы вообще не дошли до этого.

Чего я совершенно не понимаю, так это почему эта функция не определяет i_block как _le32, что является __u32 беззнаковым 32-битным целым числом как в определении inode и в некоторых других местах?

Теперь, если вам интересно, что ограничивает размеры в этой таблице,

  • блоки файловой системы ограничиваются неотрицательными значениями в типе long (2^31)
  • лимиты блоков на группу и инодов на группу определяются картой блоков/инодов. Каждый блок/инов занимает 1 бит в соответствующей карте блоков/инодов, и сама карта занимает целый блок. Таким образом, если блок 1024 байта, то существует 1024 байта * 8 бит/байт = 8K блоков на группу
  • байт на группу блоков – блоков на группу * размер блока. Для блоков размером 1024 байта получается 8K блоков/группу * 1024 байта/блок = 8 МиБ/группу
  • размер файловой системы (Linux) – как упоминалось в комментариях, поле i_blocks inode, представляющее общее количество блоков в inode, странным образом работает с секторами по 512 байт, а не с реальными блоками.
  • блоки на файл – определяются 3-уровневыми косвенными блоками. При блоках размером 1024 байта мы можем вписать 256 указателей = 2^8 указателей в каждый блок, что приводит к 2^24 блоков на файл = 16 миллионов блоков/файл
  • размер файла – умножать блоки на файл на размер блока, что для блоков размером 1024 байта приводит к файлам размером 16 миллиардов байт (16 ГиБ).

Ответ или решение

Вопрос относительного предела размера файла в файловой системе ext2, его связи с размером блока и другими параметрами вызывает значительный интерес в среде ИТ-специалистов. Рассмотрим, как именно определяется этот предел, и каким образом различные элементы файловой системы взаимосвязаны.

Определение максимального размера файла в ext2

Файловая система ext2 была разработана для работы с блоками от 1 до 4 КБ. Этот параметр имеет решающее значение, так как от его величины зависят многие количественные характеристики файловой системы. Основываясь на структуре inode и блоках, выделим ключевые моменты:

  1. Количество доступных блоков: Хотя значение блока хранится как 32-битное число, что могло бы означать 4 294 967 296 блоков (2^32), фактически используется 2 147 483 647 блоков (2^31-1). Снижение на один бит объясняется использованием знакового типа данных long, которое участвует в расчете количества блоков, так как i_block должно быть неотрицательным. Частично это уменьшение вызвано необходимостью резервирования некоторой части для структурных данных, таких как Суперблоки и Дескрипторы групп блоков.

  2. Максимальный размер файла: Предел размера файла определяется максимальным количеством блоков, которое может быть адресовано из одного inode. Это прямое следствие от трехуровневой схемы косвенной адресации:

    • Прямые ссылки: 12 ссылок
    • Одинарные косвенные ссылки могут обращаться к 256 блокам (при размере блока 1024 байта), так же как двойные и тройные косвенные ссылки увеличивают адресуемое пространство экспоненциально. Это приводит к возможности использования до 16 миллионов блоков на файл при условии 1024-байтного блока, что затем составляет 16 ГБ на файл.
  3. Размер блока и его влияние: Размер блока тесно связан с количеством блоков на группу и инодов на группу, которые определяются размером битовых карт групп блоков и инодов.

Применение на ext3 и ext4

В ext3 и ext4 эти принципы также применимы, но с учетом модернизаций:

  • Ext3: в основном это ext2 с добавлением механизма журнала, что увеличивает его стабильность и надежность.
  • Ext4: значительно расширяет пределы благодаря введению экзабайтных объемов и благодаря более гибкому формату адресации.

Заключение

Понимание и управление параметрами файловой системы, такими как размер блока и максимальное количество блоков, критично для оптимального использования ext2 и наследующих его файловых систем. Хотя ext3 и ext4 предоставляют улучшения, основные концепции остаются прежними. Для детального изучения лучшим подходом будет изучение исходного кода, который позволит глубже понять структуру и ограничения, свойственные этим системам.

Оптимизация контента для SEO и высокий уровень профессионализма обеспечивают эффективность ответа, подходящего как для технических специалистов, так и для системных администраторов. Изучение базовых и современных файловых систем – важный вклад в развитие сферы ИТ.

Оцените материал
Добавить комментарий

Капча загружается...