rsync如何工作

前言

原来 Rsync的技术报告 和安德鲁Tridgell的的 博士论文(PDF) 是理解的理论数学和一些rsync的算法机制的兼具优良的文档。不幸的是,他们更多的是关于理论比rsync应用程序(以下简称Rsync的)的实施。

在这份文件中,我希望来形容......

这个文件能够作为程序员需要东西的恩特雷里奥斯到的源代码的导向,但主要目的是让读者从他可以理解的基础

总体而言本文档介绍的Rsync的建设和行为。在某些情况下,细节和例外,这将有助于特定精度已经牺牲是为了满足更广泛的目标。

流程和角色

当我们谈论我们的Rsync使用特定的术语来指代各种工艺和自己的角色由公用事业执行的任务。有效的沟通是非常重要的,我们都是讲同一种语言; 同样是我们的意思是同样的事情,当我们使用某些条款在特定情况下是非常重要的。在rsync的邮件列表中经常存在与关于角色和流程有些混乱。由于这些原因,我将定义在将被用于今后的作用和过程的上下文中使用的一些术语。

客户client 角色role

在客户端启动同步。

服务器server 角色role

远程rsync的过程或系统到客户端连接无论是在本地传输,通过一个远程shell,或者通过网络套接字。

这是一个通用术语,并且不应与守护程序混淆。

一旦客户机和服务器之间的连接被建立两者之间的区别是由发送器和接收器的角色所取代。

守护进程daemon 角色和流程Role and process

一个Rsync的过程,等待来自客户端的连接。在特定的平台,这将被称为服务。

远程shell remote shell 作用,并设置过程role and set of processes

一个或多个进程,提供了一个Rsync的客户端和一个远程系统上的rsync服务器之间的连接。

寄件人sender 角色和流程role and process

rsync的过程中能够访问源文件同步。

接收器receiver 角色和流程role and process

作为一个角色的接收机是目标系统。作为一个过程的接收器是接收更新数据,并将其写入到磁盘的过程。

发电机generator 过程process

发电机过程标识更改的文件和管理文件级的逻辑。

进程启动

当Rsync的客户机启动时,将首先建立与服务器进程的连接。此连接可以是通过管道或通过网络套接字。

当Rsync的通过远程shell与远程非守护服务器进行通信的启动方法是用叉子叉远程shell将启动远程系统上的Rsync的服务器。无论是Rsync的客户端和服务器通过管道通过远程shell通信。至于rsync的过程是有关没有网络。在这种模式下的服务器进程rsync的选项传递上,用于启动远程外壳命令行。

时的Rsync与守护进程连通它直接与一个网络套接字通信。这是唯一的排序Rsync的通信可以被称为网络知道的。在这种模式下,rsync的选项必须被发送过来的插座,如下所述。

在客户端和服务器之间的通信的一开始,他们每次发送它们到另一侧支持的最大协议版本。每侧然后使用最小值作为用于传送的协议级别。如果这是一个守护模式连接,rsync的选项从客户机发送到服务器。然后,排除列表传送。从该点向前的客户端 - 服务器关系是相关的唯一的与问候错误和日志消息传送。

本地Rsync的工作(当源和目的地都在本地安装的文件系统)是完全一样一推完成。在客户端,它变成发送者,派生一个服务器进程来实现接收机的作用。在客户端/发送方和服务器/接收机与对方超过管连通。

文件列表

文件列表不仅包括路径名,而且所有权,模式,权限,大小和modtime。如果指定了--checksum选项还包括文件校验和。

出现这种情况一旦启动已完成的第一件事是发送者将创建的文件列表。当它被建造,每个条目被发送到接收侧的网络优化的方法。

当这样做时,各侧由相对于传送的基本目录路径字典顺序排序的文件列表。(确切排序算法取决于是在用于传送的效果是什么协议版本。)一旦发生这种情况,以文件的所有参考文献都通过它们的在文件列表中的索引来实现。

如有必要,发件人如下文件列表ID为→名称表的用户和组与接收机将使用做的id→名称→ID翻译为在文件列表中的每一个文件。

文件列表已经被接收器接收后,它会fork成为发生器和接收器对完成的管道。

该管道

Rsync是严重流水线。这意味着,它是一组通信中(主要)单向方式处理。一旦文件列表已共享管道的行为就像这样:

发电机→发送→接收器

该发电机的输出被输入的发送者和发送者的输出被输入给接收机。每个进程独立运行和延迟只有当管道拖延或等待磁盘I / O或CPU资源的时候。

发电机

该发电机的过程,其本地目录树比较文件列表。之前开始它的主要功能,如果--delete已指定时,它将首先确定本地文件上没有发送者和删除它们的接收器。

