Малоизвестные свойства zfs

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 и имя снапшота

Ещё полезно будет узнать, что параметр zfsuserrefs показывает количество 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.

Иными словами, даже после удаления снепшота, вы сможете на него сослаться, если он был «забукмаркчен».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *