統合したい2つの別々のbtrfsファイルシステムがあります。サブボリューム構造は次のようになります。
/ filesystemA
|- subvolume1
|- subvolume2
|- ...
|- subvolumeN
/ filesystemB
|- subvolume1
|- subvolume2
|- ...
|- subvolumeM
filesystemB
がターゲットです。サブボリューム1からNをfilesystemB
に移動したいと思います。 N
は、毎日のスナップショットサブボリュームであるため、1000を超えます。これも、これらの違いが最小限であるため、共有データが大量にあるためです。 filesystemA
は1 TBですが、パス上の単純なdu
は合計で300 TBを超えるファイルです(ドライブ上の実際のスペース使用量は500 GB未満です)。
したがって、_mv
からcp
までのfilesystemA
またはfilesystemB
は、btrfsのサブボリュームやデータの共有の性質を認識しないため、実現不可能であると思います。
btrfs send
とbtrfs receive
のドキュメントを数回読んだところ、これはうまくいくように見え、基本的にfilesystemB
のサブボリューム構造全体を徐々に再構築しています。しかし、私はこれをスクリプト化する必要があるので(サブボリュームの数が多いため)、もっと簡単な方法があることを望んでおり、これはエラーが発生しやすいと感じます。
(さらに、送信/受信ではサブボリュームを読み取り専用にする必要があります。Ubuntu14.04のbtrfs-toolsのバージョンには、既存のサブボリュームを読み取り専用に設定できるbtrfs property
コマンドがないようです。それ以降のバージョンをインストールすることはできますが、この「本番」マシンでの構成管理のためにしたくありません。
確かに、btrfs-send/btrfs-receiveを回避することはできません。別のオプションは、サブボリュームをコピーしてから、それらを宛先で重複排除することですが、これには時間がかかります。
読み取り専用の問題の場合:これらは毎日のスナップショットなので、ボリュームのほとんどを読み取り専用にしないでください。
私はするだろう
$btrfs subvolume create /subvolumeA/source
$for i in /filesystemA/subvolume*; do btrfs subvolume snapshot -r $i /filesystemA/source/$i; done
これで、/ filesystemA/source/readonlyの下にすべてのサブボリュームがあります。
これで、親ステートメントを指定したbtrfs-sendを使用してループで増分的に宛先に送信できます。
一部のスナップショットを再度書き込み可能にする必要がある場合は、cp --reflink
を使用して、これらのコンテンツを新しい書き込み可能なサブボリュームにコピーできます。
私はあなたがあなたのリストをどこかに持っていることを望みます。 property
コマンドがそのバージョンで文書化されていないことを確認しますか? この回答 は、btrfs property set -ts /path/to/snapshot ro true
のようなコマンドを使用して問題を修正できることを示唆しています。
今後の読者向け:作成時に-r
パラメータを使用して、新しいスナップショットを読み取り専用に設定します。スクリプトで次のようなものを使用しています:
comm -23 \
<(btrfs subvolume list -ors --sort=path /fsA/ | Perl -ne 'print if s/.+?\spath\s+(.+)/\1/') \
<(btrfs subvolume list -ors --sort=path /fsB/ | Perl -ne 'print if s/.+?\spath\s+(.+)/\1/')
これにより、ファイルシステム上の読み取り専用スナップショットボリュームのリストが提供されます[〜#〜] a [〜#〜]これらはではありませんファイルシステム上[〜#〜] b [〜#〜]。リストを反復処理して、同期するためにそれぞれに対して送受信を行うことができます。