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.