Глава 5. Тома ZFS
Содержание
Том ZFS, или zvol, является фрагментом пространства, поддерживаемого пулом ZFS и используемого в качестве блочного устройства. Обычно zvol применяется в качестве файловой системы с поддержкой файлов и экспортируется на некоторые прочие устройства при помощи iSCSI. Zvol не имеет обычных файлов набора данных, а также каталогов и полномочий, вместо этого он полагается на того, кто использует этот том в том, что он обеспечит файловую систему. Zvol обычно применяются в качестве таргетов iSCSI для других сетевых устройств, предоставляя вам доступ к хранилищу на основе ZFS в операционных системах с менее гибкими файловыми системами. Вы также можете применять zvol в качестве хранилищ виртуальных машин, предоставляя любой гостевой операционной системе доступ к общей функциональности ZFS даже если операционная система этого клиента не может применять ZFS. Дополнительно, вы можете реплицировать zvol по всей своей сетевой среде.
Мы уже касались zvol в нашей первой книге (см., например, разделы Создание томов, Тонкая настройка томов ZFS). Данная глава осветит некоторые общие подводные камни zvol. Однако, давайте начнём с основ zvol.
Флаг -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
вступило в силу, экспортируйте и повторно импортируйте этот том. (Вы можете также переименовать том, который
фактически экспортирует этот том и импортировать его под другим именем.)
Создайте тома с нужным вам режимом определив режим в командной строке или установив глобальные значения по умолчанию.
Как и для любого другого свойства, примените флаг -o
чтобы установить
значение свойства volmode
при
создании zvol.
# zfs create -V 10G -o volmode=dev vm/swap0
Данный новый zvol доступен только через узел устройства /dev/zvol/vm/swap0
.
Если большая часть обычных потребностей применения 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
.
Вы не можете 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 состоит в работе основой для виртуальных машин. Серьёзное количество виртуальныйх машин требует серьёзного оборудования. Давайте бросим на него взгляд в следующей главе.