Guia de administração do ZFS Oracle Solaris

Enviando e recebendo dados do ZFS

O comando zfs send cria uma representação do fluxo de um instantâneo gravado em uma saída padrão. Por padrão, um fluxo inteiro é gerado. Você pode redirecionar a saída para um arquivo ou para outro sistema. O comando zfs receive cria um instantâneo cujo conteúdo está especificado no fluxo fornecido na entrada padrão. Se um fluxo inteiro for recebido, um novo sistema de arquivos também é criado. Com estes comandos, é possível enviar os dados do instantâneo do ZFS e receber os dados do instantâneo e os sistemas de arquivos ZFS. Consulte os exemplos nesta seção.

Estão disponíveis as seguintes soluções de backup para salvamento de dados do ZFS:

Salvando dados do ZFS com outros produtos de backup

Além dos comandos zfs send e zfs receive, você também pode usar utilitários de arquivo, como os comandos tar e cpio, para salvar os arquivos ZFS. Estes utilitários salvam e restauram ACLs e atributos do arquivo do ZFS. Verifique as opções adequadas para os comandos tar e cpio.

Para obter informações atualizadas sobre problemas com o ZFS e produtos de backup de terceiros, consulte as notas da versão do Solaris 10 ou o FAQ do ZFS, disponível aqui:

http://hub.opensolaris.org/bin/view/Community+Group+zfs/faq/#backupsoftware

Enviando um instantâneo do ZFS

Você pode utilizar o comando zfs send para enviar uma cópia de um fluxo de instantâneo e receber o fluxo de instantâneo em outro conjunto do mesmo sistema ou em outro conjunto de outro sistema utilizado para armazenar dados de backup. Por exemplo, para enviar o fluxo de instantâneo de outro conjunto do mesmo sistema, utilize uma sintaxe semelhante à seguinte:


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

O zfs recv pode ser usado como um alias do comando zfs receive.

Se estiver enviando o fluxo de instantâneo a outro sistema, conduza a saída de zfs send através do comando ssh. Por exemplo:


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

Ao enviar um fluxo completo, o sistema de arquivos de destino não deve existir.

É possível salvar dados incrementais usando a opção i do -zfs send . Por exemplo:


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

Observe que o primeiro argumento (snap1) é o instantâneo mais antigo e o segundo (snap2) é o instantâneo mais recente. Nesse caso, o sistema de arquivos newtank/dana deve existir para que o recebimento incremental tenha êxito.

A origem do snap1 incremental pode ser especificada como o último componente do nome do instantâneo. Este atalho significa que é necessário especificar o nome do snap1 somente depois do símbolo @, que se supõe ser do mesmo sistema de arquivos que o snap2. Por exemplo:


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

Esta sintaxe de atalho é equivalente à sintaxe incremental no exemplo anterior.

Se você tentar gerar um fluxo incremental do instantâneo1 de um sistema de arquivos diferente, é exibida a seguinte mensagem:


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

Se precisar restaurar várias cópias, considere compactar uma representação de fluxo de instantâneo do ZFS com o comando gzip. Por exemplo:


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

Recebendo um instantâneo do ZFS

Leve em consideração as seguintes questões ao receber um instantâneo de um sistema de arquivos:

Por exemplo:


# 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

Se fizer uma alteração no sistema de arquivos de destino, e quiser efetuar outro envio incremental de um instantâneo, é necessário, primeiramente, reverter o sistema de arquivos receptor.

Considere o seguinte exemplo. Primeiro, faça uma alteração ao sistema de arquivos, como segue:


host2# rm newtank/dana/file.1

Então, efetue um envio incremental de tank/dana@snap3. No entanto, é necessário reverter o sistema de arquivos receptor para receber o novo instantâneo incremental. Ou então, a etapa de reversão pode ser eliminada utilizando a opção -F . Por exemplo:


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

Quando um instantâneo incremental é recebido, o sistema de arquivos de destino já dever existir.

Se fizer alterações ao sistema de arquivos e não reverter o sistema de arquivos receptores para receber o novo instantâneo incremental ou não utilizar a opção -F, será exibida uma mensagem similar à seguinte:


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

As verificações seguintes são realizadas antes que a opção -F seja realizada:

Enviando e recebendo fluxos complexos de instantâneos do ZFS

Esta seção descreve como usar as opções zfs send -I e -R para enviar e receber fluxos de instantâneos mais complexos.

Considere os pontos a seguir ao enviar e receber fluxos de instantâneos do ZFS complexos:


Exemplo 7–1 Enviando e recebendo fluxos complexos de instantâneos do ZFS

É possível combinar um grupo de instantâneos incrementais em um instantâneo usando a opçãozfs send -I. Por exemplo:


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

Então, deve-se remover snapB, snapC e snapD.


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

Para receber o instantâneo combinado, utilize o comando a seguir.


# 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  -

Você também pode usar o comando zfs send -I para combinar um instantâneo e um instantâneo de clone a fim de criar um conjunto de dados combinado. Por exemplo:


# 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

Utilize o comando zfs send -R para replicar um sistema de arquivos ZFS e todos os sistemas de arquivos descendentes, até o instantâneo nomeado. Quando este fluxo é recebido, todas as propriedades, instantâneos, sistemas de arquivo descendentes e clones são preservados.

No exemplo seguinte, são criados instantâneos para os sistemas de arquivos do usuário. Um fluxo de replicação é criado para todos os instantâneos do usuário. A seguir, os instantâneos e sistemas de arquivos originais são destruídos e, então, recuperados.


# 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  -

No exemplo a seguir, o comando zfs send -R foi utilizado para replicar o conjunto de dados users e seus descendentes, e enviar o fluxo replicado para outro conjunto, 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  -

Replicação remota de dados do ZFS

Os comandos zfs send e zfs recv podem ser usados para copiar remotamente uma representação de fluxo do instantâneo de um sistema a outro. Por exemplo:


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

Este comando envia os dados do instantâneo tank/cindy@today e os recebe no sistema de arquivos sandbox/restfs. O comando também cria um instantâneo restfs@today no sistema newsys. Neste exemplo, o usuário foi configurado para que use ssh no sistema remoto.