web-dev-qa-db-ja.com

中断された後にrsyncを再開できますか?

rsyncを使用して多数のファイルをコピーしましたが、OS(Ubuntu)が予期せず再起動しました。

再起動後、rsyncを再度実行しましたが、ターミナルの出力から、以前にコピーしたものをrsyncがまだコピーしていることがわかりました。しかし、rsyncはコピー元とコピー先の違いを見つけることができるため、その違いをコピーすることができると聞きました。それで、私の場合、rsyncは前回残されたものを再開できるのでしょうか?

203
Tim

まず、質問の「再開」部分については、--partialは、送信側が完全に転送されたかのように見えなくなった場合に、部分的に転送されたファイルを保持するように受信側に指示するだけです。

ファイルの転送中、それらは一時的に隠しファイルとしてターゲットフォルダー(例:.TheFileYouAreSending.lRWzDC)、または--partial-dirスイッチを設定した場合は特定のフォルダーに保存されます。転送が失敗し、--partialが設定されていない場合、この隠しファイルはこの不可解な名前でターゲットフォルダーに残りますが、--partialが設定されている場合、ファイルは実際のターゲットファイル名(この場合、TheFileYouAreSending)、ただしファイルは完全ではありません。ポイントは、--appendまたは--append-verifyのいずれかを使用してrsyncを再度実行することにより、後で転送を完了することができるということです。

したがって、--partialは、失敗した転送またはキャンセルされた転送を再開しません自体。再開するには、次の実行で前述のフラグのいずれかを使用する必要があります。そのため、問題がないように見えても実際には不完全なファイルがターゲットに含まれないようにする必要がある場合は、--partialを使用しないでください。逆に、ターゲットディレクトリで非表示になっている失敗したファイルを取り残さないようにしたい場合は、後で転送を完了できることがわかっていれば、--partialが役立ちます。

上記の--appendスイッチに関しては、これは実際の「再開」スイッチであり、--partialも使用しているかどうかに関係なく使用できます。実際、--appendを使用している場合、一時ファイルは作成されません。ファイルはターゲットに直接書き込まれます。この点で、転送が失敗した場合、--append--partialと同じ結果になりますが、非表示の一時ファイルは作成されません。

つまり、大きなファイルを移動していて、キャンセルまたは失敗したrsync操作をrsyncが停止した正確な時点から再開するオプションが必要な場合は、--appendまたは--append-verify次の試行をオンにします。

@Alexが以下で指摘するように、バージョン3.0.0以降、rsyncに新しいオプション--append-verifyが追加されました。これは、そのスイッチが存在する前は--appendのように動作します。おそらく--append-verifyの動作が常に必要なので、rsync --versionでバージョンを確認してください。 Macを使用していて、rsynchomebrewを使用していない場合、(少なくともEl Capitanを含めて)古いバージョンがあり、--appendを使用する必要があります--append-verifyではなく。彼らが--appendでの動作を維持せず、代わりに新人--append-no-verifyと名付けた理由は少し不可解です。どちらの方法でも、バージョン3より前のrsync--appendは、新しいバージョンの--append-verifyと同じです。

--append-verifyは危険ではありません。データが等しいと仮定するだけでなく、両端のデータを常に読み取って比較します。チェックサムを使用してこれを行うため、ネットワーク上で簡単ですが、ターゲットに追加して転送を実際に再開する前に、ワイヤーの両端で共有データ量を読み取る必要があります。

第二に、あなたは「rsyncがソースとデスティネーションの違いを見つけることができるので、その違いをコピーするだけだと聞いた」と述べました。

それは正しいです、そしてそれはデルタ転送と呼ばれます、しかしそれは別のものです。これを有効にするには、-cまたは--checksumスイッチを追加します。このスイッチが使用されると、rsyncは回線の両端に存在するファイルを調べます。チャンクでこれを行い、両端のチェックサムを比較し、それらが異なる場合は、ファイルの異なる部分のみを転送します。ただし、@ Jonathanが以下で指摘するように、ファイルの両端が同じサイズの場合にのみ比較が行われます。サイズが異なると、rsyncによってファイル全体がアップロードされ、同じ名前のターゲットが上書きされます。

