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


188

以前rsyncは大量のファイルをコピーしていましたが、OS(Ubuntu)が予期せず再起動しました。

再起動後、rsync再度実行しましたが、端末の出力から、rsync以前にコピーしたものがまだコピーされていることがわかりました。しかしrsync、ソースとデスティネーションの違いを見つけることができると聞きました。私の場合、rsync前回残されたものを再開できるのでしょうか?


はい、rsyncは既にコピーされたファイルを再びコピーしません。検出が失敗する可能性のあるいくつかのエッジケースがあります。すでにコピーされたすべてのファイルをコピーしましたか?どのオプションを使用しましたか?ソースとターゲットのファイルシステムは何ですか?すべてをコピーした後にrsyncを再度実行すると、再度コピーされますか?
ジル

@Gilles:ありがとう!(1)rsyncが端末の出力から同じファイルを再びコピーしたのを見たと思います。(2)オプションは他の投稿と同じsudo rsync -azvv /home/path/folder1/ /home/path/folder2です。(3)ソースとターゲットは両方ともNTFSであり、ソースを購入するのは外部HDDであり、ターゲットは内部HDDです。(3)現在実行中で、まだ終了していません。
ティム

部分的に転送されたファイルを再開するための--partialフラグもあります(大きなファイルに便利です)
-jwbensley

3
@Tim私の頭の上では、少なくともクロックスキューと時間分解能の違いがあります(2秒単位で時間を保存するFATファイルシステムの一般的な問題、この--modify-windowオプションはそれを助けます)。
ジル

1
/または/がなかった場合。ファイルソースパス引数の末尾で、ソースディレクトリと同じ名前のサブディレクトリに追加のコピーを作成します
-Skaperen

回答:


285

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

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

したがって、失敗した転送またはキャンセルされた転送自体は再開され--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、あなたは(少なくともエルキャピタンまでを含む)の古いバージョンを持って使用する必要があります--appendのではなく--append-verify。なぜ彼らが振る舞いを続けず--append、代わりに新人--append-no-verifyと名付けられたのかは少し不可解です。いずれにしても、バージョン3 --appendよりrsync--append-verifyは新しいバージョンと同じです。

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

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

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

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

--checksumターゲットシステムにまったく新しいファイルのバッチを転送するために使用する場合、rsyncは転送前にソースシステムでチェックサムを計算することに注意してください。なぜわからないのか:)

つまり、要するに:

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

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

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

更新済み2015-09-01 @Alexによるポイントを反映するように変更(ありがとう!)

更新済み2017-07-14 @Jonathanによるポイントを反映するように変更(ありがとう!)


4
これは言う--partial十分です。
シーズティマーマン


2
@CMCDragonkai実際には、以下についてアレクサンダーの答えをチェックしてください--partial-dir-これは完璧な弾丸のようです。私は完全に何かを見逃したかもしれません;)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus私は遅い接続で自分でテストしましたが、これは私が見るだけ --partialです:rsyncはファイルを一時的な名前にコピーし、接続が中断され、リモートrsyncは最終的にそのファイルを通常の名前に移動して終了しますを使用して、--partialまたは使用せずに 再実行すると--append、新しい一時ファイルは部分的に転送されたリモートファイルのコピーで初期化され、その後、接続が切断された場所からコピーが続行されます。(Ubuntu 14.04 / rsync 3.1)
イズカタ

4
の記述された動作に対する自信のレベルは何--checksumですか?によると、manデルタ転送(おそらく、rsyncデフォルトの動作)よりも、転送のためにフラグを立てるファイルを決定することに関係しています。
ジョナサンY.

56

TL; DR:

rsync manページが推奨するように、部分的なディレクトリを指定するだけです:

--partial-dir=.rsync-partial

長い説明:

使用してこれを行うために、実際に内蔵された機能があります--partial-dirいくつかの利点を持ってオプション、--partialおよび--append-verify/ --append代替を。

rsync manページからの抜粋:

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

