Руководство по администрированию файловых систем ZFS Solaris

Глава 7 Работа со снимками и клонами ZFS

В этой главе описываются процессы создания и администрирования снимков и клонов ZFS. Здесь также приведена информация о сохранении снимков.

В этой главе содержатся следующие разделы:

Краткий обзор снимков ZFS

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

Снимки ZFS обладают следующими характеристиками.

Прямой доступ к снимкам томов невозможен, но можно их клонировать, создавать резервные копии, выполнять откат и т.д. Для получения информации о создании резервной копии снимка ZFS см. Отправка и получение данных ZFS.

Создание и уничтожение снимков ZFS

Снимки создаются с помощью команды zfs snapshot, использующей в качестве единственного аргумента имя создаваемого снимка. Имя снимка указывается следующим образом:


filesystem@snapname
volume@snapname

Имя снимка должно соответствовать соглашениям по присвоению имен, описанным в разделе Требования к именованию компонентов ZFS.

В следующем примере создается снимок tank/home/ahrens с именем friday.


# zfs snapshot tank/home/ahrens@friday

При помощи параметра -r можно создать снимки для всех дочерних файловых систем. Пример:


# zfs snapshot -r tank/home@now
# zfs list -t snapshot
NAME                   USED  AVAIL  REFER  MOUNTPOINT
tank/home@now             0      -  29.5K  -
tank/home/ahrens@now      0      -  2.15M  -
tank/home/anne@now        0      -  1.89M  -
tank/home/bob@now         0      -  1.89M  -
tank/home/cindys@now      0      -  2.15M  -

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


# zfs set compression=on tank/home/ahrens@tuesday
cannot set compression property for 'tank/home/ahrens@tuesday': snapshot
properties cannot be modified

Для уничтожения снимков используется команда zfs destroy. Пример:


# zfs destroy tank/home/ahrens@friday

При наличии снимков набора данных этот набор не может быть уничтожен. Пример:


# zfs destroy tank/home/ahrens
cannot destroy 'tank/home/ahrens': filesystem has children
use '-r' to destroy the following datasets:
tank/home/ahrens@tuesday
tank/home/ahrens@wednesday
tank/home/ahrens@thursday

Кроме того, если были созданы клоны снимка, необходимо их уничтожить перед уничтожением снимка.

Для получения дополнительной информации о подкоманде destroy см. Уничтожение файловой системы ZFS.

Переименование снимков ZFS

Снимки можно переименовывать, однако переименование должно выполняться в рамках пула и набора данных, в котором они были созданы. Пример:


# zfs rename tank/home/cindys@083006 tank/home/cindys@today

Следующий краткий синтаксис эквивалентен полному синтаксису переименования снимка, приведенному в примере выше.


# zfs rename tank/home/cindys@083006 today

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


# zfs rename tank/home/cindys@today pool/home/cindys@saturday
cannot rename to 'pool/home/cindys@today': snapshots must be part of same 
dataset

Можно рекурсивно переименовывать снимки с помощью команды zfs rename -r. Пример:


# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
users                        270K  16.5G    22K  /users
users/home                    76K  16.5G    22K  /users/home
users/home@yesterday            0      -    22K  -
users/home/markm              18K  16.5G    18K  /users/home/markm
users/home/markm@yesterday      0      -    18K  -
users/home/marks              18K  16.5G    18K  /users/home/marks
users/home/marks@yesterday      0      -    18K  -
users/home/neil               18K  16.5G    18K  /users/home/neil
users/home/neil@yesterday       0      -    18K  -
# zfs rename -r users/home@yesterday @2daysago
# zfs list -r users/home
NAME                        USED  AVAIL  REFER  MOUNTPOINT
users/home                   76K  16.5G    22K  /users/home
users/home@2daysago            0      -    22K  -
users/home/markm             18K  16.5G    18K  /users/home/markm
users/home/markm@2daysago      0      -    18K  -
users/home/marks             18K  16.5G    18K  /users/home/marks
users/home/marks@2daysago      0      -    18K  -
users/home/neil              18K  16.5G    18K  /users/home/neil
users/home/neil@2daysago       0      -    18K  -

