Глава 5. Тома ZFS

Том ZFS, или zvol, является фрагментом пространства, поддерживаемого пулом ZFS и используемого в качестве блочного устройства. Обычно zvol применяется в качестве файловой системы с поддержкой файлов и экспортируется на некоторые прочие устройства при помощи iSCSI. Zvol не имеет обычных файлов набора данных, а также каталогов и полномочий, вместо этого он полагается на того, кто использует этот том в том, что он обеспечит файловую систему. Zvol обычно применяются в качестве таргетов iSCSI для других сетевых устройств, предоставляя вам доступ к хранилищу на основе ZFS в операционных системах с менее гибкими файловыми системами. Вы также можете применять zvol в качестве хранилищ виртуальных машин, предоставляя любой гостевой операционной системе доступ к общей функциональности ZFS даже если операционная система этого клиента не может применять ZFS. Дополнительно, вы можете реплицировать zvol по всей своей сетевой среде.

Мы уже касались zvol в нашей первой книге (см., например, разделы Создание томов, Тонкая настройка томов ZFS). Данная глава осветит некоторые общие подводные камни zvol. Однако, давайте начнём с основ zvol.

 Создание, удаление и манипулирование томами ZFS

Флаг -V сообщает zfs create что вы создаёте том ZFS. Определите желаемый размер и полный путь к этому тому. Здесь мы создаём zvol с размером 2ТБ в пуле vm. Так как этот том будет экспортироваться для веб сервера, мы назовём его www1.


# zfs create -V 2T vm/www1
 	   

Zvol обязаны быть потомками набора данных. В данном примере zvol является потомком корневого набора данных пула. Вы не можете создавать zvol как потомка zvol. Наш том отображается в списке наборов данных.


# zfs list -r vm
NAME     USED  AVAIL  REFER  MOUNTPOINT
vm      2.06T   563G  31.8K  /vm
vm/db1  2.06T  2.61T  15.9K  -
 	   

Zvol немедленно утверждает о своих правах на всё назначенное иму пространство. Мы создали том 2ТБ, поэтому он использует 2ТБ пространства плюс некоторое дополнительное пространство для метаданных.

Совершенно новый том не использует ещё так много пространства - он пока не записал кучу наполнителей данных в этот пул или что-то вроде этого. Он только заявил свои права на пространство через refreservation.

Удалим том при помощи zfs destroy.


# zfs destroy vm/www1
 	   

Для zvol вы можете применять большинство остальных команд ZFS, например такие, как переименование и перемещение. Zvol имеют уникальные свойства, такие как volmode и volblocksize, хотя вы не можете устанавливать sharenfs или atime на каком бы то ни было zvol.

Осуществляйте доступ к zvol через его узел устройства. Большинство zvol имеют улы устройств в /dev/zvol, в каталоге с именем после из пула. Узел устройства для zvol нашего примера, vm/db1, должен быть /dev/zvol/vm/db1. Zvol может иметь другие узлы устройств, в зависимости от его режима.

 Разрежённые тома

ZFS позволяет вам создавать том ZFS с размером большим, чем пространство доступное для его совместного расположения, тем самым выходя за пределы доступных ресурсов (overcommit). Резервирование некоторого пространства, тем не менее недостаточного, называется динамическим выделением (thin provisioning). Динамическое выделение является довольно рискованным в более ранних файловых системах, так как вы легко можете предоставить больше пространства, чем содержит файловая система. Вы можете легко расширить пул ZFS добавив больше жёстких дисков, поэтому в данном случае риск не так велик. Свойство refreservation управляет тем, какой объём тома зарезервирован под это. В нашем примере мы создаём zvol db5 2ТБ, однако предписываем ZFS зарезервировать для него только 100МБ.


# zfs create -V 2T -o refreservation=100M db/db5
 	   

Те из нас у кого имеется пара пустых полок SAS и они уже имеют планы добавления большего числа жёстких дисков, могут даже применять разрежённые тома (parse volume). Разрежённые тома используют только объём пространства, используемый данным томом. Для создания разрежённого тома воспользуйтесь флагом -s.


