Est-ce que btrfs a un moyen efficace de comparer les instantanés?

21

Bien que différents instantanés montés fonctionnent, il semble que cela pourrait être horriblement lent dans de nombreux cas.

Existe-t-il des fonctionnalités spécifiques à btrfs pour les différents instantanés? (Je n'ai pas pu en trouver dans les documents)

Catskul
la source
Bien qu'il soit possible de savoir quels blocs ont été modifiés et comment, vous devez considérer le cas où une modification a été annulée ultérieurement, si vous voulez vraiment comparer les systèmes de fichiers (répertoires). Par exemple, si vous avez un fichier Acontenant a, écrivez bdans son instantané et changez-le plus tard a, le fichier n'a pas vraiment changé du tout.
Cristian Ciupitu
Il semble que ce serait complètement analogue au contrôle de révision du code source où ce genre de chose se fait tout le temps, sauf si je manque quelque chose.
Catskul
Un autre problème lié à l'exécution de quelque chose comme rsync sur un système de fichiers btrfs est que, sauf si l'option de montage noatime a été utilisée, la lecture de tous les fichiers pour vérifier s'ils ont changé les modifierait efficacement et l'instantané suivant serait volumineux même si aucun fichier n'était réellement modifié . Voir lwn.net/Articles/499293 pour une discussion.
Luca Citi

Réponses:

11

Il semble que vous recherchiez l' envoi / la réception de btrfs , qui apparaîtra sous Linux 3.6. La sendcommande crée un fichier journal des différences entre deux instantanés et la receivecommande applique les modifications à partir d'un fichier. Notez que l'envoi / la réception utilise un format de fichier personnalisé, de sorte que le fichier ne ressemblera pas exactement, disons, diff ou tar.

amcnabb
la source
Agréable! C'est exactement ce que je cherchais.
Catskul
2
Pour un exemple d'application qui analyse cette sortie, voir: github.com/sysnux/btrfs-snapshots-diff (pas par moi)
Att Righ
10

J'utilise Debian stable, ce qui n'est pas le cas btrfs send, j'ai donc cherché une solution en utilisant btrfs subvolume find-new.

Si vous avez snapshot1 et snapshot2 et que vous voulez savoir ce qui a changé dans le dernier, snapshot 2, puisque snapshot1 a été créé, vous pouvez utiliser le script ci-dessous qui fournit

btrfs-diff oldsnapshot/ newsnapshot/

qui listera tous les fichiers modifiés dans newsnapshot / depuis 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

Pour expliquer: btrfs subvolume find-newtrouve les fichiers modifiés après une «génération» particulière d'instantanés. Il indique également le numéro de génération actuel.

Avertissements

par exemple, prenez l'instantané quotidien d'un cas de sous-volume:

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

Qu'est-ce qui a changé entre snap1 et snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Nous pouvons donc voir le nouveau fichier, voir le fichier modifié, mais la suppression n'est pas signalée . Cela est dû au fait que la commande signale les fichiers qui existent, pas ceux qui n'existent plus.

Qu'est-ce qui a changé entre snap2 et le sous-volume live?

$ btrfs-diff snap2/ live/
foo3

le fichier renommé n'est pas signalé . Ses données n'ont pas changé.

Et si nous ajoutons des données au fichier renommé

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

OK, c'est logique. Mais créons un nouveau fichier

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

hein! où est lala? . Si vous ajoutez un autre fichier, lalaapparaît. Ce comportement est donc un peu étrange. C'est probablement pourquoi le wiki dit:

L'approche find-new a de sérieuses limites et n'est donc pas vraiment utilisable pour quelque chose comme envoyer / recevoir.

Cependant, l'étrangeté survient lorsque vous comparez un sous-volume en direct à un état précédent, et non lorsque vous comparez des instantanés (en lecture seule). Cela pourrait donc être utile, sauf si vous souhaitez également identifier les fichiers supprimés.

artfulrobot
la source
Hé là, j'ai un peu étendu votre outil. Cet outil vous montrera un flux de toutes les modifications qui se sont produites dans les instantanés (il peut également sélectionner des liens individuels) github.com/talwrii/btrlog
Att Righ
1

Ceci est pris en charge par l'outil de commodité de l'instantané snapper.

sudo snapper -c config diff 445..446

Bien sûr, cela vous oblige à utiliser snapperpour vos instantanés.

Ces identifiants de capture instantanée peuvent être trouvés à l'aide de snapper list -a. Malheureusement, au moment de l'écriture, Snapper ne prenait pas en charge les instantanés de liste pour une seule configuration, bien que ces chiffres puissent être trouvés à partir des noms de sous-volume.

Att Righ
la source