最初は両端で少し計算が必要ですが、たとえば非常に大きなファイルを頻繁にバックアップする場合、マイナーな変更が頻繁に含まれる固定サイズのファイルを頻繁にバックアップする場合は、非常に効率的です。頭に浮かぶ例は、仮想マシンまたはiSCSIターゲットで使用される仮想ハードドライブイメージファイルです。

--checksumを使用して完全に新しいファイルのバッチをターゲットシステムに転送する場合、rsyncは転送前にソースシステムでチェックサムを計算します。なぜ私は知りません:)

つまり、要するに:

Rsyncを使用して「ものをAからBに移動する」だけで、その操作をキャンセルして後で再開するオプションが必要な場合は、しないでください--checksumを使用しますが、- do--append-verifyを使用します。

Rsyncを使用して頻繁にデータをバックアップしている場合、--append-verifyを使用しても、サイズが継続的に大きくなるが、一度書き込まれるとほとんど変更されない大きなファイルを送信する習慣がない限り、おそらくあまり効果がありません。おまけのヒントとして、btrfszfsなどのスナップショットをサポートするストレージにバックアップしている場合、--inplaceスイッチを追加すると、変更されたファイルがないため、スナップショットのサイズを小さくできます再作成されませんが、変更されたブロックは古いブロックの上に直接上書きされます。このスイッチは、小さな変更のみが発生したときにrsyncがターゲット上にファイルのコピーを作成しないようにする場合にも役立ちます。

--append-verifyを使用すると、rsyncは同じサイズのすべてのファイルに対して常に行うように動作します。変更や他のタイムスタンプが異なる場合は、これらのファイルをさらに精査することなく、ターゲットをソースで上書きします。 --checksumは、同じ名前とサイズのすべてのファイルペアの内容(チェックサム)を比較します。

2015年9月1日更新 @Alexによるポイントを反映するように変更(ありがとう!)

2017年7月14日更新 @Jonathanによるポイントを反映するように変更(ありがとう!)

307

-Pオプションをコマンドに追加します。

manページから:

--partial By default, rsync will delete any partially transferred file if the transfer
         is interrupted. In some circumstances it is more desirable to keep partially
         transferred files. Using the --partial option tells rsync to keep the partial
         file which should make a subsequent transfer of the rest of the file much faster.

  -P     The -P option is equivalent to --partial --progress.   Its  pur-
         pose  is to make it much easier to specify these two options for
         a long transfer that may be interrupted.

だから代わりに:

Sudo rsync -azvv /home/path/folder1/ /home/path/folder2

行う:

Sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

もちろん、進捗状況を更新したくない場合は、--partial、つまり:

Sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
39
N2O

これに遅れて到着しましたが、同じ質問があり、別の答えを見つけました。

--partialフラグ(rsync -hの「部分的に転送されたファイルを保持する」)は、--append(「短いファイルにデータを追加する」)と同様に大きなファイルに役立ちますが、問題は多数ファイル数。

すでにコピーされているファイルを回避するには、-u(または--update: "レシーバーで新しいファイルをスキップする")を使用します。

2
lazysoundsystem

この簡単なスクリプトを使用しています。特定のフラグを調整したり、パラメータ化したりできます。

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial [source] [dest]:
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done
1

rsyncを強制的に呼び出しているため、再度呼び出すとすべてのデータがダウンロードされていると思います。使用する --progressオプションは、コピーされていないファイルのみをコピーし、--deleteオプションが既にコピーされていて、ソースフォルダーに存在しない場合にファイルを削除する...

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

Sshを使用して他のシステムにログインし、ファイルをコピーしている場合は、

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

この概念の理解に誤りがある場合はお知らせください...

1
Yadunandana