web-dev-qa-db-ja.com

btrfsサブボリュームを別のbtrfsファイルシステムに移動する簡単な方法はありますか?

統合したい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 sendbtrfs receiveのドキュメントを数回読んだところ、これはうまくいくように見え、基本的にfilesystemBのサブボリューム構造全体を徐々に再構築しています。しかし、私はこれをスクリプト化する必要があるので(サブボリュームの数が多いため)、もっと簡単な方法があることを望んでおり、これはエラーが発生しやすいと感じます。

(さらに、送信/受信ではサブボリュームを読み取り専用にする必要があります。Ubuntu14.04のbtrfs-toolsのバージョンには、既存のサブボリュームを読み取り専用に設定できるbtrfs propertyコマンドがないようです。それ以降のバージョンをインストールすることはできますが、この「本番」マシンでの構成管理のためにしたくありません。

5
jl6

確かに、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を使用して、これらのコンテンツを新しい書き込み可能なサブボリュームにコピーできます。

2
Jodka Lemon

私はあなたがあなたのリストをどこかに持っていることを望みます。 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 [〜#〜]。リストを反復処理して、同期するためにそれぞれに対して送受信を行うことができます。

1
Walf