Como posso examinar passivamente o conteúdo de um fluxo de envio do ZFS?

2

Eu tenho alguns "fluxos de envio" do ZFS armazenados (isto é, eles foram criados redirecionando a saída de zfs send para um arquivo). Gostaria de examinar o conteúdo desses fluxos sem recebê-los e gravá-los em um sistema de arquivos - por exemplo, gostaria de exibir uma lista de nomes de arquivos dentro do fluxo. Existe alguma maneira de fazer isso?

Eu fiz algumas leituras e pesquisas, mas não encontrei nada parecido com o que estou falando. Estou usando as implementações do FreeBSD e do ZFS no Linux do ZFS.

    
por ruief 10.03.2018 / 00:31

2 respostas

5

Você pode obter algumas informações canalizando-as para zstreamdump -d , mas isso não fornecerá informações sobre nomes de arquivos diretamente, porque não há arquivos no fluxo. O fluxo é uma grande diferença entre duas árvores descritas em blocos. No entanto, o código é público, portanto, se você conseguir adicionar a detecção e a análise da estrutura do ZFS, poderá obter mais resultados.

A estrutura interna do ZFS é uma árvore internamente e todas as operações são feitas sobre essa árvore. Arquivos, diretórios, nomes de arquivos, atributos e tudo mais são apenas dados dessa árvore. Instantâneos, volumes e FS são as raízes das árvores, e quando você tira outro instantâneo você está apenas armazenando a raiz atual em algum lugar. Os sistemas vivos estão gerando novas raízes para cada transação, constantemente se afastando das raízes mais antigas, enquanto mantêm muitos dados "deixados" da árvore anterior intactos. O fluxo representa uma lista de operações que devem ser executadas na árvore A para se tornarem B.

Só estou tentando dizer que você pode não ver os dados que está procurando no fluxo porque eles não precisam estar lá. Quando o arquivo é descartado, os blocos correspondentes são liberados para que você não saiba qual era o nome ou o conteúdo do arquivo. Quando o arquivo é alterado, ele é referenciado pelo id do objeto para que você não obtenha nada do fluxo, mesmo que o arquivo tenha sido reescrito a partir do zero, mas a entrada de diretório não tenha sido atualizada.

Você terá sorte se o fluxo não for um fluxo diferencial ou se você tiver alguns dados acima do estado anterior. Mas isso é apenas porque um fluxo completo transforma a raiz vazia na árvore de destino, contendo todos os dados necessários. Portanto, você pode adicionar o código de análise de bloco ao zstreamdump para detectar e processar dados internos do ZFS.

    
por 10.03.2018 / 12:22
2

Resposta curta:

Eu não acredito que haja alguma maneira de catalogar o conteúdo de um fluxo de envio que seja mais leve do que canalizá-lo para o zfs receive para recriá-lo como um conjunto de dados.

Resposta muito mais longa:

Um fluxo de envio é uma coleta de dados em nível de bloco de armazenamento, não uma coleta de dados em nível de sistema de arquivos. Um fluxo de envio não sabe ou não se preocupa com arquivos individuais; Ele é projetado para replicar o que são essencialmente dispositivos de bloco brutos. Enquanto um usuário pode usar exclusivamente zfs send para replicar conjuntos de dados ZFS com arquivos armazenados diretamente neles, outro pode usá-lo para replicar ZVOLs formatados com ext4, ntfs ou até mesmo um sistema criptografado como LUKS - nesses casos, o ZFS não possui absolutamente nenhum conhecimento do que o conteúdo do volume é, ele meramente armazena os blocos brutos para eles.

zfs send funciona exatamente da mesma maneira, independentemente de você estar replicando um conjunto de dados ou um zvol bruto, porque simplesmente não se importa com nada abaixo do nível de armazenamento bruto do bloco. Ele não sabe sobre nomes de arquivos, tamanhos de arquivo, caminhos ou qualquer outra coisa - ele sabe quais blocos pertencem a um snapshot de um zvol ou snapshot, mas não sabe como esses blocos se relacionam um ao outro.

Portanto, não há uma maneira simples de catalogar o conteúdo do arquivo de um fluxo zfs send , porque <<> não há nenhum catálogo interno dos arquivos em um. Mesmo que você saiba de forma conclusiva que esse fluxo em particular é uma replicação completa (não incremental) de um conjunto de dados ZFS não criptografado, você teria que analisar cada bloco dele linha por linha para tentar descobrir quais blocos continham nomes de arquivos.

Essencialmente, para extrair os nomes dos arquivos de um fluxo de envio, você faria o mesmo trabalho que o zfs receive está fazendo aplicando esse fluxo em um conjunto de dados.

    
por 10.03.2018 / 17:59