长话短说:

长话短说:

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

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

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

源和目标都是 NTFS。源是外部 HDD,目标是内部 HDD。

我想知道我的情况是否rsync可以恢复上次剩下的内容?

答案1

首先,关于问题的“恢复”部分,--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.0rsync现在有了一个新选项 ,--append-verify其行为就像--append该开关存在之前一样。您可能总是想要 的行为--append-verify,因此请使用 来检查您的版本rsync --version。如果您使用的是 Mac 并且不使用rsyncfrom homebrew,您将(至少直到并包括 El Capitan)拥有旧版本并且需要使用--append而不是--append-verify。为什么他们没有继续这种行为--append,而是给新人起了名字,--append-no-verify这有点令人费解。无论哪种方式,--append之前的版本 3 与较新的版本rsync相同。--append-verify

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

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

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

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

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

所以,简而言之:

如果您经常使用 rsync 来“将内容从 A 移动到 B”并希望选择取消该操作并稍后恢复它,使用--checksum,但是使用--append-verify

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

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

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

更新于 2017-07-14已更改以反映@Jonathan 提出的观点(谢谢!)

答案2

长话短说:

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

--partial-dir=.rsync-partial

更长的解释:

实际上有一个内置功能可以使用选项来执行此操作,与and /替代方案--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 可以保留不完整的文件就像转移成功一样,以便稍后可以使用--append-verify/--append选项附加到它。然而,有几个原因导致这种情况不是最理想的。

  1. 您的备份文件可能不完整,并且如果不检查远程文件(该文件必须仍未更改),就无法知道。

  2. 如果您尝试使用--backup--backup-dir,则您刚刚添加了该文件的一个新版本,该版本以前从未存在于您的版本历史记录中。

但是,如果我们使用--partial-dir, rsync 将保留临时部分文件,并在下次运行时使用该部分文件继续下载,并且我们不会遇到上述问题。

答案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

答案4

几个重要规则:

  1. rsync使用 delta-xfer 算法来确定是否重新发送不同的块,除非有-W, --whole-file选项。
  2. rsync将数据写入临时目录并在完成后移动到目标,除非有--inplace选项。
  3. 当启用delta-xfer时,如果您想跳过部分发送数据块的校验和计算,可以添加--append选项,但需要自行保证部分发送数据的相同性。
  4. --append意味着--inplace,这本身意味着--partial

就我而言,我想在没有太多 CPU 和磁盘负载的情况下发送增量文件,命令是

rsync -avPL --inplace --append --bwlimit 30m -e 'ssh -o StrictHostKeyChecking=no' <src> <dst>

相关内容