ZFS обладает многими свойствами и преимуществами. Некоторые редкий, но полезные особенности и свойства рассмотрим ниже.
1) Запрет удаления snaphot’a
Допустим, вам нужно запретить удалить снапшот по каким-либо причинам стандартным образом через zfs destroy. Для этого существует команда hold, которая “защищает” его от удаления. Пример:
# zfs hold test-hold rpool/new_test/home@ccc # zfs holds rpool/new_test/home@ccc NAME TAG TIMESTAMP rpool/new_test/home@ccc test-hold Thu Sep 19 13:38:36 2013 # zfs destroy rpool/new_test/home@ccc cannot destroy 'rpool/new_test/home@ccc': snapshot is busy
В сети можно найти пример, что удалить его можно через недокументированный параметр ‘-d’, но не все так просто. Оказывается, этот параметр указывает на то, что снапшот будет автоматически удалён, при снятии с него hold’a. Пример:
# zfs destroy -d rpool/new_test/home@ccc # zfs list -t snapshot | grep 'rpool/new_test/home@ccc' rpool/new_test/home@ccc 0 - 31K - # zfs release test-hold rpool/new_test/home@ccc # zfs holds rpool/new_test/home@ccc cannot access dataset rpool/new_test/home@ccc: dataset does not exist # zfs list -t snapshot | grep 'rpool/new_test/home@ccc' #
Примечание.
На самом деле, параметр ‘-d’ устанавливает свойство defer_destroy=on, которое помечает нашу zfs для отложенного удаления. По дефолту это свойство в off.
Как вы уже поняли, для “освобожения” от удаления, используется команда zfs release. В качестве параметра она принимает имя tag’a и имя снапшота
Ещё полезно будет узнать, что параметр zfs – userrefs показывает количество hold-снапштов, для указанной zfs.
2) promote
Если кратко – то это операция замены местами клона и исходной. Если полностью, то это можно описать следующим образом. Допустим у вас есть ФС (zfs) и с неё вы когда-то сделали клон (zfsclone). Пришло время и исходная ФС уже не нужна (или например, нужно освободить место) и просто так удалить исходную ФС не получится, так как она имеет клон. Операция promote делает клон – исходной (теперь исходная zfsclone), а исходную делает клоном (теперь клон zfs). Получается, мы теперь смело сможем удалить ненужную ФС (zfs), так как на данный момент она является клоном, а клон можно спокойно удалить.
Ниже находится вырезка из документации Oracle по использованию promote.
В следующем примере клонируется файловая система tank/test/productA, после чего клонированная система tank/test/productAbeta становится файловой системой tank/test/productA.
# zfs create tank/test # zfs create tank/test/productA # zfs snapshot tank/test/productA@today # zfs clone tank/test/productA@today tank/test/productAbeta # zfs list -r tank/test NAME USED AVAIL REFER MOUNTPOINT tank/test 314K 8.24G 25.5K /tank/test tank/test/productA 288K 8.24G 288K /tank/test/productA tank/test/productA@today 0 - 288K - tank/test/productAbeta 0 8.24G 288K /tank/test/productAbeta # zfs promote tank/test/productAbeta # zfs list -r tank/test NAME USED AVAIL REFER MOUNTPOINT tank/test 316K 8.24G 27.5K /tank/test tank/test/productA 0 8.24G 288K /tank/test/productA tank/test/productAbeta 288K 8.24G 288K /tank/test/productAbeta tank/test/productAbeta@today 0 - 288K -
Из приведенных выше выходных данных команды zfs list видно, что учетная информация о пространстве исходной файловой системы productA была заменена данными системы productAbeta.
Завершите процесс замены клона переименованием файловых систем. Пример:
# zfs rename tank/test/productA tank/test/productAlegacy # zfs rename tank/test/productAbeta tank/test/productA # zfs list -r tank/test NAME USED AVAIL REFER MOUNTPOINT tank/test 316K 8.24G 27.5K /tank/test tank/test/productA 288K 8.24G 288K /tank/test/productA tank/test/productA@today 0 - 288K - tank/test/productAlegacy 0 8.24G 288K /tank/test/productAlegacy
При необходимости можно удалить старую файловую систему. Пример:
# zfs destroy tank/test/productAlegacy
3) Разница между снапшотами/ФС
Хотите узнать, чем именно (файлы, папки) отличаются 2 снапшота или снапшот от исходной ФС – тогда используется команду
# zfs diff datapool/texts@monday datapool/texts M /myfiles/ M /myfiles/link_to_me (+1) R /myfiles/rename_me -> /myfiles/renamed - /myfiles/delete_me + /myfiles/new_file
4) Наследование свойств
Все настраиваемые свойства, за исключением квот и резервируемого пространства, наследуют значения родительского элемента (кроме случаев, когда для дочернего элемента явно указаны квота или резервируемое пространство). Если родительский элемент не имеет явно указанного набора значений наследуемого свойства, используется значение свойства по умолчанию. Для сброса значения свойства используется команда zfs inherit, в результате выполнения которой наследуются параметры родительского элемента.
В следующем примере команда zfs set используется для активации сжатия в файловой системе tank/home/bonwick. Затем выполняется команда zfs inherit для возврата исходного значения свойства compression. Таким образом, это свойство наследует параметр по умолчанию off. Поскольку для home и tank свойство compression не указано на локальном уровне, используется значение по умолчанию. Если бы для обоих элементов сжатие было включено, то использовалось бы значение, указанное в ближайшем родительском элементе (home в данном примере).
# zfs set compression=on tank/home/bonwick # zfs get -r compression tank NAME PROPERTY VALUE SOURCE tank compression off default tank/home compression off default tank/home/bonwick compression on local # zfs inherit compression tank/home/bonwick # zfs get -r compression tank NAME PROPERTY VALUE SOURCE tank compression off default tank/home compression off default tank/home/bonwick compression off default
При вводе параметра r подкоманда inherit применяется рекурсивно. В следующем примере эта команда определяет значение свойства compression, наследуемого tank/home и всеми дочерними элементами.
# zfs inherit -r compression tank/home
Примечание.
Необходимо учитывать, что при использовании параметра -r текущее значение свойства для всех дочерних наборов данных сбрасывается.
5) Квоты.
Для настройки квоты пользователя или группы используются команды zfs userquota и zfs groupquota.
# zfs create students/compsci
# zfs set userquota@student1=10G students/compsci
# zfs create students/labstaff
# zfs set groupquota@staff=20GB students/labstaff
Отображение текущей квоты quota или group выполняется следующим образом:
# zfs get userquota@student1 students/compsci NAME PROPERTY VALUE SOURCE students/compsci userquota@student1 10G local # zfs get groupquota@staff students/labstaff NAME PROPERTY VALUE SOURCE students/labstaff groupquota@staff 20G local
Просмотр информации об общем использовании пространства пользователя или группы можно выполнить с помощью запроса следующих свойств:
# zfs userspace students/compsci TYPE NAME USED QUOTA POSIX User root 227M none POSIX User student1 455M 10G # zfs groupspace students/labstaff TYPE NAME USED QUOTA POSIX Group root 217M none POSIX Group staff 217M 20G
Если требуется получить информацию об использовании пространства пользователя или группы по отдельности, используется запрос для следующих свойств:
# zfs get userused@student1 students/compsci NAME PROPERTY VALUE SOURCE students/compsci userused@student1 455M local # zfs get groupused@staff students/labstaff NAME PROPERTY VALUE SOURCE students/labstaff groupused@staff 217M local
Свойства квоты user и group не отображаются с помощью команд zfs get all dataset, которые используются для вывода перечня всех свойств файловой системы.
Удаление квот user или group выполняется следующим образом:
# zfs set userquota@user1=none students/compsci
# zfs set groupquota@staff=none students/labstaff
Квоты ZFS user и group имеют следующие функции:
При настройке в файловой системе квота user или group, установленная в родительской файловой системе, не наследуется автоматически дочерней файловой системой.
Однако квота user или group применяется при создании клона или снимка файловой системы, имеющий квоту user или group. Таким же образом квота user или group включается в файловую систему при создании потока с помощью команды zfs send даже без параметра -R.
Пользователи без соответствующих прав имеют доступ только к их собственному дисковому пространству. Пользователь типа root или пользователь, получивший права userused или groupused, может иметь доступ к информации о пространстве для учетных записей любого пользователя или группы.
Свойства userquota и groupquota невозможно настроить для томов ZFS, в файловой системе версии ниже 4 или в пуле версии ниже 15.
Применение квот user или group может быть выполнено с задержкой в несколько секунд. Эта задержка означает, что, возможно, пользователи превысили свою квоту до того как система обнаружила это превышение квоты и отклонила дополнительные попытки записи, открыв при этом сообщение об ошибке EDQUOT.
Для обзора квот пользователей в среде NFS может использоваться старая команда quota, например там, где смонтирована файловая система ZFS. Без указания параметров при выполнении команды quota выходные данные отображаются только в том случае, если превышена квота пользователя. Пример:
# zfs set userquota@student1=10m students/compsci # zfs userspace students/compsci TYPE NAME USED QUOTA POSIX User root 227M none POSIX User student1 455M 10M # quota student1 Block limit reached on /students/compsci
В случае сброса квоты, и если ограничение квоты более не превышается, для обзора квоты пользователя требуется использовать команду quota -v. Пример:
# zfs set userquota@student1=10GB students/compsci # zfs userspace students/compsci TYPE NAME USED QUOTA POSIX User root 227M none POSIX User student1 455M 10G # quota student1 # quota -v student1 Disk quotas for student1 (uid 201): Filesystem usage quota limit timeleft files quota limit timeleft /students/compsci 466029 10485760 10485760
6) bookmark (доступно пока в zpool version 5000, FreeBSD 10.1)
Приведу выдержку из мана
zfs bookmark [-r] snapshot bookmark Creates a bookmark of the given snapshot. Bookmarks mark the point in time when the snapshot was created, and can be used as the incremental source for a zfs send command.
Bookmarks can be used for incremental sends even when the starting snapshot has already been deleted (as long as the snapshot was bookmarked before being delete), meaning that you can free all the data associated with the snapshot.
Иными словами, даже после удаления снепшота, вы сможете на него сослаться, если он был “забукмаркчен”.