发电机将开始走的文件列表。每个文件都将被检查,看它是否可以跳过。在操作文件最常用的模式,如果修改时间或大小不同,不会被跳过。如果--checksum指定一个文件级校验将被创建和比较。目录,设备节点和符号链接不会被跳过。缺失的目录将被创建。

如果一个文件没有被跳过,在接收侧的任何现有版本变成“基础文件”为转移,被用作数据源,这将有助于消除从具有到由发送方发送的数据相匹配。以实现数据的这个远程匹配,块校验和为基础文件创建和发送给发件人立即文件的索引号以下。空块的校验集发送新的文件,如果指定--whole文件。

块的大小,并在以后的版本中,块校验的大小根据该文件的大小计算在每个文件的基础上。

发件人

发件人进程读取文件索引号和相关的块校验将设置一个从发电机时间。

对于每一个文件的id,发电机将其发送将存储块的校验和构建它们的快速查找的哈希索引。

然后本地文件被读出并用于与本地文件的第一个字节开始的块中产生一个校验和。此块校验是指在被送往由发生器的集合寻找,如果没有发现匹配,不匹配的字节将被附加到所述不匹配的数据以及开始下一个字​​节的块进行比较。这就是被称为“滚动校验”

如果一个块校验发现匹配它被认为是匹配块以及任何累积的非匹配数据将被发送到接收器之后的偏移量和长度的匹配块和块校验发生器的接收机的文件将被推进到匹配块后,下一个字节。

匹配块可以以这种方式,即使该块被重新排序或在不同的偏移来标识。这个过程是非常心脏rsync的算法。

以这种方式,发送方将给出如何将源文件重建成一个新目标文件的接收机的说明。这些说明细节都可以从基础文件被复制(如果存在的transfe),并且包括这不是本地可用任何原始数据的匹配数据。在每个文件的处理的结束整个文件的校验和被发送,并且发送者继续进行下一个文件。

产生的滚动校验和搜索由发电机发送校验组匹配需要大量的CPU功率。所有的rsync的过程是发件人是最耗费CPU。

接收器

接收器将来自发送方的数据读取为识别的文件的索引号的每个文件。它会打开本地文件(称为基准),并将创建的临时文件。

接收器将期望读取不匹配的数据和/或相匹配的记录的所有顺序的最后文件的内容。当不匹配的数据被读出,将被写入到临时文件。当接收到块匹配记录的接收机将试图在块中的基础文件偏移和块复制到临时文件。以这种方式,临时文件是从开始到结束建造。

生成文件的校验和临时文件建立。在该文件的末尾,该校验和与从发送方的文件的校验和相比较。如果文件校验和不匹配的临时文件被删除。如果文件失败一次,将在第二阶段进行再加工,并且如果失败报告两次错误。

临时文件已经完成之后,它的所有权和权限和修改时间设置。它然后被重命名为替换的基础文件。

从基础文件到临时文件复制数据使接收器最密集的盘全部rsync的过程。小文件仍可能在磁盘高速缓存减轻此,而是适用于大型文件缓存可以捶打作为发电机已经移动到其他的文件和有引起由发件人进一步延迟。由于数据是从一个文件可能阅读在随机并写入到另一个,如果工作组比磁盘高速缓存越大,则所谓的寻求风暴可发生进一步损害的性能。

守护进程

守护进程,像许多守护进程,叉为每个连接。在启动时,它分析rsyncd.conf文件,以确定哪些模块存在,并且以设置全局选项。

当接收到一个连接的定义模块的守护进程派生一个新的子进程来处理连接。子进程然后读取rsyncd.conf文件设置为请求的模块,它可以通过chroot命令到模块路径和可能下降setuid和setgid的进程的选项。之后,它会表现得就像采纳无论是发送者或接收者角色的任何其他rsync兼容的服务器进程。

rsync的协议

一个设计良好的通信协议具有的一些特征。

除了这些特性,协议具有不同程度的有状态,分组间的独立性,人类可读性,并重新建立一个断开的会话的能力。

rsync的的协议有没有这些良好的特性。在数据传输的字节流不间断。除了无与伦比的文件资料,没有长度说明符也不计数。代替每个字节的含义依赖于它的上下文由协议级定义的。

作为一个例子,当发送者发送的文件列表它简单地发送每个文件列表条目,并终止该列表与一个空字节。在文件列表中的条目,一个比特表示结构的领域期待它和那些可变长度字符串只是空终止。发电机发送的文件数量和块校验台的工作方式相同。

这种通信方式能够很好地对可靠的连接,它肯定比正规的协议数据较少开销。遗憾的是它使协议极难记录,调试或扩展。每个版本的协议将对只能被预计通过知道确切的协议版本的导线的细微差别。

笔记

这个文件是一项正在进行的工作。笔者预计,它有一些明显的疏漏,有些部分可能比启发了一些读者更加混乱。人们希望,这可能演变成一个有用的参考。

改进的具体建议是值得欢迎的,因为将是一个完全重写。