# zfs create -V 2T -s db/db5
 	   

Вы можете применть меньшие резервирования если вы экспортируете тома iSCSI на другие хосты, а файловые системы клиентов менее гибкие чем ZFS. Растущая файловая система NTFS или UFS при расширении лежащего в основе диска могут вызывать долговременные проблемы. Применение разрежённого тома означает, что вы можете сообщить хосту Windows что iSCSI устройство имеет особенный большой размер, даже если лежащий в его основе пул не имеет так много места. Zvol предоставляет его потребителям объём пространства, используемый его файлами на этом устройстве плюс некие метаданные файловой системы.

Это делает возможным создание действительно впечатляющие тома, если вы подготовлены к их поддержке. Здесь мы создадим разрежённый том с размером два экзабайта. Не имеет значения, что лежащий в основе пул имеет только 500ГБ.


# zfs create -V 2E -s db/db5
 	   

Воспользуйтесь gpart show /dev/zvol/db/db5 и вы увидите, что данное дисковое устройство в действительности является двух экзабайтовым. Если вам в действительности необходимы два экзабайта пространства на одном томе iSCSI, мы, вероятно, можете себе позволить подсобного рабочего для распаковки и монтажа жёстких дисков достаточно быстро, чтобы поспевать за потребностями.

Чрезмерное выделение (overcommitting) становится и вправду некрасивым, когда вы выходите за пределы пространтсва. Ваши клиенты iSCSI могут окончательно потерять свой хладнокровие когда они получают сообщение что их тома выходят за пределы допустимого пространства даже когда экземпляры операционной системы настаивают на том, что они заполнены всего лишь на 10 процентов. Многие стеки iSCSI справляются с такими проблемами изящно. А другие... не очень.

Если у вас отсутствует достаточный объем физических аппаратных средств для добавления ёмкости хранения, позвольте томам ZFS занимать объём пространства, эквивалентный их размеру. Не допускайте чрезмерного выделения пространства.

 Режим тома

Перед тем как вы приступите к созданию тома для своего приложения, рассмотрите его предназначение применения и то, какие хосты собираются его использовать. Установки FreeBSD по умолчанию для ZFS предполагают, что система, размещающая zvol полностью управляет им. Однако, если вы используете zvol как хранилище для виртуальной машины, гостевая операционная система ожидает иметь полное управление над ним. Это существенно, так как уровень GEOM FreeBSD автонастраивает хранилище. Уже настроенное хостом хранилище может вызвать проблемы у гостей с виртуальными средами.

Управляйте тем, какая система настраивает том применяя свойство volmode.

Значение volmode по умолчанию, geom, означает, что ваша система, в которой данный том и существует, управляет им. Если мы создаём zvol на хосте A, хост A настраивает том и управляет этим томом применяя GEOM. В добавление к узлу устройства для этого тома ZFS, он получает узлы устройств в /dev/label и тому подобное. Применяйте volmode geom когда вы используете zvol локально.

volmode dev означает, что этот zvol доступен исключительно через единственный узел устройства /dev/zvol. GEOM не пытается автонастраивать (autoconfigure) этот том. Вы можете назначить утому узлу метку, однако FreeBSD даже не будет пытаться смотреть на неё. Применяйте dev volmode для хранилищ виртуальных машин, например, хостов bhyve(8) .

volmode none означает, что этот zvol пока не имеет узла устройства. Вы можете клонировать этот том, делать его снимок или реплицировать его. Этот режим полезен только для резервных копий.

Вы не можете менять режим работающего тома - хотя вы можете изменить значение свойства volmode, причём действующий режим не изменится. Чтобы изменение volmode вступило в силу, экспортируйте и повторно импортируйте этот том. (Вы можете также переименовать том, который фактически экспортирует этот том и импортировать его под другим именем.)

Создайте тома с нужным вам режимом определив режим в командной строке или установив глобальные значения по умолчанию.

  volmode в командной строке