Просмотр и расположение снимков ZFS

Вывод списков снимков в выводе команды zfs list можно включить или отключить с помощью свойства пула listsnapshots. По умолчанию это свойство включено.

Если это свойство отключено, для вывода данных о снимках можно воспользоваться командой zfs list -t snapshot. Или же требуется активировать свойство пула listsnapshots. Пример:


# zpool get listsnapshots tank
NAME  PROPERTY       VALUE      SOURCE
tank  listsnapshots  on        default
# zpool set listsnapshots=off tank
# zpool get listsnapshots tank
NAME  PROPERTY       VALUE      SOURCE
tank  listsnapshots  off         local

Снимки файловых систем будут доступны в каталоге .zfs/snapshot в корне файловой системы. Например, если tank/home/ahrens монтируется в /home/ahrens, то данные снимка tank/home/ahrens@thursday доступны в каталоге /home/ahrens/.zfs/snapshot/thursday .


# ls /tank/home/ahrens/.zfs/snapshot
tuesday wednesday thursday

Можно вывести список снимков:


# zfs list -t snapshot
NAME                        USED  AVAIL  REFER  MOUNTPOINT
pool/home/anne@monday          0      -   780K  -
pool/home/bob@monday           0      -  1.01M  -
tank/home/ahrens@tuesday   8.50K      -   780K  -
tank/home/ahrens@wednesday 8.50K      -  1.01M  -
tank/home/ahrens@thursday      0      -  1.77M  -
tank/home/cindys@today     8.50K      -   524K  -

Можно вывести список снимков, созданных для определенной файловой системы:


# zfs list -r -t snapshot -o name,creation tank/home
NAME                        CREATION
tank/home/ahrens@tuesday    Mon Aug 31 11:03 2009
tank/home/ahrens@wednesday  Mon Aug 31 11:03 2009
tank/home/ahrens@thursday   Mon Aug 31 11:03 2009
tank/home/cindys@now        Mon Aug 31 11:04 2009

Учет пространства снимков

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

Свойство referenced пространства снимка совпадает с аналогичным свойством файловой системы на момент создания снимка.

Возможно получение дополнительной информации об использовании значений применяемого свойства. Новые доступные только для чтения свойства файловой системы описывают использование пространства для клонов, файловых систем и томов. Пример:


$ zfs list -o space
NAME                  AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
rpool                 60.6G  6.37G         0     97K              0      6.37G
rpool/ROOT            60.6G  4.87G         0     21K              0      4.87G
rpool/ROOT/zfs1009BE  60.6G  4.87G         0   4.87G              0          0
rpool/dump            60.6G  1.50G         0   1.50G              0          0
rpool/swap            60.6G    16K         0     16K              0          0

Описание этих свойств приведено в разделе Таблица 6–1.

Откат снимка ZFS

Команда zfs rollback используется для отмены всех изменений, внесенных с момента создания определенного снимка. Файловая система возвращается в состояние, в котором она находилась на момент создания снимка. По умолчанию эта команда позволяет выполнить откат только к последнему созданному снимку.

Для возврата к какому-либо из предшествующих снимков необходимо уничтожить все промежуточные снимки. Для уничтожения предшествующих снимков используется параметр -r.

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


Примечание –

Файловая система, для которой требуется выполнить откат, должна быть размонтирована и перемонтирована (если она смонтирована в настоящее время). Если размонтирование файловой системы невозможно, откат не выполняется. Для принудительного размонтирования файловой системы при необходимости можно использовать параметр -f.


В следующем примере для файловой системы tank/home/ahrens выполняется откат к снимку tuesday:


