マウントされたスナップショットの差分は機能しますが、多くの場合、非常に遅くなる可能性があります。
スナップショットを比較するためのbtrfs固有の機能はありますか? (私はドキュメントで何も見つけることができませんでした)
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
私はDebianの安定版を実行しています。 するbtrfs send
がなかったため、btrfs subvolume find-new
を使用した解決策を探しました。
更新:
btrfs send
は Linux 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
が表示されます。したがって、この動作は少し奇妙です。これがおそらくウィキが言う理由です:
新しい検索方法にはいくつかの深刻な制限があるため、送信/受信などには実際には使用できません。
ただし、奇妙なのは、(読み取り専用の)スナップショットを比較するときではなく、ライブサブボリュームを以前の状態と比較するときです。そのため、削除されたファイルも識別したくない場合は、これはまだ便利です。
これは、スナップショット便利ツールsnapper
でサポートされています。
Sudo snapper -c config diff 445..446
もちろん、これにはスナップショットにsnapper
を使用する必要があります。
このスナップショットIDは、snapper list -a
を使用して見つけることができます。残念ながら、これらの番号はサブボリューム名から確認できますが、現時点ではsnapperは単一の構成のリストスナップショットをサポートしていませんでした。