Existe uma maneira simples de mover subvolumes btrfs para um sistema de arquivos btrfs diferente?

5

Eu tenho dois sistemas de arquivos btrfs separados que gostaria de consolidar. A estrutura do subvolume se parece com isso:

/ filesystemA
|- subvolume1
|- subvolume2
|- ...
|- subvolumeN

/ filesystemB
|- subvolume1
|- subvolume2
|- ...
|- subvolumeM

filesystemB é o alvo. Eu gostaria de mover subvolumes 1 para N em filesystemB . N é mais que 1000, já que são subvolumes de captura instantânea diária - também devido a isso as diferenças entre elas são mínimas, ou seja, há muitos dados compartilhados. filesystemA é 1TB, mas um ingênuo du no caminho totaliza mais de 300TB de arquivos (o uso de espaço real na unidade é inferior a 500 GB).

Portanto, acredito que um mv ou cp de filesystemA a filesystemB seja inviável, pois não estará ciente dos subvolumes btrfs ou da natureza compartilhada dos dados.

Eu li a documentação sobre btrfs send e btrfs receive um par de vezes e parece que isso pode funcionar, essencialmente reconstruindo toda a estrutura de subvolume em filesystemB incrementalmente. Mas eu estou esperando que haja uma maneira mais simples, já que eu teria que roteirizar isso (devido ao grande número de subvolumes) e eu sinto que isso pode ser propenso a erros.

(Além disso, enviar / receber requer que os subvolumes sejam somente leitura, e a versão do btrfs-tools no Ubuntu 14.04 não parece ter o comando btrfs property que me permitiria configurar um subvolume existente para ler Eu poderia instalar uma versão posterior, mas preferiria não fazer o gerenciamento de configuração nesta máquina de "produção".

    
por jl6 28.06.2015 / 14:02

2 respostas

2

Tenho certeza de que você não passará por btrfs-send / btrfs-receive. Outra opção seria copiar os subvolumes e depois desduplicá-los no destino, mas isso levaria muito tempo.

Para o problema de somente leitura: como esses são instantâneos diários, não são quase todos os volumes somente leitura?

Eu faria um

$btrfs subvolume create /subvolumeA/source
$for i in /filesystemA/subvolume*; do btrfs subvolume snapshot -r $i /filesystemA/source/$i; done

Agora você tem todos os subvolumes em / filesystemA / source / readonly.

Agora você poderia enviá-los em um loop incrementalmente com btrfs-send com a instrução pai para o destino.

Se alguns dos instantâneos devem ser graváveis novamente, você pode copiar o conteúdo destes para um novo subvolume gravável usando cp --reflink .

    
por 29.06.2015 / 19:17
1

Espero que você tenha chegado a algum lugar da sua lista. Tem certeza de que os comandos property não estão documentados nessa versão? Esta resposta sugere que você pode usar um comando como btrfs property set -ts /path/to/snapshot ro true para corrigir o problema.

Para leitores futuros: defina novos instantâneos como somente leitura, com o parâmetro -r ao criá-los. Estou usando algo assim no meu script:

comm -23 \
    <(btrfs subvolume list -ors --sort=path /fsA/ | perl -ne 'print if s/.+?\spath\s+(.+)//') \
    <(btrfs subvolume list -ors --sort=path /fsB/ | perl -ne 'print if s/.+?\spath\s+(.+)//')

Isso deve fornecer uma lista de volumes de snapshots somente leitura no sistema de arquivos A que não são no sistema de arquivos B . Você pode iterar a lista, enviando / recebendo em cada um para sincronizar.

    
por 10.05.2017 / 03:13