среда, 19 сентября 2012 г.

Анатомия ZFS часть IV

При написании данного цикла статей использовался документ ZFS On-Disk Specification,Sun Microsystems


1.2.         Data Management Unit (DMU)

Единицей управления данными – DMU (Data Management Unit) в ZFS называют блоки и их группы, логически сгруппированные в объекты. Объекты, в свою очередь, могут быть сгруппированы в наборы объектов (object sets).

1.3.1. Объекты

За исключением небольшого количества элементов инфраструктуры, описанных выше, все в ZFS является объектами. Список объектов ZFS приводится ниже.

· DMU_OT_NONE – Нераспределенный объект
· DMU_OT_OBJECT_DIRECTORY – Объект DSL «директория» ZAP
· DMU_OT_OBJECT_ARRAY – Объект, используемый для хранения массива объектов
· DMU_OT_PACKED_NVLIST – Упакованный nvlist
· DMU_OT_SPACE_MAP – Список использованных дисковых блоков
· DMU_OT_INTENT_LOG – Журнал намерений (Intent Log)
· DMU_OT_DNODE – Объект dnode (или metadnode)
· DMU_OT_OBJSET – Набор объектов
· DMU_OT_DSL_DATASET_CHILD_MAP – Объект DSL ZAP, содержащий дочерние данные DSL директорий
· DMU_OT_DSL_OBJSET_SNAP_MAP – Объект DSL ZAP, содержащий информацию о снапшоте датасета
·  DMU_OT_DSL_PROPS – Объект DSL ZAP, содержащий свойства DSL директории
· DMU_OT_BPLIST – Список указателей блоков, используемый для хранения «мертвого списка» (deadlist): списка указателей блоков, удаленных с момента последнего снапшота, и «отложенного списка освобождения», используемого при синхронизации
· DMU_OT_BPLIST_HDR – Заголовок списка указателей блоков, используется для хранения физической структуры списка указателей блоков
· DMU_OT_ACL – Список контроля доступа (ACL)
· DMU_OT_PLAIN_FILE – Плоский файл ZPL
· DMU_OT_DIRECTORY_CONTENTS – Директория ZPL
· DMU_OT_MASTER_NODE – Главная нода ZPL: идентифицирует корневую директорию, очередь удаления и версию файловой системы
· DMU_OT_DELETE_QUEUE – Очередь удаления представляет собой список удаления «в процессе» для случаев, когда файловая система находится в отключенном или переходном состоянии, например, как результат принудительного размонтирования или , например, после отключения питания
· DMU_OT_ZVOL – Том ZFS (ZFS Volume)
· DMU_OT_ZVOL_PROP – Свойство ZVOL

Объекты определяются в 512-байтных структурах, называемых d-нодами (dnodes).  D-ноды определяют и организуют совокупности блоков, образующих объект.

D-нода (структура dnode_phys_t) содержит несколько полей фиксированной длины и два поля переменной длины:

dn_type – 8-битное целое, определяющее тип объекта. Типы объектов описаны в разделе 1.2.7.
dn_indblkshift и dn_datablkszsec ZFS поддерживает различные прямые и непрямые блоки размером от 512 байт до 128 Кбайт.
·   dn_indblkshift – 8-битное целое, определяющее (по основанию 2) размер в байтах косвенных блоков данного объекта
·  dn_datablkszsec – 16-битное целое, содержащее размер блока данных (в байтах) поделенный на 512 (размер дискового сектора). Может принимать значение от 1 (1 сектор размером 512 байт) до 256 (блок размером 128 К)
dn_nblkptr и dn_blkptrполе переменной длины, содержащее от одного до трех блочных указателей. Количество блочных указателей d-ноды определяется в момент ее создания и остается неизменным на протяжении всей жизни d-ноды.
·  dn_nblkptr – 8-битное целое, содержащее число блочных указателей d-ноды
· dn_nblkptr – массив блочных указателей, содержащий dn_nblkptr блочных указателей
dn_nlevels8-битное целое, содержащее количество уровней объекта; часто называется уровнями косвенности.
      
   Косвенность. D-нода содержит ограниченное количество прямых указателей на объекты. Это лимитирует прямо адресуемый объект объемом 384 Кбайт. Для увеличения адресуемых объектов используется механизм косвенных блочных указателей, который, подобно тому, как это реализовано в UFS, позволяет образовать иерархию ссылок, расширяющую адресуемое пространство объекта. ZFS поддерживает до 6 уровней иерархии, что позволяет адресовать максимальный объект объемом 264 байт.

