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

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

統合したい2つの別々のbtrfsファイルシステムがあります。サブボリューム構造は次のとおりです。

/ filesystemA
|- subvolume1
|- subvolume2
|- ...
|- subvolumeN

/ filesystemB
|- subvolume1
|- subvolume2
|- ...
|- subvolumeM

filesystemB目標です。毎日のスナップショットサブボリュームなので、サブボリューム1をNからfilesystemB.over 1000に移動したいと思います。Nまた、両者の差が小さい。つまり、共有データが多い。filesystemA1TBですが、duパス内のファイルの総数が300TBを超えています(ドライブの実際のスペース使用量は500GB未満です)。

したがって、btrfsサブボリュームまたはデータの共有特性を認識しないため、直接mvまたはcpto filesystemAtoが実現可能であるとは思わない。filesystemB

btrfs sendドキュメントを何度も読んbtrfs receiveでいましたが、これはうまくいくようです。デフォルトでは、filesystemBサブボリューム構造全体を徐々に再構築します。しかし、より簡単な方法があることを願っています。なぜなら、スクリプトを書く必要があり(サブボリュームの数が多いため)、エラーが発生しやすいと思うからです。

(また、送受信にはサブボリュームが読み取り専用である必要があり、Ubuntu 14.04のbtrfs-toolsバージョンにはbtrfs property既存のサブボリュームを読み取り専用に設定するコマンドがないようです。で構成管理を実行することはこれを望まない。

答え1

私はあなたが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

あなたのリストを見つけたことを願っています。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/')

ファイルシステムの読み取り専用スナップショットボリュームのリストを提供する必要があります。どれいいえファイルシステムで第二。同期する各リストに対して送受信を実行して、リストを繰り返すことができます。

関連情報