Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #96, ДЕКАБРЬ 2006 г.

Занимательная GEOM’етрия

Евгений Зобнин ака j1m

Хакер, номер #096, стр. 096-116-5


Рассмотрим, как происходит чтение блоков данных, запрашиваемых файловой системой. Ситуация такая: на разделе /dev/ad0s1a создана ФС, она запрашивает пятый блок раздела. Что же при этом происходит? Экземпляр класса bsd знает только ограниченный объем информации - то, что некое адресное пространство (он и понятия не имеет, что это один из слайсов диска), представленное поставщиком экземпляра класса, расположенного на одно звено ниже, разделено на 2 раздела. Эту информацию он берет из заголовка, находящегося в начале адресного пространства. Обязанность экземпляра класса bsd - правильно вычислить смещение, чтобы попасть именно в тот блок, который запрашивает ФС. Чтобы это сделать, необходимо сложить смещение от начала раздела и номер блока. Раздел, с которого ФС запрашивает блок, является первым, поэтому в результате получается опять же пятый блок. Экземпляр класса bsd отправляет запрос на чтение пятого блока ниже. Экземпляр mbr, который точно так же видит ниже только адресное пространство, получает запрос, подвергает его обработке и отправляет запрос еще ниже - поставщику disk, который направляет запрос драйверу ATA-контроллера. В результате файловая система получает именно тот блок, какой и заказывала. На самом деле, конечно же, все сложнее (при вычислении адреса класс должен учитывать заголовки, пересчитывать размеры блоков и тому подобное), но не будем вдаваться в подробности.

Отдельные классы механизма GEOM очень ограничены в «знаниях» о друг друге. Информация, представляемая поставщиками, сводится лишь к данным об имени, размере сектора и общего размера адресного пространства. Отсутствие перекрестных ссылок между классами и общая немногословность каждого из них делает GEOM очень гибким, не привязанным к конкретной топологии, механизмом. Чтобы получить возможность работы с разделами Apple, достаточно заменить экземпляр класса mbr на экземпляр класса apple. А чтобы задействовать шифрование, достаточно подключить экземпляр шифрующего класса к любому поставщику. GEOM безразлично, каким образом будут распределены экземпляры классов, но некоторые классы откажутся инициализироваться, если не будут соблюдены определенные условия. Например, класс mbr требует наличия в адресном пространстве валидной метки MBR, и в случае ее отсутствия экземпляр не будет включен в цепь.

Пара слов об авторе GEOM

Механизм GEOM был спроектирован и реализован легендарным FreeBSD-хакером Полом-Хеннингом Кампом (Poul-Henning Kamp) при спонсорской поддержке NAI Labs. Первая alpha-версия кода была создана для FreeBSD 4.9, а после выхода релиза 5.0 GEOM стал официальной частью ядра. На развитие и реализацию идеи GEOM автору потребовалось около восьми лет. Причины такой длительной разработки он объясняет словами: «Я хотел сделать это правильно».

Назад на стр. 096-116-4  Содержание  Вперед на стр. 096-116-6