dn_maxblkid – определяет наибольший id блока нулевого уровня иерархии.

Блоки объектов идентифицируются по их id. Блоки каждого уровня иерархии нумеруются начиная от 0 до N, где первый блок для заданного уровня имеет id 0, второй id 1 и так далее.

dn_secphys – сумма всех значений asize блочных указателей (прямых и косвенных) для данного объекта.
dn_bonus, dn_bonuslen и dn_bonustype – бонусный буфер (db_bonus) определяется как пространство, следующее за блочным указателем d-ноды. Объем этого пространства зависит от типа объекта и может составлять от 64 до 320 байт.
· dn_bonus – собственно бонусный буфер, длина которого определяется dn_bonuslen
·        dn_bonuslen – длина в байтах бонусного буфера
·        dn_bonustypeтип бонусного буфера:
o DMU_OT_PACKED_NVLIST_SIZE – задается значением 4, определяет бонусный буфер, содержащий объект DMU_OT_PACKED_NVLIST
o DMU_OT_SPACE_MAP_HEADER – задается значением 7, определяет заголовок карты пространства
o DMU_OT_DSL_DIR – задается значением 12, определяет объект «Директория DSL», используемый для определения отношений и задания их свойств для отношений между связанными датасетами
o DMU_OT_DSL_DATASET – Объект «Датасет DSL», используемый для организации снапшотов
o       DMU_OT_ZNODE – метаданные ZPL

1.3.2. Наборы объектов 

 DMU (Data Management Unit) организует объекты ZFS в группы, называемые наборами объектов. Наборами объектов являются файловая система, снапшот, клон или том ZFS. Наборы объектов представляются структурой размером 1 Кбайт. Эта структура состоит из следующих частей:

os_type – тип набора объектов определяет 64-битное целое, имеющее следующие значения: 

• DMU_OST_NONE – значение 0, неинициализированный набор объектов
• DMU_OST_META – значение 1, объектный набор типа DSL (см.часть 1.4)
• DMU_OST_ZFS – значение 2, объектный набор типа ZPL (см.часть 1.6)
• DMU_OST_ZVOL – значение 3, объектный набор типа ZVOL (см.часть 1.9)

 os_zil_header – заголовок журнала намерений, подробнее описывается в части 1.7 данной главы.
metanode – Как было описано ранее, каждый из объектов описывается структурой d-ноды.

Совокупность этих структур описывает объекты в объектных наборах и хранится как объект, на который указывает метанода. Данные, хранящиеся внутри этого объекта, представляют из себя массив d-нод. Каждый объект внутри объектного набора уникально идентифицируется посредством 64-битного целого, называемого номером объекта. Данный номер является указателем номера d-ноды объекта. Метанода образует структуру метаданных объектного набора верхнего уровня, расширяемую вниз посредством трех блочных указателей (рис. 6).



1.4. DSL

Уровень абстракции DSL в ZFS предоставляет механизм управления и описания отношений и свойств наборов объектов (описанных выше). Объектные наборы в ZFS представляют собой четыре основных вида объектов:
· Файловая система ZFS – хранит организованные объекты POSIX-совместимым образом
· Клон ZFS – клон почти идентичен файловой системе ZFS за исключением своего происхождения: клон первоначально происходит из снапшота и его содержимое изначально идентично снапшоту, из которого он порождается
· Снапшот ZFS – целостная копия «только для чтения» файловой системы, клона или тома ZFS, соответствующая состоянию оригинала на момент времени в прошлом
· Том ZFS – логический том, экспортируемый ZFS как блочное устройство

ZFS поддерживает ряд операций, связывающих перечисленные выше объектные наборы между собой. Назначением DSL как раз и является установление подобных связей. Перечислим некоторые виды отношений между объектными наборами.

Клоны – клоны связаны со снапшотами, от которых происходят. Будучи однажды созданными, клоны не позволяют удалять оригинальные снапшоты, покуда существуют дочерние структуры (ZFS предоставляет механизм рекурсивного удаления связанных объектных наборов):