Как и для любого другого свойства, примените флаг -o чтобы установить значение свойства volmode при создании zvol.


# zfs create -V 10G -o volmode=dev vm/swap0
 	   

Данный новый zvol доступен только через узел устройства /dev/zvol/vm/swap0.

  volmode по умолчанию

Если большая часть обычных потребностей применения volmode отличается от geom, имеет смысл изменить значение по умолчанию volmode. sysctl vfs.zfs.vol.mode управляет значением по умолчанию volmode для новых zvol.

Значение по умолчанию 1 предписывает ZFS применять для volmode значение geom. Установка значения 2 обозначает применение dev для volmode, в то время как 3 подразумевает значение volmode установленным в none. Измените значение по умолчанию с помощью sysctl(8) или сделайте это изменение действующим постоянно при следующей перезагрузке изменив запись в /etc/sysctl.conf. Ниже мы приводим запись /etc/sysctl.conf, позволяющую виртуальным серверам создавть zvol с volmode установленным в dev.


vfs.zfs.vol.mode=2
 	   

Не существует потребности в явном виде определять geom volmode.

 Доступ zvols

Вы не можете zfs mount zvol как вы это могли бы сделать с набором данных файловой системы. Весь смысл в том, что zvol это блочное устройство. Для того, чтобы получить доступ к нему, необходимо получить доступ к узлу устройства или к его поставщику GEOM. Наиболее распространённым, скорее всего, является узел устройства.

Zvol получает узел устройства в /dev/zvol, в подкаталоге с именем после имени пула. Узел устройства для нашего zvol в примере, vm/db1, должно быть /dev/zvol/vm/db1.

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

Для прочих вариантов применения мы можем пожедать выполнять разбиение диска локально. Здесь мы создаём схему разбиения GPT на нашем zvol и делаем его одним большим разделом, устанавливая метку GEOM db1. Мы также назначаем ему метку GEOM.


# gpart create -s gpt /dev/zvol/vm/db1
zvol/vm/db1 created
# gpart add -t freebsd-ufs -l db1 /dev/zvol/vm/db1
zvol/vm/db1p1 added
# glabel create db1 /dev/zvol/vm/db1
 	   

Поскольку этот zvol был создан со значением volmode по умодчанию, geom, он также теперь доступен через узел устройства /dev/label/db1.

Когда раздел существует, вы можете создать в нём файловую систему.


# newfs -j /dev/zvol/vm/db1
/dev/zvol/vm/db1: 2097152.0MB (4294967296 sectors) block
size 32768, fragment size 4096
 using 3350 cylinder groups of 626.09MB, 20035 blks,
80256 inodes.
 with soft updates
…
 	   

Подождите - почему мы бы возможно захотели использовать UFS на zvol?

Возможно, наш клиент iSCSI или гостевая ВМ не имеют достаточно ресурсов выполнять эффективно ZFS. Предоставляя нашему клиенту том на основе ZFS в пределах файловой системы, которую он может поддерживать, клиент получает дополнительные защиты ZFS даже хотя этот клиент не может применять ZFS напрямую. Тем не менее, я делаю доступным журналирование soft update UFS при помощи -j, поскольку целостность данных ZFS и журналирование файловой системы UFS защищают совершенно разные вещи. Целостность ZFS проверяет гарантированность того что записи безопасны, однако журналирование файловой системы подтверждает что все записи были завершены. (Лукас применял локальное USB флеш- устройство в качестве кэша gjournal(8) или gcache(8)) для устройства iSCSI. Это работает. Однако, если вы окажетесь в ситуации, когда это имеет смысл, разрешите это положение).

Теперь этот zvol имеет файловую систему, вы можете смонтировать его.


# mount /dev/gpt/db1 /media/
 	   

И voilà! У меня есть файловая система UFS основывающаяся на ZFS, готовая к применению.

Наиболее распространённое применение для zvol состоит в работе основой для виртуальных машин. Серьёзное количество виртуальныйх машин требует серьёзного оборудования. Давайте бросим на него взгляд в следующей главе.