web-dev-qa-db-ja.com

btrfsにはスナップショットを比較する効率的な方法がありますか?

マウントされたスナップショットの差分は機能しますが、多くの場合、非常に遅くなる可能性があります。

スナップショットを比較するためのbtrfs固有の機能はありますか? (私はドキュメントで何も見つけることができませんでした)

21
Catskul

btrfs send 、これは Linux 3.6で登場 (2012)、「2つのサブボリュームスナップショット間に変更のストリームを生成します。」 --no-dataフラグを追加して、高速メタデータ比較を生成するためだけに使用できます。

btrfs send --no-data -p /snapshots/parent /snapshots/child

通常は、--no-dataフラグを削除し、出力を btrfs receive にパイプして、 増分バックアップ を実行します。たとえば、/snapshots/parent/backup/snapshots/parentにすでに存在する場合、btrfs sendはそれらの変更のみを/backupファイルシステムにストリーミングします。

btrfs send -p /snapshots/parent /snapshots/child | btrfs receive /backup/snapshots
11
amcnabb

私はDebianの安定版を実行しています。 するbtrfs sendがなかったため、btrfs subvolume find-newを使用した解決策を探しました。

更新:btrfs sendLinux 3.6で追加 で、2012年にリリースされ、2015年までにDebian安定版に含まれました。

Snapshot1とsnapshot2があり、後者のスナップショット2で何が変更されたかを知りたい場合、snapshot1が作成されたため、以下のスクリプトを使用して、

btrfs-diff oldsnapshot/ newsnapshot/

oldsnapshot /以降にnewsnapshot /で変更されたすべてのファイルをリストします。

#!/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

説明すると:btrfs subvolume find-newは、スナップショットの特定の「世代」の後に変更されたファイルを検出します。また、現在の世代番号も報告します。

注意事項

例えばサブボリュームケースの毎日のスナップショットを取得します。

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

Snap1とsnap2の違いは何ですか?

$ btrfs-diff snap1/ snap2/
bar1
foo2

新しいファイル、変更されたファイルが表示されますが、削除は報告されません。これは、コマンドが存在しないファイルではなく、存在するファイルについて報告するためです。

Snap2とライブサブボリュームの違いは何ですか?

$ btrfs-diff snap2/ live/
foo3

名前を変更したファイルは報告されません。そのデータは変更されていません。

名前を変更したファイルにデータを追加するとどうなるでしょうか

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

わかりました。しかし、新しいファイルを作成しましょう

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

えっ! lalaはどこですか。別のファイルを追加すると、lalaが表示されます。したがって、この動作は少し奇妙です。これがおそらくウィキが言う理由です:

新しい検索方法にはいくつかの深刻な制限があるため、送信/受信などには実際には使用できません。

ただし、奇妙なのは、(読み取り専用の)スナップショットを比較するときではなく、ライブサブボリュームを以前の状態と比較するときです。そのため、削除されたファイルも識別したくない場合は、これはまだ便利です。

10
artfulrobot

これは、スナップショット便利ツールsnapperでサポートされています。

Sudo snapper -c config diff 445..446

もちろん、これにはスナップショットにsnapperを使用する必要があります。

このスナップショットIDは、snapper list -aを使用して見つけることができます。残念ながら、これらの番号はサブボリューム名から確認できますが、現時点ではsnapperは単一の構成のリストスナップショットをサポートしていませんでした。

1
Att Righ