Глава 1. Представление ZFS

Начало обучения ZFS простое. Установите последнюю версию FreeBSD. Скажите установке, что вы хотите ZFS. Вы начали. Если вы никогда не работали с ZFS, воспользуйтесь моментом и установите новую FreeBSD с ZFS на тестовой системе или виртуальной машине. Не выбирайте шифрование или любой другой причудливый вариант настройки. Такая простейшая установка предложит возможность ознакомиться с некоторыми основами ZFS, прежде чем погрузиться в более сложные инсталляции.

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

Чтобы сориентировать вас, мы начнем в наиболее очевидных частей стека хранения и проработаем наш путь вниз. После того, как вы поймете как подогнаны уровни, остаток этой книги начнет с основ и проработает свой путь вверх.

 Наборы данных ZFS

Файловые системы ZFS не являются полным аналогом обычных файловых систем, и поэтому называются наборами данных (dataset). Классическая файловая система Unix (UFS, Unix File System), а также ее производные и рабочие аналоги, подобные современной BSD UFS2 и Limux extfs, управляют файловой системой при помощи различных программ. Наверное, вы хорошо привыкли применять df(1), newfs(8), mount(8), umount(8), dump(8), restore(8) и аналогичные команды, ZFS впитала все эти функции в программу zfs(8), которая позволяет создавать, ликвидировать, просматривать и еще как либо насаживать на ось наборы данных ZFS.

Начнем с просмотра существующих наборов данных при помощи zfs list:

# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
zroot              429M  13.0G    96K  none
zroot/ROOT         428M  13.0G    96K  none
zroot/ROOT/default 428M  13.0G   428M  /
zroot/tmp          104K  13.0G   104K  /tmp
zroot/usr          428K  13.0G    96K  /usr
   

Это объединяет вывод mount(8) и df(1) и должен выглядеть очень знакомо всякому, кто управлял UFS или extfs.

Каждый набор данных имеет имя. Имя набора данных ZFS начинается с имени пула хранения, или zpool, в котором содержится этот набор данных. Наш первый элемент называется просто zroot. Этот элемент представляет корневой набор данных (root dataset), на который навешивается все остальное.

Следующие две колонки показывают объем используемого и доступного пространства. Пул zroot использует 429МБ, а 13ГБ свободно.

Колонка REFER является особенной для ZFS. Это объем доступных данных в наборе данных, который не обязательно тот же, что и объем используемого пространства. Некоторые функциональные возможности ZFS, например, такие как снимки, совместно используют данные. наш элемент zroot "использует" 429МБ, но обращается только за 96КБ данных. Весь пул имеет свободными 13ГБ, однако 96КБ являются доступными посредством такого специфического набора данных. Это не так много. Остальная часть пространства используется для дочерних записей этого набора данных. Глава 6 предоставляет детальное обсуждение использования диска файловой системой ZFS. Дочерние наборы данных включают снимки, тома и дочерние наборы данных, как вы увидите в данной книге.

Наконец, у нас есть точка монтирования файловой системы. zroot ZFS не монтируется.

Обратите внимание на вторую запись с именем zroot/ROOT. Это набор данных ZFS, созданный для корня файловой системы. Как и пул zroot, он не монтируется. Он обращается за 96КБ данных. Он, по-видимому, не используется, что кажется странным для корня файловой системы.

Третья запись, zroot/ROOT/default, является текущим корнем файловой системы. Она использует 428МБ данных и монтируется в /, корне Unix. Она обращается за 428МБ, что означает, что в данном наборе данных существует такое количество данных.

Зачем ZFS выделяет это из корня файловой системы? ZFS позволяет легко делать выбор из многих корневых файловых систем. Данный хост работает под управлением FreeBSD 10.1, но предположим, что вы должны применить некоторые обновления безопасности и перезагузиться? Применение исправлений операционной системы всегда донимает системных администраторов кишечными расстройствами вперемешку со страхом и надеждой. Даже хорошо проверенные обновления могут пойти не так и разрушить планы на день любого сотрудника. Однако ZFS позволяет вам клонировать наборы данных и делать их снимки. Когда вы обновляетесь до FreeBSD 10.1-p1, вы можете создать новый набор данных, например, zroot/ROOT/10.1-p1 и попросить FreeBSD использовать его в качестве корневого раздела. Вы либо не монтируете zroot/ROOT/default, либо, как я, смонтировали его в другом месте, например, /oldroot. Если обновление пошло не так, возврат будет простым.

