O btrfs tem uma maneira eficiente de comparar snapshots?

21

Embora diferentes snapshots montados funcionem, parece que pode ser terrivelmente lento em muitos casos.

Existe funcionalidade específica do btrfs para diferentes snapshots? (Não foi possível encontrar nenhum documento)

Catskul
fonte
Embora seja possível descobrir quais blocos foram alterados e como, é necessário considerar o caso em que uma alteração foi revertida posteriormente, se você realmente deseja comparar sistemas de arquivos (diretórios). Por exemplo, se você tiver um arquivo Acontendo a, escreva bem seu instantâneo e depois altere-o novamente para a, o arquivo não foi realmente alterado.
Cristian Ciupitu 18/06/12
Parece que seria completamente análogo ao controle de revisão do código fonte, onde esse tipo de coisa é feito o tempo todo, a menos que eu esteja perdendo alguma coisa.
Catskul
Um problema adicional de executar algo como rsync em um sistema de arquivos btrfs é que, a menos que a opção de montagem noatime tenha sido usada, a leitura de todos os arquivos para verificar se eles foram alterados os modificaria efetivamente e o próximo instantâneo seria grande mesmo que nenhum arquivo fosse realmente modificado . Veja lwn.net/Articles/499293 para uma discussão.
Luca Citi

Respostas:

11

Parece que você está procurando por envio / recebimento de btrfs , que aparecerá no Linux 3.6. O sendcomando cria um arquivo de log das diferenças entre dois instantâneos, e o receivecomando aplica as alterações de um arquivo. Observe que o envio / recebimento usa um formato de arquivo personalizado, para que o arquivo não seja exatamente como, digamos, diff ou tar.

amcnabb
fonte
Agradável! Era exatamente o que eu estava procurando.
Catskul
2
Para um exemplo aplicativo que analisa esta saída, consulte: github.com/sysnux/btrfs-snapshots-diff (não por mim)
Att Righ
10

Estou executando o Debian stable que não possui btrfs send, então procurei uma solução usando btrfs subvolume find-new.

Se você possui o snapshot1 e o snapshot2 e deseja saber o que mudou no posterior, o snapshot 2, desde que o snapshot1 foi criado, você pode usar o script abaixo, que fornece

btrfs-diff oldsnapshot/ newsnapshot/

que listará todos os arquivos alterados no newsnapshot / from oldsnapshot /.

#!/bin/bash
usage() { echo $@ >2; echo "Usage: $0 <older-snapshot> <newer-snapshot>" >2; exit 1; }

[ $# -eq 2 ] || usage "Incorrect invocation";
SNAPSHOT_OLD=$1;
SNAPSHOT_NEW=$2;

[ -d $SNAPSHOT_OLD ] || usage "$SNAPSHOT_OLD does not exist";
[ -d $SNAPSHOT_NEW ] || usage "$SNAPSHOT_NEW does not exist";

OLD_TRANSID=`btrfs subvolume find-new "$SNAPSHOT_OLD" 9999999`
OLD_TRANSID=${OLD_TRANSID#transid marker was }
[ -n "$OLD_TRANSID" -a "$OLD_TRANSID" -gt 0 ] || usage "Failed to find generation for $SNAPSHOT_NEW"

btrfs subvolume find-new "$SNAPSHOT_NEW" $OLD_TRANSID | sed '$d' | cut -f17- -d' ' | sort | uniq

Para explicar: btrfs subvolume find-newlocaliza arquivos alterados após uma 'geração' específica de instantâneo. Ele também relata o número da geração atual.

Ressalvas

por exemplo, tire o instantâneo diário de um caso de subvolume:

mkdir test && cd test
btrfs subvolume create live
date >live/foo1
date >live/bar1
btrfs subvolume snapshot live/ snap1
date >live/foo2  # new file
date >>live/bar1 # modify file
rm live/foo1     # delete file
btrfs subvolume snapshot live/ snap2
date >live/foo3  # new file
mv live/bar{1,2} # rename file
rm live/foo2     # delete file

O que mudou entre snap1 e snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Portanto, podemos ver o novo arquivo, o arquivo modificado, mas a exclusão não é relatada . Isso ocorre porque o comando reporta arquivos que existem, não arquivos que agora não existem.

O que mudou entre o snap2 e o subvolume ao vivo?

$ btrfs-diff snap2/ live/
foo3

o arquivo renomeado não é relatado . Seus dados não foram alterados.

Agora, e se adicionarmos dados ao arquivo renomeado

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3

OK, faz sentido. Mas vamos fazer um novo arquivo

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3

Eh! onde está o lala? . Se você adicionar outro arquivo, será lalaexibido. Portanto, esse comportamento é um pouco estranho. Provavelmente, é por isso que o wiki diz:

A abordagem de encontrar novo tem algumas limitações sérias e, portanto, não é realmente utilizável para algo como enviar / receber.

No entanto, a estranheza ocorre quando você compara um subvolume ativo com um estado anterior, e não quando você compara instantâneos (somente leitura). Portanto, isso ainda pode ser útil, a menos que você também deseje identificar arquivos excluídos.

artfulrobot
fonte
Olá, ampliei um pouco sua ferramenta. Esta ferramenta irá mostrar-lhe um fluxo de todas as mudanças que aconteceram em instantâneos (que também pode selecionar links individuais) github.com/talwrii/btrlog
Att Righ
1

Isso é suportado pela ferramenta de conveniência de captura instantânea snapper.

sudo snapper -c config diff 445..446

É claro que isso exige que você esteja usando snapperpara seus instantâneos.

Os IDs deste instantâneo podem ser encontrados usando snapper list -a. Infelizmente, no momento em que escrevi, o snapper não suportava instantâneos da lista para uma única configuração, embora esses números possam ser encontrados nos nomes dos subvolumes.

Att Righ
fonte