btrfsファイルシステムの内容の完全なコピーを作成するにはどうすればよいですか?完全なコピー私だけではなく意味、現在のデータが、また、異なるサブボリュームを自分でスナップショット同じ内容のブロックを複製しません。理想的に自分のCoW構造(すなわち保存します、。
ブロックレベルのコピー(withなどdd
)は、UUIDを複製するため、良いアイデアではないようです。明らかに、それを簡単に変更する方法はありません。
btrfsファイルシステムの内容の完全なコピーを作成するにはどうすればよいですか?完全なコピー私だけではなく意味、現在のデータが、また、異なるサブボリュームを自分でスナップショット同じ内容のブロックを複製しません。理想的に自分のCoW構造(すなわち保存します、。
ブロックレベルのコピー(withなどdd
)は、UUIDを複製するため、良いアイデアではないようです。明らかに、それを簡単に変更する方法はありません。
回答:
ソースパーティションがアンマウントされ、自動マウントされないことを確認します。
使用するかdd
(遅い、ダム)またはpartclone.btrfs -b -s /dev/src -o /dev/target
btrfstune -u
コピー後、マウント前にUUIDを変更するために使用します。
データ損失の警告は:DOは、NOTマウント(自動)にしてみてくださいどちらか元またはコピーUUIDが変更されるまで、
btrfs-clone
私は個人的に試したことはありませんbtrfs-clone
が、既存のBTRFSファイルシステムを新しいものに複製し、各サブボリュームを順番に複製することを意図しています。
今日(2016-05-06)には既成のソリューションは見つかりませんでしたが、コピーオンライト処理などの目的のために問題を解決しました。「クローン」/source
する手順/target
は次のとおりです。
次の順序でサブボリュームのリストを取得しますogen
:btrfs subvolume list -qu --sort ogen /source
。ソートは、おそらく以前のものに依存するスナップショットまたはサブボリュームが最初に処理されることを保証するのに十分です。これは、最初にベースボリュームを転送する必要があるため、コピーオンライトの処理にとって重要です。
を使用して、すべてのサブボリュームを読み取り専用にしbtrfs property set -ts /source/some-volume ro true
ます。
ここで、上のリストの各サブボリュームに対して、先頭から始めて、次を実行します。
ボリュームに-
親UUIDがない(として表示される)か、親UUIDがリストにもう存在しない場合は、次を実行します。btrfs send /source/some/volume | btrfs receive /target/some/
ボリュームにまだ存在する親UUIDが存在する場合は、すでに転送されているはずなので、--sort ogen
データの重複を避けるためにそれをベースとして使用できます。したがって、リスト内で親UUIDのパスを見つけて実行しますbtrfs send -p /source/parent/volume/ -c /source/parent/volume/ /source/some/volume/ | btrfs receive /target/some/
(btrfsはおそらく-p
引数を自動的に推測しますが、明示的に指定することを好みます)。
上記のコマンドのいずれかを実行した後、ターゲットとソースを読み書き可能にしますbtrfs property set -ts /source/some/volume ro false; btrfs property set -ts /target/some/volume ro false
。ソースが以前に読み取り専用であった場合、このステップはスキップできます。
これは多くのケースを処理するはずです。警告:
サブボリューム/スナップショットをネストする際の順序付けに関して、いくつかの問題が生じる可能性があります。
スクリプトを作成すると、プロセス全体が明らかに楽しくなります。
btrfs send
複数のクローンソース(-c
)引数を受け入れます。親のボリュームパスを指定するだけでなく、祖先のパスまたは単に以前に送信されたボリュームのパスも指定すると便利な場合があります。ここでは何の違いもありませんでしたが、場合によってはデータの重複を避けるのに役立つかもしれません。
スナップショットまたはサブボリュームのメタ情報が途中で失われるかどうかはわかりませんが、ほとんどのユースケースで興味深い他のすべてのものを保持する必要があります。
プロセス全体により、3.8 GBを使用した800 GBのファイルシステム(によるdf
)を3.8 GBを使用した10 GBのイメージに転送できました。約190 GBを使用せずに転送する-p
と-c
、データの重複は実際に回避されました。
ogen
意味ですか?
ogen
は、サブボリュームの「オリジン生成」です。私は、違いを完全に理解していないこと、または(非元の)生成を使用することが正しいかどうかを認める必要がありますが、いくつかのテストでこれがうまく機能したことを示しています(重複を回避)。サブボリュームに基づいてスナップショットを作成すると、世代は更新されるように見えますが、genは更新されません。いくつかの調査結果について聞いてみたいと思います。IRCまたはBtrfsメーリングリストで確認することをお勧めします。
これを行うことができるpythonツールを作成しました。これは、私自身と@Johannes Ernstの実装の両方で@Thomas Luzatのアプローチを試し、クローン作成手順で使用スペースが20GBから40GBに倍増したためです。もっと効率的なものが必要だと思いました。
この一般的なファイルシステムの履歴を考慮してください。
current ---------------------------------\
| | | |
snap4 snap3 snap2 snap1
Thomasのアルゴリズムでは、「現在」が最初に複製され、すべてのスナップショット(以前の「現在」の状態のスナップショットである)は複製ソース/親として「現在」を使用します。明らかに、snap3をsnap4に、snap2をsnap3に、などとする方が良いでしょう。
そして、これは氷山の一角にすぎません。複雑な履歴を持つbtrfsファイルシステムで(スペース節約の観点から)「最適な」クローンソースを見つけることは、些細な問題ではありません。この問題を解決するために、スペースをより効率的に使用する3つの戦略を考え出しました。実際、クローンのサイズはソースのサイズよりわずかに小さくなりました。
興味があれば、githubページで詳細を読むことができます。
unix.stackexchange.comにはpartclone.btrfsを指す同様の質問がありますが、これに関する詳細は知りません。
カーネルのメーリングリストにも議論がありますが、本当に有望ではありません...
btrfs-send
その最後のIソー、実験的なパッチはメーリングリストのbtrfsに漂っまだありました。