rsync被中断后可以恢复吗?


188

我曾经rsync复制大量文件,但是我的操作系统(Ubuntu)意外重启。

重新启动后,我rsync再次运行,但是从终端上的输出中,我发现rsync仍然复制了以前已经复制过的内容。但是我听说rsync能够找到源和目标之间的差异,因此可以复制差异。所以我想知道我是否rsync可以恢复上一次剩下的内容?


是的,rsync不会再次复制已经复制的文件。在少数情况下,其检测可能会失败。它是否复制了所有已经复制的文件?您使用了哪些选项?源文件系统和目标文件系统是什么?如果在复制所有内容后再次运行rsync,是否会再次复制?
吉尔斯2012年

@吉尔斯:谢谢!(1)我想我看到rsync从终端上的输出再次复制了相同的文件。(2)选项与我的其他帖子相同,即sudo rsync -azvv /home/path/folder1/ /home/path/folder2。(3)源和目标都是NTFS,购买源是外部HDD,目标是内部HDD。(3)现在正在运行,尚未完成。
蒂姆(Tim)

还有--partial标志可恢复部分传输的文件(适用于大文件)
jwbensley12年

3
@Tim在我头顶上,至少存在时钟偏斜和时间分辨率的差异(FAT文件系统的常见问题是以2秒为增量存储时间,该--modify-window选项对此有所帮助)。
吉尔斯2012年

1
如果您没有/或/。在文件源路径参数的末尾,那么它将在与源目录同名的子目录中进行额外复制
Skaperen 2015年

Answers:


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,而不是使用rsyncfrom homebrew,则您(至少包括El Capitan在内)将使用较旧的版本,并且需要使用--append而不是--append-verify。为什么他们不坚持这种行为--append,而是取名为“新来者” --append-no-verify,这有点令人困惑。无论哪种方式,--appendrsync前3版相同--append-verify的新版本。

--append-verify并不危险:它将始终读取并比较两端的数据,而不仅仅是假设它们是相等的。它使用校验和执行此操作,因此在网络上很容易,但是它确实需要读取电线两端的共享数据量,然后才能通过附加到目标来实际恢复传输。

第二,您说过“您听说rsync能够找到源和目标之间的差异,因此只能复制差异”。

没错,这叫做增量传输,但这是另一回事。要启用此功能,请添加-c--checksum开关。使用此开关后,rsync将检查线路两端存在的文件。它以块的形式执行此操作,比较两端的校验和,如果校验和不同,则仅传输文件的不同部分。但是,正如@Jonathan指出的那样,仅当两端的文件大小相同时才进行比较-不同的大小将导致rsync上传整个文件,并用相同的名称覆盖目标。

最初,这需要在两端进行一点计算,但是,例如,如果您经常备份非常大的文件(固定大小的文件,其中经常包含较小的更改),则在减少网络负载方面可能非常有效。我想到的示例是在虚拟机或iSCSI目标中使用的虚拟硬盘映像文件。

值得注意的是,如果您用于--checksum将一批全新的文件传输到目标系统,则rsync仍将在源系统上计算它们的校验和,然后再传输它们。为什么我不知道:)

因此,简而言之:

如果您经常使用rsync只是“将内容从A移动到B”,并希望选择该选项来取消该操作,然后再继续执行该操作,请不要使用--checksum,但使用--append-verify

如果您经常使用rsync备份内容--append-verify,则除非您习惯于发送大型文件,这种文件的大小会不断增长,但是一旦写入就很少修改,那么使用rsync 可能对您没有多大帮助。作为一个额外的提示,如果您要备份到支持快照的存储,例如btrfszfs,则添加该--inplace开关将帮助您减小快照的大小,因为不会重新创建更改的文件,而是将更改的块直接写入旧的块。如果要避免仅在进行较小更改时rsync在目标上创建文件副本,此开关也很有用。

使用时--append-verify,rsync的行为就像在大小相同的所有文件上一样。如果它们在修改或其他时间戳上有所不同,它将用源覆盖目标,而无需进一步检查这些文件。--checksum将比较名称和大小相同的每个文件对的内容(校验和)。

2015-09-01更新,已更改以反映@Alex提出的观点(谢谢!)

2017年7月14日更新,已更改以反映@Jonathan的观点(谢谢!)


4
--partial是足够的。
Cees Timmerman


2
@CMCDragonkai实际上,请查看以下有关亚历山大的答案--partial-dir-看起来这是完美的子弹。我可能完全错过了一些东西;)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus我在一个缓慢的连接上对其进行了测试,这是我 看到的内容--partial:rsync将文件复制到临时名称中,连接中断,远程rsync最终将该文件移至常规名称并退出,然后使用--partial 使用重新运行时--append,将使用部分传输的远程文件的副本初始化新的临时文件,然后该副本从连接终止的位置继续。(Ubuntu 14.04 / rsync 3.1)
Izkata

4
您对所描述的行为--checksum有何信心?根据,man与delta-transfer(大概是rsync默认行为)相比,与决定要传输的文件有更多关系。
Jonathan Y.

56

TL; DR:

只需按照rsync手册页的建议指定部分目录:

--partial-dir=.rsync-partial

更长的解释:

其实有这样做使用内置的功能--partial-dir选项,这在有几个优点--partial--append-verify/ --append替代。

摘自rsync手册页:

--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可以使rsync保留未完成的文件,就好像它已成功传输一样,以便以后可以使用--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中断了单个大文件的传输。我想我缺少了一些东西。
guettli

为什么vv呢 即v用了2次?
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调用的作用以及为什么建议这样做?
Fabien 2013年

2
@Fabien他告诉rsync设置两个ssh选项(rsync使用ssh进行连接)。第二个命令告诉ssh如果所连接的主机是未知的(不存在于“已知主机”文件中),则不提示您进行确认。第一个告诉ssh不要使用默认的已知主机文件(该文件为〜/ .ssh / known_hosts)。他改用/ dev / null,它当然总是空的,并且因为ssh在那里找不到主机,所以它通常会提示您进行确认,因此选择了第二个。连接后,ssh将现在已知的主机写入/ dev / null,立即有效地将其忘记了:)
DanielSmedegaardBuus 2014年

1
...但是您可能想知道它会对rsync操作本身产生什么影响(如果有)。答案是否定的。它仅用于不将您要连接的主机添加到SSH已知主机文件中。也许他是一名系统管理员,经常连接到大量新服务器,临时系统或其他任何东西。我不知道:)
DanielSmedegaardBuus 2014年

4
“使用--progress选项仅复制那些未被复制的文件”是什么?
moi,2016年

1
这里有几个错误;一个很严重:--delete将删除源中不存在的目标文件。较不严重的是,--progress它不会修改事物的复制方式。它只是在复制文件时为您提供进度报告。(我已修复了严重错误;将其替换为--remove-source-files。)
Paul d'Aoust

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:“跳过接收方上较新的文件”)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.