# zfs rollback tank/home/ahrens@tuesday
cannot rollback to 'tank/home/ahrens@tuesday': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
tank/home/ahrens@wednesday
tank/home/ahrens@thursday
# zfs rollback -r tank/home/ahrens@tuesday

В приведенном выше примере снимки wednesday и thursday удаляются с целью отката к предшествующему снимку tuesday.


# zfs list -r -t snapshot -o name,creation tank/home/ahrens
NAME                      CREATION
tank/home/ahrens@tuesday  Wed Aug 27 16:35 2008

Краткий обзор клонов ZFS

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

Клоны могут быть созданы только на основе снимка. При клонировании снимка формируется неявная зависимость между клоном и снимком. Даже в случае создания клона в другом местоположении в иерархии набора данных исходный снимок не может быть уничтожен, пока существует клон. Эта зависимость отражена в свойстве origin. Для вывода списка таких зависимостей, если они существуют, можно использовать команду zfs destroy.

Клоны не наследуют свойства набора данных, на основе которого они были созданы. Для просмотра и изменения свойств клонированного набора данных используются команды zfs get и zfs set. Для получения дополнительной информации о настройке свойств набора данных ZFS см. Установка свойств ZFS.

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

Создание клона ZFS

Для создания клона используется команда zfs clone, в которой задается снимок для создания клона и имя новой файловой системы или тома. Новая файловая система или том могут быть расположены в любом месте в иерархии ZFS. Тип нового набора данных (например, файловой системы или тома) совпадает с типом снимка, на основе которого был создан клон. Создать клон файловой системы в пуле, отличном от местоположения исходного снимка файловой системы, невозможно.

В следующем примере создается новый клон tank/home/ahrens/bug123 с тем же исходным содержимым, что и в снимке tank/ws/gate@yesterday.


# zfs snapshot tank/ws/gate@yesterday
# zfs clone tank/ws/gate@yesterday tank/home/ahrens/bug123

В следующем примере создается клонированная рабочая область projects/teamA/tempuser, основанная на снимке projects/newproject@today и предназначенная для временного пользователя. Затем для этого клона задаются свойства.


# zfs snapshot projects/newproject@today
# zfs clone projects/newproject@today projects/teamA/tempuser
# zfs set sharenfs=on projects/teamA/tempuser
# zfs set quota=5G projects/teamA/tempuser

Уничтожение клона ZFS

Для уничтожения клонов ZFS используется команда zfs destroy. Например:


# zfs destroy tank/home/ahrens/bug123

Перед уничтожением родительского снимка должны быть уничтожены все его клоны.

Замена файловой системы ZFS на клон ZFS

Команда zfs promote позволяет заменить активную файловую систему ZFS клоном этой файловой системы. Эта функция обеспечивает возможность клонирования и замены файловых систем, в результате чего исходная файловая система становится клоном указанной файловой системы. Кроме того, эта функция позволяет уничтожить файловую систему, на основе которой был создан клон. Уничтожение исходной файловой системы активных клонов без изменения их роли невозможно. Дополнительную информацию об уничтожении клонов приведено в разделе Уничтожение клона ZFS.

В следующем примере клонируется файловая система 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

Отправка и получение данных ZFS

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

Существуют следующие решения резервного копирования для сохранения данных ZFS:

Отправка снимка ZFS

Можно использовать команду zfs send для отправки копии снимка в другой пул и получения снимка из другого пула на той же системе или из пула на другой системе, которая используется для сохранения архивных данных. Например, чтобы отправить снимок в другой пул на той же системе, используется синтаксис, аналогичный следующему:


# zfs send tank/data@snap1 | zfs recv spool/ds01

Если потоковое представление моментального снимка отправляется в другую систему, выходные данные команды zfs send передаются с помощью команды ssh. Пример:


host1# zfs send tank/dana@snap1 | ssh host2 zfs recv newtank/dana

