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)
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)
Respostas:
Parece que você está procurando por envio / recebimento de btrfs , que aparecerá no Linux 3.6. O send
comando cria um arquivo de log das diferenças entre dois instantâneos, e o receive
comando 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.
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-new
localiza arquivos alterados após uma 'geração' específica de instantâneo. Ele também relata o número da geração atual.
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á lala
exibido. 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.
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 snapper
para 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.
A
contendoa
, escrevab
em seu instantâneo e depois altere-o novamente paraa
, o arquivo não foi realmente alterado.