rsync
を使用して多数のファイルをコピーしましたが、OS(Ubuntu)が予期せず再起動しました。
再起動後、rsync
を再度実行しましたが、ターミナルの出力から、以前にコピーしたものをrsync
がまだコピーしていることがわかりました。しかし、rsync
はコピー元とコピー先の違いを見つけることができるため、その違いをコピーすることができると聞きました。それで、私の場合、rsync
は前回残されたものを再開できるのでしょうか?
まず、質問の「再開」部分については、--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を使用していて、rsync
のhomebrew
を使用していない場合、(少なくとも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
を使用しても、サイズが継続的に大きくなるが、一度書き込まれるとほとんど変更されない大きなファイルを送信する習慣がない限り、おそらくあまり効果がありません。おまけのヒントとして、btrfs
やzfs
などのスナップショットをサポートするストレージにバックアップしている場合、--inplace
スイッチを追加すると、変更されたファイルがないため、スナップショットのサイズを小さくできます再作成されませんが、変更されたブロックは古いブロックの上に直接上書きされます。このスイッチは、小さな変更のみが発生したときにrsyncがターゲット上にファイルのコピーを作成しないようにする場合にも役立ちます。
--append-verify
を使用すると、rsyncは同じサイズのすべてのファイルに対して常に行うように動作します。変更や他のタイムスタンプが異なる場合は、これらのファイルをさらに精査することなく、ターゲットをソースで上書きします。 --checksum
は、同じ名前とサイズのすべてのファイルペアの内容(チェックサム)を比較します。
2015年9月1日更新 @Alexによるポイントを反映するように変更(ありがとう!)
2017年7月14日更新 @Jonathanによるポイントを反映するように変更(ありがとう!)
-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
これに遅れて到着しましたが、同じ質問があり、別の答えを見つけました。
--partial
フラグ(rsync -h
の「部分的に転送されたファイルを保持する」)は、--append
(「短いファイルにデータを追加する」)と同様に大きなファイルに役立ちますが、問題は多数ファイル数。
すでにコピーされているファイルを回避するには、-u
(または--update
: "レシーバーで新しいファイルをスキップする")を使用します。
この簡単なスクリプトを使用しています。特定のフラグを調整したり、パラメータ化したりできます。
#!/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
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
この概念の理解に誤りがある場合はお知らせください...