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


21

マウントされたスナップショットの差分は機能しますが、多くの場合恐ろしく遅くなるようです。

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


どのブロックがどのように変更されたかを調べることは可能かもしれませんが、ファイルシステム(ディレクトリ)を本当に比較したい場合は、後で変更が元に戻された場合を考慮する必要があります。たとえば、Aを含むファイルがある場合、そのスナップショットaに書き込みb、後でそれをに戻しaます。ファイルは実際にはまったく変更されませんでした。
クリスティアン・Ciupitu

何かが足りない限り、この種のことは常に行われるソースコードのリビジョン管理に完全に似ているようです。
-Catskul

btrfsファイルシステムでrsyncのようなものを実行することの追加の問題は、noatimeマウントオプションが使用されない限り、すべてのファイルを読み取って変更されたかどうかを確認するとそれらが効果的に変更され、実際にファイルが変更されていなくても次のスナップショットが大きくなることです。議論については、lwn.net / Articles / 499293を参照してください。
ルカシティ

回答:


11

Linux 3.6に登場するbtrfs send / receiveを探しているようです。このsendコマンドは、2つのスナップショットの違いのログファイルを作成receiveし、ファイルからの変更を適用します。送信/受信ではカスタムファイル形式が使用されるため、ファイルはdiffやtarなどとまったく同じようには見えません。


いいね!それがまさに私が探していたものです。
Catskul

2
この出力は、参照解析する例アプリの場合:github.com/sysnux/btrfs-snapshots-diff(ない私による)
肥満児RIGH

10

持っていないDebian安定版を実行しているbtrfs sendので、を使用してソリューションを探しましたbtrfs subvolume find-new

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

OK、理にかなっています。しかし、新しいファイルを作成しましょう

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

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

新規検索アプローチにはいくつかの重大な制限があり、したがって送信/受信などの用途には実際には使用できません。

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


ちょっと、ツールを少し拡張しました。このツールはあなたに(それはまた、個々のリンクを選択することができます)スナップショットに起こったすべての変更の流れが表示されますgithub.com/talwrii/btrlog
肥満児RIGH

1

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

sudo snapper -c config diff 445..446

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.