O btrfs possui uma maneira eficiente de comparar instantâneos?

20

Embora a comparação de snapshots montados funcione, parece que pode ser terrivelmente lento em muitos casos.

Existe funcionalidade específica do btrfs para diferenciar instantâneos? (Não consegui encontrar nenhum na documentação)

    
por Catskul 18.06.2012 / 21:24

3 respostas

11

Parece que você está procurando por btrfs send / receive , que aparecerá no Linux 3.6. O comando send cria um arquivo de log das diferenças entre dois instantâneos e o comando receive aplica as alterações de um arquivo. Observe que enviar / receber usa um formato de arquivo personalizado, portanto, o arquivo não será exatamente como, digamos, diff ou tar.

    
por 21.08.2012 / 00:08
9

Eu estou executando o Debian stable que não tem btrfs send , então eu olhei para uma solução usando btrfs subvolume find-new .

Se você tiver snapshot1 e snapshot2 e quiser saber o que mudou na última, snapshot 2, uma vez que snapshot1 foi feito, você pode usar o script abaixo, que fornece

btrfs-diff oldsnapshot/ newsnapshot/

que listará todos os arquivos alterados em newsnapshot / desde 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-new encontra arquivos alterados após uma determinada 'geração' de instantâneo. Também informa o número da geração atual.

Advertências

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

Assim, podemos ver o novo arquivo, ver o arquivo modificado, , mas a exclusão não é relatada . Isso ocorre porque o comando relata os arquivos existentes, não os 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, 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, lala será exibido. Então esse comportamento é um pouco estranho. Qual é provavelmente porque o wiki diz:

The find-new approach has some serious limitations and thus is not really usable for something like send/receive.

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

    
por 06.03.2014 / 16:19
1

Isso é suportado pela ferramenta de conveniência de snapshot snapper .

sudo snapper -c config diff 445..446

Claro que isso exige que você use snapper para seus instantâneos.

Esses IDs de snapshots podem ser encontrados usando snapper list -a . Infelizmente, no momento da escrita, o snapper não suportava instantâneos de lista para uma única configuração, embora esses números possam ser encontrados em nomes de subvolume.

    
por 05.04.2017 / 15:41