Следующий набор данных, zroot/tmp, почти пустой. Он монтируется в /tmp. Этот набор данных является обычным временным каталогом.

 Разделы и свойства ZFS

В ZFS отсутствуют обычные разделы. Раздел является логическим подразделением диска, заполняющим весьма специфичные адреса логических юлоков (LBA, Logical Block Addresses) в устройствах хранения. Разделы не имеют сведений о данных в разделе. Изменение раздела означает уничтожение и (предположительно) восстановление файловой системы поверх него.

Первой мыслью Лукаса, когда он увидел файловую систему без разделов было: интересно, как вообще можно будет управлять моим хранилищем. Это примерно равносильно тому замешательству, когда после длинной холодной зимы Мичигана он выходит на улицу и ощущает естественный теплый воздух впервые за долгие месяцы. Смятение является частью освобождения. Мы научились управлять хранилищами посредством разделов не потому, что разделы нам симпатичны или являются наилучшим решением. Работа обычной файловой системы без разделов является плохой практикой, однако ZFS не является обычной файловой системой.

ZFS тесно интегрирует файловую систему с нижними уровнями хранилища. Это означает, что можно динамично разделять пространство хранения между различными файловыми системами по мере необходимости. В то время как вы можете установить конкретные ограничения на размер файловой системы в файловой системе ZFS, наборы данных не имеют размеров в обычном их понимании. Если пул имеет достаточно места для файла, вы можете использовать его. Там, где раньше вы предварительно выделяли ограниченный объем дискового пространства, например, удерживая безумие журналов от переполнения вашего диска, вы теперь должны устанавливать эти пределы на уровне ZFS.

Объем пространства, который может использовать набор данных является одним из примеров свойств (property) ZFS. ZFS поддерживает десятки свойств наборов данных - например, свойство квота (quota) управляет тем, насколько может возрастать набор данных. Воспользуйтесь zfs(8) для установки свойств ZFS.

# zfs set quota=2G zroot/var/log
	   

Просматривайте свойства командой zfs get.

# zfs get quota zroot/var/log
NAME           PROPERTY  VALUE  SOURCE
zroot/var/log  quota     2G     local
	   

Просмотрите все свойства при помощи zfs get all и имени набора данных ZFS.

Глава 4 подробно анализирует свойств ZFS, а Глава 6 обсуждает ограничения на размер набора данных.

 Пределы ZFS

Файловая система всегда должна иметь максимальные размеры и пределы. Файловая система FAT, как мы все знаем и раздражались этим, потребовала множество версий для преодоления своего максимального рамера в 32МБ, затем 2ГБ, а потом 4ГБ. Предел FAT32 в 32ТБ начинает выглядеть слега тесным в наши дни. UFS и ext2/3/4fs имеют свои собственные, аналогично произвольные, пределы. Эти пределы существуют по той причине, что авторы файловой системы установили каким-то образом предел и выбрали для него значение, которое, как они ожидают, будет хорошим для ряда последующих лет. Популярные файловые системы будут оставаться в применении пока не будут достигнуты эти пределы, поэтому системные администраторы должны часто узнавать о них.

Апологеты ZFS утверждают, что ZFS имеет иммунитет от таких произвольных ограничений, однако это не так. ZFS использует 128бит для хранения большинства своих значений, что устанавливает пределы настолько высокие, что они никогда не будут встречаться ни у кого, кто работает системными администраторами сегодня. Один каталог может иметь 248 файлов с размером до 16 экзабайт каждый. Отдельный пул может иметь до 256 зеттабайт, или 278байт. Пул хранения может содержать 264 устройств, а отдельный хост может иметь 264 пулов хранения.

Хорошей новостью является то, что мы не будем жить так долго, чтобы попасть в эти пределы. Плохая новость состоит в том, что мы имеем полные знания о миграции между файловыми системами. Когда технологии упрутся в пределы ZFS, эти бедные люди не будут приучены к миграции между файловыми системами. К счастью, они имеют слегка запоздавшие имеющиеся сегодня FAT/ UFS/ extfs трансформирующиеся для практики.

 Пулы хранения

