Para um subvolume btrfs, tenho um backup incremental simples criado a partir de dois estágios:
btrfs send old/@ > base.btrfs
btrfs send new/@ -p old/@ > update.btrfs
Os dois subvolumes de origem são instantâneos capturados em momentos separados do mesmo subvolume montado ativamente.
No destino, tento restaurar:
btrfs receive ./ < base.btrfs
btrfs receive ./ < update.btrfs
A expectativa é que o comando anterior crie um instantâneo restaurado do estágio de backup inicial e que o último aplique o estágio incremental adicional.
O comando anterior é bem-sucedido, mas o último falha:
ERROR: creating snapshot ./@ -> @ failed: File exists
Como é óbvio que não posso aplicar utilmente o último estágio a um destino que não existe, estou confuso sobre por que o processo executa essa verificação, bem como o que se espera que tenha sucesso na aplicação da atualização.
Como posso aplicar o estágio de atualização ao destino gerado pela restauração do estágio inicial?
Você não pode ter (como no lado do envio) vários subvolumes com o mesmo nome.
Você pode
mv
o instantâneo/subvolume base no sistema de destino:Eu aprendi o suficiente para responder à pergunta desde que a publiquei.
A resposta tem duas partes.
Primeiro, o
receive
subcomando sempre cria uma nova entrada no diretório de destino com o mesmo nome do subvolume original, seja o novo subvolume criado a partir de um fluxo filho ou pai. Portanto, o diretório de destino deve estar vazio, pelo menos com qualquer nome que tenha o mesmo que o subvolume original. Uma técnica simples seria criar um novo diretório vazio para cada sub-volume pai e filho.Em segundo lugar, embora a invocação do subcomando em um filho não faça referência a um pai, ela pode utilizar os dados necessários do pai, desde que o pai tenha sido restaurado em um subvolume para a mesma partição. Ou seja, o
receive
subcomando terá o efeito desejado para o fluxo filho desde que tenha sido invocado anteriormente na mesma partição para o pai.Uma vez que o pai e os filhos tenham sido restaurados, quaisquer pais podem ser excluídos sem prejudicar os filhos.
Consequentemente, o seguinte seria uma sequência de comando eficaz para o objetivo original:
Todo o conteúdo do fluxo filho estaria disponível por meio do
./@
.Naturalmente, comandos adicionais seriam necessários se o fluxo filho direcionado para preservação tivesse vários ancestrais (por exemplo
base.btrfs
, tivesse um pai próprio).