rsync - 在尝试写入(本地)之前是否运行读取/读取/比较?

rsync - 在尝试写入(本地)之前是否运行读取/读取/比较?

我的理解rsync(可能是完全错误的)是它会首先尝试文件(源和目标,如果存在)进行比较,然后再尝试在目标上写入内容(我希望这比读取慢)。我正在运行 rsync 来同步我的主目录的备份,而不是在源磁盘和目标磁盘上看到大量读取(在执行之前的 rsync 运行之后),而是在源磁盘和目标磁盘上看到大量写入目的地磁盘,这是我没想到的。 rsync 总是这样工作吗?

我使用它的方式,以防万一:

rsync --delete -r /home/my-home /mount-point-other-disk/

答案1

您正在从rsync本地磁盘复制到本地磁盘。这会关闭许多优化并将其简化为几乎简单的cp.

此外,通过不包含--times( -t) 标志,您已经关闭了其剩余的优化,这意味着它变得与 完全相同cp

我对 rsync 的理解(可能是完全错误的)是,它会首先尝试读取文件(源文件和目标文件,如果存在)以进行比较,然后再尝试在目标上写入内容(我预计这会比阅读)。

rsync仅当您用于在两个系统之间通过网络进行复制时,才会出现这种情况。

我在目标磁盘上看到大量写入

这是因为rsync无法假设有关目标文件的任何信息,因此在每次备份尝试时都会覆盖它们。

解释:

在理想情况下,rsync可以将自身作为客户端运行,并在远程系统上启动服务器进程。假设目标文件似乎已经存在于目的地上,这两个进程各自读取其本地副本并通过校验和块来识别文件的哪些部分不同。然后,这些差异将通过网络传输并更新目标文件。 (这是一个滑动校验和,因此您甚至可以在文件开头插入一个字节,这是唯一要传输的块。)

rsync但是,在单个系统上管理读取和写入本身的情况下,它假设读取和写入将花费相同的时间。 (对于闪存来说不一定如此,但请忍受它。)因此,在考虑任何更新目标的写入之前,读取源文件和目标文件只是为了比较它们所花费的时间大致相当于它的时间。需要重写目标文件,所以这就是它的作用。

可能的解决方案:

  1. 如果要写入 NAS,请勿写入已本地挂载的 NAS 文件系统。相反,要么使用rsync协议直接通过网络写入 NAS,要么ssh远程登录 NAS 并通过该连接传输数据。在这种情况下,您需要一个类似于这样的命令行:

    rsync -a --delete -M--fake-super /home/my-home remoteNAS:/path/to/mount-point-other-disk/
    
  2. 如果您确实在两个本地连接的磁盘之间读取/写入,请包含--times( -t) 选项并允许rsync忽略看起来已经被复制的文件:

    rsync -a --delete /home/my-home /mount-point-other-disk/
    rsync -rt --delete /home/my-home /mount-point-other-disk/
    

    其中第一个复制所有元数据,因此它不适合写入非 Linux 本机文件系统,例如 NTFS 或 FAT。第二个复制文件,但仅保留上次修改的时间(没有权限或所有权)。如果您正在写入 FAT 文件系统,请注意它只能以两秒的精度捕获时间戳,因此您需要警告rsync不要期望太多:

    rsync -rt --modify-window 1 --delete /home/my-home /mount-point-other-disk/
    

相关内容