Como posso validar uma imagem de instantâneo do ZFS que reside em um sistema de backup?

6

Estou executando um host do FreeBSD com o ZFS.

Vamos fingir que estou armazenando uma série de imagens de instantâneos incrementais do ZFS em um host remoto usando zfs send :

zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago > /nfs/backups/foo.zfs

Ou talvez eu queira enviar o fluxo através de um servidor FTP:

% ftp backup
ftp> put "| zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago" /backups/foo.zfs

Gostaria de validar esta imagem remota. Gostaria de imprimir uma lista de instantâneos que estão nesta imagem ou, opcionalmente, extrair uma soma de verificação ou outros metadados para ajudar a verificar se a imagem é válida e contém os instantâneos como eu esperava.

Como posso consultar o arquivo de imagem e ver o que há dentro dele?

Eu tentei zfs receive com os sinalizadores -nv ( no-op e verbose ) para listar os instantâneos na imagem, mas isso pode não funcionar em um sistema ativo:

# zfs receive -nv zpool < /nfs/backups/foo.zfs
cannot receive new filesystem stream: destination 'zpool' exists
must specify -F to overwrite it
# zfs receive -nv -F zpool < /nfs/backups/foo.zfs
cannot receive new filesystem stream: destination has snapshots (eg. zpool@09hoursago)
must destroy them to overwrite it
    
por Stefan Lasiewski 13.03.2015 / 21:42

2 respostas

6

Versões mais modernas do ZFS fornecem um comando chamado zstreamdump , que pode fornecer informações legíveis por humanos a partir de um fluxo (ou imagem) criada usando zfs send .

Este é um exemplo usando a linha de comando:

host # zstreamdump < foo.zfs 
BEGIN record
    ...
    toname = zpool/data/foo@04hoursago
    END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
    ...
    Total write size = 54784 (0xd600)

E um exemplo do FTP:

ftp> get /backups/foo.zfs "| zstreamdump"
BEGIN record
 hdrtype = 1
 ...
 toname = zpool/data/foo@04hoursago
 END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
 ...

Isso me fornece o nome do instantâneo real e uma soma de verificação desse instantâneo. Ele não me fornecerá uma lista de arquivos dentro do instantâneo, é claro, porque essa informação existe em uma camada diferente.

Na verdade, eu não tentei isso em um instantâneo incremental criado usando zfs send -i , mas isso pode ser o que eu quero.

    
por 14.03.2015 / 01:00
2

Eu acho que o problema com a abordagem -nv foi que os sistemas de arquivos intermediários não são criados ao receber com -n e, portanto, falharão sempre, enquanto ele funciona sem o flag sem operação (mas expandindo os sistemas de arquivos completos) pode demorar muito tempo). Infelizmente, a maioria dos documentos / blogs on-line não usam esse sinalizador, portanto, eles nunca experimentam esse erro como você (e eu) o fizemos.

Além disso, uma palavra de advertência do Guia de práticas recomendadas do ZFS do Solaris Internals :

If you store ZFS send stream on a file or on tape, and that file becomes corrupted, then it will not be possible to receive it, and none of the data will be recoverable. However, Nevada, build 125 adds the zstreamdump(1m) command to verify a ZFS snapshot send stream. See also, RFE 6736794.

Especialmente com grandes conjuntos de dados, isso significa três coisas:

  • Se o seu fluxo estiver armazenado, você não confia na segurança do bit, você precisaria verificar quase o tempo todo e ainda viver com o risco de que um único erro de bit limpe todo o seu backup.
  • Se o seu fluxo estiver no armazenamento em que você confia (por exemplo, em um volume do ZFS exportado como NFS), você está relativamente salvo, mas perderá zfs list -r e zfs diff .
  • Se você tiver acesso ao armazenamento nativo (por exemplo, o volume do ZFS acessado por SSH), poderá expandir os sistemas de arquivos recebidos e usar as ferramentas mencionadas. Também neste caso, a opção -v funciona como esperado e pode ser analisada facilmente.
por 06.04.2016 / 18:16

Tags