ZFS использует пулы хранения (storage pools) вместо дисков. Пул хранения является абстракцией поверх лежащего ниже поставщика хранилища, позволяя вам разделить физические носители и видимую пользователем файловую систему поверх них.

Воспользуйтесь zpool(8) для просмотра и управления системными пулами хранения. Вот пулы по умолчанию системы FreeBSD.

# zpool status
  pool: zroot
 state: ONLINE
  scan: none requested
config:

NAME       STATE READ WRITE CKSUM
zroot     ONLINE    0     0     0
 gpt/zfs0 ONLINE    0     0     0

 errors: No known data errors
	   

Вначале вы получаете имя пула и состояние. Система может иметь более одного пула - большие системы с десЯтками и десятками жестких дисков часто имеют множество пулов. Если данный хост имеет множество пулов, каждый из них будет появляться в отдельном описании как в приведенном выше примере.

ZFS может выполнять многие виды внутренних проверок в пулах хранения. Если выполняется некая проверка целостности, отображается состояние scan и результат самого последнего сканирования.

Последняя часть списка пулов показывает расположение виртуальных устройств в этом пуле.

 Виртуальные устройства

Пул хранения содержит одно или более устройств, или VDEV, VDEV аналогичен обычному устройству RAID. Большой RAID-5 преподносит себя файловой системе как единое громадное устройство, даже если системный администратор знает, что в действительности это целая куча мелких дисков. Виртуальные устройства позволяют вам назначать определенные устройства для определенных целей. При помощи VDEV вы можете организовывать физическое хранилище по мере ваших потребностей.

Виртуальные устройства это место, где происходит целая куча магии ZFS. Пул может быть организован для избыточности в RAID- стиле. Вы можете применять поставщиков как выделенные кэши чтения и записи, повышая производительность виртуального устройства. Глава 2 охватывает виртуальные устройства более подробно.

Избыточность данных ZFS и автоматическая коррекция ошибок также осуществляется на уровне VDEV. Все в ZFS имеет контрольные суммы для проверки целостности. Если ваш пул имеет достаточную избыточность, ZFS является самовосстанавливающейся. Если вашему пулу не хватает избыточности, ну, вы, по крайней мере, знаете какие данные повреждены и вы можете (надеемся) восстановить из резервной копии. (ZFS не исключает необходимости для резервных копий. Единственное, что устраняет резервное копирование это полное безразличие).

Команда zpool status, которая отображает состояние пула также показывает виртуальные устройства в этом пуле. Взгляните на пример в предыдущем разделе. Очень простой пул, zroot, содержит одного поставщика хранилища, /dev/gpt/zfs0. Этот поставщик является разделом GPT, не диском. ZFS может использовать любые виды используемых хранилищ, как это обсуждается в Главе 2. Применение раздела GPT очень распространено, однако другие возможности включают диск целиком, файлы и любых других поставщиков GEOM. FreeBSD использует поставщиков GEOM для поддержки таких функциональных возможностей как шифрование.

 Блоки и индексные дескрипторы

Обычные файловые системы почти всегда используют некоторое разнообразие блоков данных для хранения данных и отображают содержимое этих блоков (block) индексными дескрипторами (inode). UFS BSD и extfs Linux называют их block) и inode. Даже файловая система FAT Microsoft имеет блоки хранения данных и индексные дескрипторы.

Как и эти файловые системы, ZFS применяет индексные блоки и блоки данных. В отличие от более старых файловых систем, однако, ZFS создает индексные дескрипторы по запросу. Пока это возможно, ZFS создает блоки хранения того размера, который вмещает эти данные. Блоки переменного размера не всегда вмещают все возможные файлы, которые вы можете создать, однако они несомненно более гибки, чем обычные файловые системы.

В отличие от суперблоков UFS, динамически создаваемые индексные блоки могут быть размещены в известном месте на диске. Как ZFS справляется с повреждениями в индексных блоках? ZFS хранит несколько копий важных индексных блоков в алгоритмически прогнозируемых местах. Эти точные копии (ditto block) реплицируются в несколько мест на данном диске. Глава 3 обсуждает блоки ZFS, uberblock, ditto блоки, группы транзакций и многое другое.

Теперь вы знаете обнаженные основы ZFS, оставшаяся часть данной книги в основном наполняет различные сотни мелких деталей. Мы начнем с самого низа стека, с виртуальных устройств.