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

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

评论

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

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

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

@Tim在我头顶上,至少存在时钟偏移和时间分辨率差异(FAT文件系统的常见问题是以2秒为增量存储时间,--modify-window选项可以解决此问题)。 />
如果您没有/或/。在文件源路径参数的末尾,它将在与源目录同名的子目录中进行额外的复制

#1 楼

首先,关于问题的“恢复”部分,--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之前的--append上的rsync都与较新版本上的--append-verify相同。

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

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

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

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

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

因此,简而言之:

如果您经常使用rsync只是“将内容从A移动到B”,并希望选择取消该操作,然后再恢复操作,不要使用--checksum,而要使用--append-verify

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

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

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

已更新2017-07-14进行了更改,以反映@Jonathan的观点(谢谢!)

评论


这说--partial就足够了。

– Cees Timmerman
2015年9月15日17:21



打开选项卡526使用--partial选项告诉rsync保留部分文件,这将使文件的其余部分的后续传输更快。更简单的文档

– Cees Timmerman
2015年9月16日15:36

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

–DanielSmedegaardBuus
16年5月10日在19:31

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

–伊兹卡塔
16年8月23日在15:18



您对所描述的--checksum行为的信心水平如何?据该人介绍,与确定增量传输相比,决定与传输有关的文件更多(与rsync的默认行为有关)。

–乔纳森·Y。
17年6月14日在5:48



#2 楼

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使用随机的临时文件名传输失败时被删除。如前所述,使用--partial可以使rsync像成功传输一样保留不完整的文件,以便以后可以使用--append-verify / --append选项将其追加。但是,这是次优的原因有很多。


您的备份文件可能不完整,并且如果不检查仍必须保持不变的远程文件,就无法知道。 br />

如果您尝试使用--backup--backup-dir,则刚刚添加了此文件的新版本,甚至从未退出过其版本历史记录。


但是,如果我们使用--partial-dir,rsync将保留临时的部分文件,并在您下次运行该部分文件时恢复使用该部分文件的下载,因此我们不会遭受上述问题的困扰。

评论


关于--partial-dir和I / O数量和/或磁盘写入操作(CF,SSD等)的很少了解:1.当路径与以下文件不在同一分区(另一个磁盘,RAM驱动器等)中时文件同步后,完成后将在指定目录和目标之间进行文件复制; 2.当涉及大文件时,建议使用相对路径(位于同一分区中-而不是符号链接等); 3.使用临时存储(例如RAM驱动器)时,还应注意,要同步的文件将受到临时存储可用空间的限制。

–赫尔德·玛加良斯
20-4-21在8:44



#3 楼

您可能想在命令中添加-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保留部分文件,该文件应该使得随后的文件其余部分的传输更快。”

–gaoithe
15年8月19日在11:29



@Flimm和@gaoithe,我的回答不太准确,而且绝对不是最新的。我已经更新它以反映版本3 +的rsync。需要强调的是,--partial本身不会恢复失败的传输。查看我的答案以获取详细信息:)

–DanielSmedegaardBuus
2015年9月1日14:11



@DanielSmedegaardBuus我尝试了-P就我而言就足够了。版本:客户端具有3.1.0,服务器具有3.1.1。我使用ctrl-c中断了单个大文件的传输。我想我缺少了一些东西。

– Guettli
2015年11月18日在12:28

为什么是vv?即v使用2次?

–mrgloom
19年8月23日在11:51

哪里rsync使用-azvvP保存文件的一部分?

–mrgloom
19年8月23日在11:56

#4 楼

迟到了,但是我遇到了相同的问题,却找到了不同的答案。

--partial标志(rsync -h中的“保留部分传输的文件”)对于大型文件很有用,而--append(“将数据附加到较短的文件中”),但是问题是有关大量文件。

为避免已经复制的文件,请使用-u(或--update:“跳过接收器上较新的文件“)。

评论


自我注意:请勿将--ignore-existing与--append结合使用。即使文件不完整,Rsync也会以您满意的方式保留您被中断的文件。这让我有些头疼地意识到。这是您经常使用一堆预配置选项的缺点。

– Sridhar Sarnobat
19/12/24在6:13



#5 楼

我认为您正在强行呼叫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


让我知道我对这个概念的理解是否有任何错误...

评论


您能否编辑答案并解释您的特殊ssh调用的作用,以及为什么建议这样做?

–法比恩
2013年6月14日12:12

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

–DanielSmedegaardBuus
2014年12月7日,0:12



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

–DanielSmedegaardBuus
2014年12月7日,0:23

“使用--progress选项仅复制那些未复制的文件”是什么?

– moi
16年5月10日在13:49



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

–Paul d'Aoust
16 Nov 17在22:39



#6 楼

我正在使用这个简单的脚本。随意调整某些标志和/或对其进行参数化。

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