デフォルトでは、rsyncはランダムな一時ファイル名を使用しますが、これは転送が失敗すると削除されます。前述のように、--partialrsync を使用すると、不完全なファイルが正常に転送されたかのように保持できるため、後で--append-verify/ --appendオプションを使用してファイルに追加できます。しかし、これが次善の理由であるいくつかの理由があります。

  1. バックアップファイルは完全ではない可能性があり、変更されていないリモートファイルをチェックしないと、知る方法がありません。

  2. --backupおよびを使用しようとしている場合は--backup-dir、バージョン履歴に以前に終了することさえなかったこのファイルの新しいバージョンを追加したばかりです。

ただし、を使用する場合--partial-dir、rsyncは一時的な部分ファイルを保持し、次に実行するときにその部分ファイルを使用してダウンロードを再開します。上記の問題は発生しません。


38

-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

@Flimmはまったく正しくありません。中断(ネットワークまたは受信側)がある場合、-partialを使用すると、部分ファイルが保持され、rsyncの再開時に使用されます。マンページから:「--partialオプションを使用すると、rsyncが部分ファイルを保持するように指示します。これにより、<b>残りのファイルの転送がはるかに高速になります</ b>。」
gaoithe

2
@Flimmと@gaoithe、私の答えは正確ではなく、間違いなく最新ではありませんでした。バージョン3以降を反映するように更新しましたrsync。ただし、失敗した転送が再開される--partialわけではないことを強調することが重要です。詳細については私の答えを参照してください:)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus私はそれを試しました-Pが、私の場合はこれで十分です。バージョン:クライアントには3.1.0があり、サーバーには3.1.1があります。ctrl-cを使用して、1つの大きなファイルの転送を中断しました。私は何かが欠けていると思います。
ゲットリ

なんでvv?すなわち、v2回使用しましたか?
mrgloom

rsyncはどこでファイルの一部を保存し-azvvPますか?
mrgloom

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
回答を編集して、特別なsshコールが何をするのか、なぜそれを行うようアドバイスするのかを説明してください。
ファビアン

2
@Fabien彼は2つのsshオプションを設定するようrsyncに指示します(rsyncはsshを使用して接続します)。2番目のものは、sshに、接続しているホストが(「既知のホスト」ファイルに存在することで)既知でない場合、確認を求めないように指示します。最初のものは、デフォルトの既知のホストファイル(〜/ .ssh / known_hosts)を使用しないようにsshに指示します。彼は代わりに/ dev / nullを使用しますが、これはもちろん常に空であり、sshはそこでホストを見つけられないため、通常は確認を求めるプロンプトが表示されるため、オプション2です。接続すると、sshは現在知られているホストを/ dev / nullに書き込み、すぐにそれを事実上忘れます:)
DanielSmedegaardBuus 14

1
...しかし、おそらくrsync操作自体にどのような影響があるのか​​疑問に思っていたでしょう。答えはありません。接続しているホストをSSHの既知のホストファイルに追加しないようにするだけです。おそらく彼は多くの場合、多数の新しいサーバー、一時システム、その他に接続するシステム管理者です。わからない:)
DanielSmedegaardBuus 14

4
「--progressオプションを使用して、コピーされていないファイルのみをコピーします」
moi

1
ここにはいくつかのエラーがあります。1つは非常に深刻です。ソースに存在しない宛先の--deleteファイルを削除します。それほど深刻ではないのは、物事のコピー方法を変更しないということです。コピーする各ファイルの進捗レポートを提供するだけです。(重大なエラーを修正しました。これを。に置き換えました。)--progress--remove-source-files
ポールダウスト

1

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

#!/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

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

--partialフラグが(「部分的に転送されたファイルを保持する」でrsync -h)であるとして、大きなファイルのために有用である--append(「短いファイルにデータを追加」)が、問題は程度である多数のファイル。

既にコピーされたファイルを使用しないようにするには-u(または--update:「受信側で新しいファイルをスキップする」)を使用します。

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