btrfsファイルシステムをコピーする方法


17

btrfsファイルシステムの内容の完全なコピーを作成するにはどうすればよいですか?完全なコピー私だけではなく意味、現在のデータが、また、異なるサブボリュームを自分でスナップショット同じ内容のブロックを複製しません。理想的に自分のCoW構造(すなわち保存します、。

ブロックレベルのコピー(withなどdd)は、UUIDを複製するため、良いアイデアではないようです。明らかそれを簡単に変更する方法はありません

回答:


4

オプション1-ダムデータコピーしてからUUIDを変更する

ソースパーティションがアンマウントされ、自動マウントされないことを確認します。

使用するかdd(遅い、ダム)またはpartclone.btrfs -b -s /dev/src -o /dev/target

btrfstune -uコピー後、マウント前にUUIDを変更するために使用します。

データ損失の警告はDOは、NOTマウント(自動)にしてみてくださいどちらか元またはコピーUUIDが変更されるまで、


オプション2- btrfs-clone

私は個人的に試したことはありませんbtrfs-cloneが、既存のBTRFSファイルシステムを新しいものに複製し、各サブボリュームを順番に複製することを意図しています。


1
完全を期すため、これは2015年の間のbtrfs-progsパッケージにオプションとして追加されました:github.com/kdave/btrfs-progs/commit/...
goncalopp

16

今日(2016-05-06)には既成のソリューションは見つかりませんでしたが、コピーオンライト処理などの目的のために問題を解決しました。「クローン」/sourceする手順/targetは次のとおりです。

  1. 次の順序でサブボリュームのリストを取得しますogenbtrfs subvolume list -qu --sort ogen /source。ソートは、おそらく以前のものに依存するスナップショットまたはサブボリュームが最初に処理されることを保証するのに十分です。これは、最初にベースボリュームを転送する必要があるため、コピーオンライトの処理にとって重要です。

  2. を使用して、すべてのサブボリュームを読み取り専用にしbtrfs property set -ts /source/some-volume ro trueます。

  3. ここで、上のリストの各サブボリュームに対して、先頭から始めて、次を実行します。

    1. ボリュームに-親UUIDがない(として表示される)か、親UUIDがリストにもう存在しない場合は、次を実行します。btrfs send /source/some/volume | btrfs receive /target/some/

    2. ボリュームにまだ存在する親UUIDが存在する場合は、すでに転送されているはずなので、--sort ogenデータの重複を避けるためにそれをベースとして使用できます。したがって、リスト内で親UUIDのパスを見つけて実行しますbtrfs send -p /source/parent/volume/ -c /source/parent/volume/ /source/some/volume/ | btrfs receive /target/some/(btrfsはおそらく-p引数を自動的に推測しますが、明示的に指定することを好みます)。

    3. 上記のコマンドのいずれかを実行した後、ターゲットとソースを読み書き可能にしますbtrfs property set -ts /source/some/volume ro false; btrfs property set -ts /target/some/volume ro false。ソースが以前に読み取り専用であった場合、このステップはスキップできます。

これは多くのケースを処理するはずです。警告:

  1. サブボリューム/スナップショットをネストする際の順序付けに関して、いくつかの問題が生じる可能性があります。

  2. スクリプトを作成すると、プロセス全体が明らかに楽しくなります。

  3. btrfs send複数のクローンソース(-c)引数を受け入れます。親のボリュームパスを指定するだけでなく、祖先のパスまたは単に以前に送信されたボリュームのパスも指定すると便利な場合があります。ここでは何の違いもありませんでしたが、場合によってはデータの重複を避けるのに役立つかもしれません。

  4. スナップショットまたはサブボリュームのメタ情報が途中で失われるかどうかはわかりませんが、ほとんどのユースケースで興味深い他のすべてのものを保持する必要があります。

プロセス全体により、3.8 GBを使用した800 GBのファイルシステム(によるdf)を3.8 GBを使用した10 GBのイメージに転送できました。約190 GBを使用せずに転送する-p-c、データの重複は実際に回避されました。


よく書かれた答え、ありがとう。どういうogen意味ですか?
ドラムファイア

@drumfire ogenは、サブボリュームの「オリジン生成」です。私は、違いを完全に理解していないこと、または(非元の)生成を使用することが正しいかどうかを認める必要がありますが、いくつかのテストでこれがうまく機能したことを示しています(重複を回避)。サブボリュームに基づいてスナップショットを作成すると、世代は更新されるように見えますが、genは更新されません。いくつかの調査結果について聞いてみたいと思います。IRCまたはBtrfsメーリングリストで確認することをお勧めします。
トーマスルザット16年

2
@ThomasLuzatのアルゴリズムを採用し、その周りにいくつかの毛羽立ち(エラーチェックなど)を追加して、github.com / jernst / btrfs-copy-filesystem / blob / master / …に配置しました。破損したディスクから降りる私の問題に対してはうまくいきましたが、他の人にうまくいくという保証はありません。とにかく、誰かがこれをコーディングするためにスクラッチ以外の場所から始めたい場合に備えて、とにかくここに投稿しています。現在、新しいUBOSメソッドに依存していますが、簡単に移植できるはずです。
ヨハネスエルンスト

6

これを行うことができるpythonツールを作成しました。これは、私自身と@Johannes Ernstの実装の両方で@Thomas Luzatのアプローチを試し、クローン作成手順で使用スペースが20GBから40GBに倍増したためです。もっと効率的なものが必要だと思いました。

この一般的なファイルシステムの履歴を考慮してください。

current ---------------------------------\
             |       |        |          |
           snap4   snap3    snap2      snap1

Thomasのアルゴリズムでは、「現在」が最初に複製され、すべてのスナップショット(以前の「現在」の状態のスナップショットである)は複製ソース/親として「現在」を使用します。明らかに、snap3をsnap4に、snap2をsnap3に、などとする方が良いでしょう。

そして、これは氷山の一角にすぎません。複雑な履歴を持つbtrfsファイルシステムで(スペース節約の観点から)「最適な」クローンソースを見つけることは、些細な問題ではありません。この問題を解決するために、スペースをより効率的に使用する3つの戦略を考え出しました。実際、クローンのサイズはソースのサイズよりわずかに小さくなりました。

興味があれば、githubページで詳細を読むことができます。



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