При передаче полного потока целевая файловая система не должна существовать.

Для сохранения инкрементных данных используется команда zfs send с параметром -i. Пример:


host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana

Обратите внимание, что первый аргумент представляет более ранний снимок (snap1), а второй – более поздний (snap2). В этом случае для успешного выполнения инкрементной передачи должна существовать файловая система newtank/dana.

В качестве последнего компонента имени снимка можно указать инкрементный источник snap1. Это означает, что достаточно указать имя после знака @ для снимка snap1, который, как предполагается, находится в той же файловой системе, что и snap2. Пример:


host1# zfs send -i snap1 tank/dana@snap2 > ssh host2 zfs recv newtank/dana

Этот синтаксис является эквивалентом приведенного выше примера инкрементного синтаксиса.

При попытке генерации инкрементного потока из другой файловой системы snapshot1 отображается следующее сообщение:


cannot send 'pool/fs@name': not an earlier snapshot from the same fs

При необходимости сохранения нескольких копий можно выполнить сжатие потокового представления моментального снимка ZFS с помощью команды gzip. Пример:


# zfs send pool/fs@snap | gzip > backupfile.gz

Получение снимка ZFS

При получении снимка файловой системы необходимо учитывать следующее:

Пример:


# zfs send tank/gozer@0830 > /bkups/gozer.083006
# zfs receive tank/gozer2@today < /bkups/gozer.083006
# zfs rename tank/gozer tank/gozer.old
# zfs rename tank/gozer2 tank/gozer

Также можно использовать сокращенный вариант zfs recv как псевдоним команды zfs receive.

В случае изменения исходной файловой системы и необходимости инкрементной передачи снимка сначала следует выполнить откат целевой файловой системы.

Например, предположим, что в файловую систему вносится следующее изменение:


host2# rm newtank/dana/file.1

Для выполнения инкрементной отправки снимка tank/dana@snap3 и получения нового инкрементного снимка сначала следует выполнить откат целевой файловой системы. Для исключения этапа отката можно использовать параметр -F. Пример:


host1# zfs send -i tank/dana@snap2 tank/dana@snap3 | ssh host2 zfs recv -F newtank/dana

При получении инкрементного снимка целевая файловая система должна уже существовать.

При внесении изменений в исходную файловую систему без отката целевой файловой системы для получения нового инкрементного снимка, либо в случае отсутствия параметра -F появится следующее сообщение:


host1# zfs send -i tank/dana@snap4 tank/dana@snap5 | ssh host2 zfs recv newtank/dana
cannot receive: destination has been modified since most recent snapshot

Перед применением параметра -F выполняются следующие проверки:

Отправка и получение потоковых представлений сложных моментальных снимков ZFS

В этом разделе описано использование параметров команды zfs send - I и - R для отправки и получения потоковых представлений сложных моментальных снимков.

При отправке и получении потоковых представлений моментальных снимков ZFS необходимо помнить следующее.


Пример 7–1 Примеры: отправка и получение потоковых представлений сложных моментальных снимков ZFS

Группу инкрементных снимков можно объединить в один снимок с помощью команды zfs send с параметром - I. Пример:


# zfs send -I pool/fs@snapA pool/fs@snapD > /snaps/fs@all-I

Удалите снимки B, C и D.


# zfs destroy pool/fs@snapB
# zfs destroy pool/fs@snapC
# zfs destroy pool/fs@snapD

Получите комбинированный снимок.


# zfs receive -d -F pool/fs < /snaps/fs@all-I
# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
pool                      428K  16.5G    20K  /pool
pool/fs                    71K  16.5G    21K  /pool/fs
pool/fs@snapA              16K      -  18.5K  -
pool/fs@snapB              17K      -    20K  -
pool/fs@snapC              17K      -  20.5K  -
pool/fs@snapD                0      -    21K  -

Команду zfs send -I можно также использовать, чтобы объединить снимок и снимок клона для создания комбинированного набора данных. Пример:


