rsync --inplaceはファイル全体に書き込むのですか、それとも更新が必要な部分のみに書き込むのですか?(btrfs + rsyncバックアップの場合)


21

私は、btrfsスナップショットとrsyncをどのように組み合わせて効率的な履歴付きバックアップソリューションを作成するかについて、いくつかのガイドを読んでいました。ただしrsync --inplace、実際に変更されたファイルの部分のみを変更するか、ファイル全体を順番に上書きするかによって異なります。ファイル全体を書き込む場合、btrfsは常にファイルの新しいコピーを作成するようです。これにより、アイデアの効率が大幅に低下します。


ファイル全体への書き込みを回避できるどうかはどうすればわかりますか?何が変わったのかを理解するために、最初にファイル全体を読み取る必要はありませんか?
Mehrdad

2
@Mehrdadはい、できますが、全体を読むことは問題ではありません。場合はrsync、ファイル全体を読み込み、その後に追求し、必要な部分のみを更新し、のbtrfsは、これらの更新されたブロックをコピーします。しかし、もしrsync読み込みファイル全体を書き込み、それは問題になるでしょう。
ペトルスキー-パドラック

1
@Mehrdad rsyncは、ファイル全体の書き込みを回避できることを認識しているだけでなく、ネット上で完全にコピーすることなく、ファイルの書き込みを管理しています。巧妙な小さなプログラム。
ギュンターピエズ

回答:


31

rsyncに2つのローカルパスを渡すと、デフォルトでデルタ転送ではなく「--whole-file」が使用されます。したがって、探しているのは「--no-whole-file」です。「-c」を要求した場合も、デルタ転送を取得します。

確認方法は次のとおりです。

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

次に、ファイルをタッチして再同期します

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

「ls -li」を使用してiノードを再使用したことを確認できますが、64Kバイト全体が送信されていることに注意してください。--no-whole-fileで再試行してください

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

これで、494バイトのみを送信しました。straceを使用して、ファイルのいずれかが書き込まれたかどうかをさらに確認することもできますが、少なくともデルタ転送が使用されていることがわかります。

ローカルファイルシステムについて--whole-fileは想定されていることに注意(コメントを参照)(rsyncのマニュアルページを参照)。一方、ネットワーク全体--no-whole-fileが想定されるため--inplace、それ自体はとして動作し--inplace --no-whole-fileます。


なぜ--inplace意味しないの--no-whole-fileですか?
ジェレミア

--no-whole-fileとにかくデフォルトではありませんか?
ジェレミア

2
@Geremiaは、両方のパスがローカルの場合はそうではありません。そして、私の例は、2013年に使用していたrsyncのバージョンを--inplace意味するものではありません--no-whole-fileが、独自のバージョンのrsyncでこの実験を繰り返してください。
データレス16

まあ、inplace「同じ/異なるブロックをスキャンする」ことではなく、オフセット0から既存のファイルをすぐに上書きするだけです(それ以外の場合は、一時コピーが作成され、その後、古いターゲットファイルが削除され、一時コピーが名前変更されます) 。おそらく、プロセスが中断された場合、可能な限りとして古いファイルを保つために「より安全」とみなされます。もちろん、これはパフォーマンスのために悪いです、ピークストレージ消費量(大きなファイルを考える)、おそらく断片化...)...。
フランクノック

1
私はそれが他の方法のラウンドであると仮定し、--no-whole-file常にを意味します--inplace。そうしないと、パフォーマンスの向上のほとんどが失われます。...けれども、これは、文書が見つかりませんでした
フランクNocke

15

ここで、マニュアルの正しい部分を引用して、私が推測する明確な答え:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.

4

--inplace変更された地域のみを上書きします。Btrfsに書き込むときは常に使用してください。


また、ファイルの他の部分を上書きしないことを示す証拠はありますか?
ペトルプドラク

ZFSにも同じことが当てはまりますか?
ewwhite 14

@ewwhite:ZFSはBTRFSと同様にCOW(コピーオンライト)なので、はい。
ジェレミア

@PetrPudlák -vvvは、一致するブロックをスキップしていることを示しています
Tom Hale

3

rsyncのデルタ転送アルゴリズムは、ファイル全体が送信されるか、異なる部分のみが送信されるかを処理します。これは、帯域幅を節約するために2つのマシン間でファイルをrsyncするときのデフォルトの動作です。これを--whole-file(または-W)でオーバーライドして、rsyncファイル全体を強制的に送信できます。

--inplacersync、転送中に一時ファイルを作成するかどうかを扱います。デフォルトの動作では、一時ファイルが作成されます。これにより、転送が中断された場合に、宛先マシンの既存のファイルがそのまま/変更されないままであるという点で、安全性の尺度が得られます。--inplaceこの動作をオーバーライドしrsync、既存のファイルを直接更新するように指示します。これにより、転送が中断された場合、宛先マシンに一貫性のないファイルが存在するリスクが生じます。


2

manページから:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

これにより、ファイル全体に上書きされると信じるようになります。rsyncが他の方法で機能することはほぼ不可能だと思います。


2
どの部分を更新する必要があるかを判断した後、ファイル全体を書き込むのではなく、それらの部分を探して更新するだけで済みます。
PetrPudlák13年

0

インプレースrsyncの理論的な作業については、このペーパーで説明します。

ペーパーリファレンス:D.ラッシュおよびR.バーンズ。インプレースRsync:モバイルおよびワイヤレスデバイスのファイル同期。USENIX Annual Technical Conference、FREENIXトラック、91-100、USENIX、2003年。

リンクから:

...インプレース再構築をサポートするために、既存のrsync実装を変更しました。

要約:[...] rsyncを変更して、スペースに制約のあるデバイスで動作するようにしました。ターゲットホスト上のファイルは、現在のバージョンのファイルが占有しているのと同じストレージで更新されます。スペースに制約のあるデバイスは、ファイルの古いバージョンと新しいバージョンの両方にメモリまたはストレージを必要とするため、従来のrsyncを使用できません。例としては、携帯電話やハンドヘルドPC上のファイルの同期があります。これらのPCには小さなメモリがあります。インプレースrsyncアルゴリズムは、グラフ内のファイルの圧縮表現をエンコードし、インプレースプロパティを実現するためにトポロジ的にソートされます。[...]

したがって、これはrsync --inplaceが行っていることの技術的な詳細のようです。論文の冒頭によると:

インプレース再構成を使用してファイル同期タスクを実行するようにrsyncを変更しました。[...] 一時スペースを使用する代わりに、現在のバージョンがすでに占有しているスペースでターゲットファイルへの変更が行われます。このツールを使用して、スペースが限られているデバイスを同期できます。

@datalessの答えから明らかになるように、これ--inplaceは同じストレージスペースを使用していることを意味しますが、それでもファイル全体をそのスペースにコピーする可能性があります。具体的には、ローカルファイルシステムとの間でコピーが作成される場合、rsyncは--whole-fileオプションを想定します。しかし、一方でネットワーク化されたシステムにまたがる場合は、--no-whole-fileオプションを想定しています。


1
ええと、答えは何ですか?
Xen2050

謝罪いたします。私は十分な注意を払っていませんでした。@datalessの答えを使えば、これで事態は解消されるはずです。
ダイアゴン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.