root @ pegasus / # zfs create data/test
root @ pegasus / # zfs snapshot data/test@snap
root @ pegasus / # zfs clone data/test@snap data/test_clone
root @ pegasus / # zfs list|grep test
data/test                        21K  12.0G    21K  /data/test
data/test@snap                     0      -    21K  -
data/test_clone                    0  12.0G    21K  /data/test_clone
root @ pegasus / # zfs destroy data/test@snap
cannot destroy 'data/test@snap': snapshot has dependent clones
use '-R' to destroy the following datasets:
data/test_clone
root @ pegasus / # zfs destroy -R data/test
root @ pegasus / # zfs list|grep test
root @ pegasus / #

Снапшоты – снапшот это целостный образ данных на момент времени в прошлом. Файловая система, клон, том не могут быть удалены до тех пор, пока существуют дочерние снапшоты (также существует механизм рекурсивного удаления дочерних объектных наборов):

root @ pegasus / # zfs create data/test
root @ pegasus / # zfs snapshot data/test@snap
root @ pegasus / # zfs clone data/test@snap data/test_clone
root @ pegasus / # zfs destroy data/test
cannot destroy 'data/test': filesystem has children
use '-r' to destroy the following datasets:
data/test@snap
root @ pegasus / # zfs destroy -r data/test
cannot destroy 'data/test': filesystem has dependent clones
use '-R' to destroy the following datasets:
data/test_clone
root @ pegasus / # zfs destroy -R data/test
root @ pegasus / # zfs list|grep test
root @ pegasus / #

Наследование ZFS поддерживает иерархии объектных наборов: объектные наборы внутри объектных наборов. Дети зависят от существования родителей. Родителский объект не может быть разрушен, пока не будут разрушены его дочерние объекты (рекурсивное удаление поддерживается ZFS, как было продемонстрировано выше).

1.4.1. Инфраструктура DSL

Все объекты описываются в DSL как датасеты. Датасет содержит информацию о местонахождении объекта, а также отслеживает все зависимости, возникающие через посредство снапшотов.
Датасеты группируются в иерархические структуры, называемые директориями датасетов.
Директории датасетов объединяют собственно датасеты и их свойства, ассоциированные с данными группами наборов объектов. Директория датасетов всегда содержит один активный датасет. Все дочерние датасеты внутри директории датасетов всегда ссылаются на активный датасет через снапшоты, клоны, либо отношения «родитель-потомок».


Рисунок 7 показывает, как связаны между собой объектные наборы в датасетах и директориях датасетов. Верхним уровнем иерархии объектных наборов в директории датасетов является активный датасет (в центре). Активный датасет представляет собой активную файловую систему. Снапшоты создаются в различные фиксированные моменты времени и представляют собой, как было сказано выше, целостные образы активного датасета на моменты времени в прошлом.

1.4.2.  Устройство датасетов

DSL реализована в виде объектного набора типа DMU_OST_META. Данный объектный набор иногда называют метаобъектным набором (MOSMeta Object Set). В пределах пула ZFS существует только один метаобъектный набор и уберблок указывает на него непосредственно.
Существует один отдельный объект в метаобъектном наборе. Он называется объектной директорией и всегда расположен во втором элементе массива d-нод.
Все объекты, за исключением объектной директории, таким образом, могут быть найдены простым просмотром набора объектных ссылок начиная с объектной директории.

Объектная директория является объектом ZAP (описывается в части 1.5), содержащим три пары атрибутов «имя-значение»: root_dataset, config, и sync_bplist.

· root_dataset – содержит 64-битное целое, определяющее номер объекта в корневой директории датасетов в пределах пула. Корневая директория датасетов – особый объект, содержащий ссылки на все датасеты верхнего уровня в пределах пула. Корневая директория датасетов имеет тип DMU_OT_DSL_DIR
·  config – данный атрибут содержит 64-битное целое, представляющее собой номер объекта для объекта типа DMU_OT_PACKED_NVLIST. Данный объект содержит пары «имя-значение», описывающие виртуальные устройства (vdev) данного пула
·  sync_bplist – атрибут содержит 64-битное целое, определяющее номер объекта типа DMU_OT_SYNC_BPLIST. Представляет собой не что иное, как список блочных указателей, которые должны быть освобождены в рамках следующей транзакции


(продолжение следует)