我曾经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 并且不使用rsync
from 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 使用随机临时文件名,传输失败时该文件名将被删除。如前所述,使用--partial
rsync 可以保留不完整的文件就像转移成功一样,以便稍后可以使用--append-verify
/--append
选项附加到它。然而,有几个原因导致这种情况不是最理想的。
您的备份文件可能不完整,并且如果不检查远程文件(该文件必须仍未更改),就无法知道。
如果您尝试使用
--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
几个重要规则:
rsync
使用 delta-xfer 算法来确定是否重新发送不同的块,除非有-W, --whole-file
选项。rsync
将数据写入临时目录并在完成后移动到目标,除非有--inplace
选项。- 当启用delta-xfer时,如果您想跳过部分发送数据块的校验和计算,可以添加
--append
选项,但需要自行保证部分发送数据的相同性。 --append
意味着--inplace
,这本身意味着--partial
就我而言,我想在没有太多 CPU 和磁盘负载的情况下发送增量文件,命令是
rsync -avPL --inplace --append --bwlimit 30m -e 'ssh -o StrictHostKeyChecking=no' <src> <dst>