# zfs create pool/fs
# zfs snapshot pool/fs@snap1
# zfs clone pool/fs@snap1 pool/clone
# zfs snapshot pool/clone@snapA
# zfs send -I pool/fs@snap1 pool/clone@snapA > /snaps/fsclonesnap-I
# zfs destroy pool/clone@snapA
# zfs destroy pool/clone
# zfs receive -F pool/clone < /snaps/fsclonesnap-I

Команду zfs send - R используют для репликации файловой системы ZFS и всех дочерних файловых систем вплоть до именованного снимка. При получении сохраняются все свойства, снимки, дочерние файловые системы и клоны.

В следующем примере снимки создаются для пользовательских файловых систем. Для всех пользовательских снимков создается один поток репликации. Затем исходные файловые системы и снимки удаляются и восстанавливаются.


# zfs snapshot -r users@today
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
users               187K  33.2G    22K  /users
users@today            0      -    22K  -
users/user1          18K  33.2G    18K  /users/user1
users/user1@today      0      -    18K  -
users/user2          18K  33.2G    18K  /users/user2
users/user2@today      0      -    18K  -
users/user3          18K  33.2G    18K  /users/user3
users/user3@today      0      -    18K  -
# zfs send -R users@today > /snaps/users-R
# zfs destroy -r users
# zfs receive -F -d users < /snaps/users-R
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
users               196K  33.2G    22K  /users
users@today            0      -    22K  -
users/user1          18K  33.2G    18K  /users/user1
users/user1@today      0      -    18K  -
users/user2          18K  33.2G    18K  /users/user2
users/user2@today      0      -    18K  -
users/user3          18K  33.2G    18K  /users/user3
users/user3@today      0      -    18K  -

Можно использовать команду zfs send -Rдля репликации набора данных users и отправки реплицированного потока в другой пул users2.


# zfs create users2 mirror c0t1d0 c1t1d0
# zfs receive -F -d users2 < /snaps/users-R
# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
users                224K  33.2G    22K  /users
users@today             0      -    22K  -
users/user1           33K  33.2G    18K  /users/user1
users/user1@today     15K      -    18K  -
users/user2           18K  33.2G    18K  /users/user2
users/user2@today       0      -    18K  -
users/user3           18K  33.2G    18K  /users/user3
users/user3@today       0      -    18K  -
users2               188K  16.5G    22K  /users2
users2@today            0      -    22K  -
users2/user1          18K  16.5G    18K  /users2/user1
users2/user1@today      0      -    18K  -
users2/user2          18K  16.5G    18K  /users2/user2
users2/user2@today      0      -    18K  -
users2/user3          18K  16.5G    18K  /users2/user3
users2/user3@today      0      -    18K  -

Удаленная репликация данных ZFS

Для удаленного копирования потокового представления моментального снимка из одной системы в другую используются команды zfs send и zfs recv. Пример:


# zfs send tank/cindy@today | ssh newsys zfs recv sandbox/restfs@today

Эта команда отправляет данные снимка tank/cindy@today и получает их в файловой системе sandbox/restfs, а также создает снимок restfs@today в системе newsys. В этом примере пользователь настроен на использование команды ssh в удаленной системе.

Сохранение данных ZFS с использованием сторонних решений для резервного копирования

Помимо команд zfs send и zfs receive, для сохранения файлов ZFS также можно использовать средства архивации, например tar и cpio. Такие средства позволяют сохранять и восстанавливать атрибуты файлов ZFS и списков ACL. См. описание соответствующих параметров команд tar и cpio.

Для получения новейшей информации о проблемах с ZFS и продуктами резервного копирования сторонних изготовителей см. заметки о выпуске Solaris 10 сопроводительной документации или вопросы и ответы (FAQ) по ZFS:

http://opensolaris.org/os/community/zfs/faq/#backupsoftware