前几年的大礼包都是基于嵌入式linux逆向工程讲解关于破解不同品牌的NAS固件。今年的礼包我们暂时不谈破解,而是讨论linux系统内的一个相当重要的应用软件。在广大坛友都上手使用了各种品牌的NAS系统之后,就提出了“不同品牌NAS之间实现数据同步备份”这样一个应用方面的问题。这个问题的提出是必然现象,因为NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,当然数据同步备份是一个必不可少的必备功能。
其实各种品牌的NAS都会提供自己的专有的同步备份功能,在用户GUI界面设计上,有些品牌做的比较好,有些比较差。但它们都不能保障对于不同品牌NAS之间实现数据同步备份。针对这个问题,笔者进行了一些研究和测试,现在就把自己的一些体会与广大坛友们分享一下。目的是为了进行教学, 研究和技术交流。
第一讲 介绍rsync跨平台差分备份工具软件
rsync是以GNU通用公共许可证发行的自由软件[1]。现有的各种品牌的NAS基本上都是基于Unix/Linux系统开发的。就算是各种品牌的NAS自己专有的同步备份功能,大多数也都是基于rsync这款强有力的工具软件开发的。但NAS厂商在开发用户GUI界面时,都没有把兼容其他品牌的NAS系统的功能解决好;或者说就根本没有考虑要做兼容其他品牌的NAS系统的问题。
rsync的初始版本发表于1996年6月19日,到目前已有超过25年的历史了。它的原作者是:安德鲁·垂鸠(Andrew Tridgell)与保罗·麦可拉斯(PaulMackerras)。开发者是:韦恩·大卫森(Wayne Davison)。目前的稳定版本是:3.2.3(2020年8月6日,18个月前)。该款工具软件能同步更新两处计算机的文档与目录,并适当利用差分编码以减少数据传输量。rsync中的一项同类工具软件不常见的重要特性是每个目标的镜像只需传送一次。 rsync可以拷贝/显示目录内容,以及拷贝文档,并可选压缩以及递归拷贝。在常驻模式(daemon mode)下,rsync预设监听TCP的873端口,以原生rsync传输协定,或者透过远端shell如RSH或者SSH提供文档。 SSH模式下,rsync用户端执行程序必须同时在本地和远端机器上存在。
rsync实用程序使用由澳洲电脑程序师安德鲁·垂鸠(Andrew Tridgell)发明的算法,在当接受端的设备已经有相同结构(例如文档)但不同版本时,有效地通过通讯连线将结构传输。在他1999年的博士论文《Efficient Algorithms for Sorting and Synchronization》[2]中,详细介绍了rsync的设计、实现与性能。
接受端将文档拷贝打散成固定大小为 的不重叠片段,并对每个片段计算两个校验和:MD4散列函数与一个较弱的旋转哈希。它将这些校验和送给发送者。通讯协议版本30(与rsync版本3.0.0一并发行)现在使用MD5散列函数以替代MD4。 [3]
发送者对位于其版本的文档中每个大小为S 的片段计算轮替校验和,即使是重叠的片段。这可被有效的计算透过特别的轮替校验和算法:如果bit 位n 到n+S-1的轮替校验和是 R,从bit位n+1 到 n+S的轮替校验和可从 R,bit 位n,以及bit 位n+S 计算出而不需要真正去检验中间的bit 位。因此,如果bit 位1到25的轮替校验和已被算出,那计算bit 位2到26的轮替校验和可完全依靠之前的校验和与bit 位1与bit 位26算出。
rsync使用的旋转哈希来自于马克艾德勒(Mark Adler)的adler-32校验和算法。该算法也被用于zlib,而它本身也基于Fletcher校验算法。
发送者其后以接收者送来的一组轮替校验和比较它自己的轮替校验和以决定是否任何匹配存在。如果是的话,它便透过计算匹配区块的MD4校验和与接受端送来的MD4校验和比较来验证匹配。
发送者稍后传送给接收者不与接收者方任何区块匹配的文档的那些部分,以及如何合并这些区块到接收者版本的组装指令。在实际上,这产生了与发送者端文档一模一样的拷贝。
如果发送者与接收者文档版本有许多区段相同,该公用程序只需传送相对小部分的资料以将文档同步。
在rsync演算法构成rsync应用程序核心并最佳化两台设备间TCP/IP的传输同时,rsync应用程序也支援其他种显著增进文档传输或备份的重要功能。他们包括在发送端与接收端个别利用zlib进行区块区块间压缩解压缩,以及支援通讯协定如ssh。该协定让加密传输兼具压缩与效率,透过rsync演算法产生的差分资料变得可能。除ssh以外,stunnel亦可被利用于创造加密通道以保全被传输的资料。
第二讲 简介rsync的使用
在现有的各种品牌的NAS产品中都已经安装了rsync这个强大的工具。只是因为rsync软件并不提供GUI界面的应用,所以小白和菜鸟们可能并不知道它的存在。如果你没有遇到不同品牌的NAS产品之间的数据同步备份的问题,当然也就不需要了解和学习如何使用命令行rsync的使用了。
要通过命令行使用rsync,你必须与NAS建立一个shell的连接。通常是使用ssh与NAS建立起一个shell 的连接。具体如何做,要根据你的NAS系统说明来操作。因为这里我们要讲的是rsync的使用,我们假设你已经与NAS建立一个shell 的连接。
rsync,代表remote sync,是一个即可以远程也可以本地文件同步工具。它使用一种算法,通过仅移动已更改的文件部分来最小化复制的数据量。
在本讲中,我们将回顾使用 rsync 时的最简单和基本的一些语法,解释如何使用 rsync 与远程系统同步,以及其他可用的选项。为了练习使用 rsync 在本地和远程系统之间同步文件,您需要两台NAS机器分别充当本地设备和远程设备。这两台NAS可以是虚拟专用服务器、虚拟机、容器或实体NAS,只要它们已正确配置即可。
了解 rsync 语法,rsync 的语法与其他软件类似,例如 ssh、scp 和 cp。
我在这里暂时以威联通系统为例来做介绍如何使用rsync。假设威联通NAS系统的ssh账号也是admin,IP地址是192.168.x.x,目录卷在/share/Public,则通过运行以下命令连接到威联通的NAS系统:
通过运行以下命令切换到您的主目录,我在这里先讲本地的数据同步备份,然后再过度到讲远程数据同步备份命令。
[~]# cd/share/Public 假设这跟目录是你的威联通系统的供你学习rsync命令用的实验用的主目录,你的屏幕就是如下样子。
[/share/Public ]#
然后创建一个测试目录: [/share/Public]# mkdir dir1
创建另一个测试目录: [/share/Public]# mkdir dir2
再来添加一些测试文件: [/share/Public]# touch dir1/file{0..9}
现在有一个名为 dir1 的目录,其中包含 10 个空文件。你可以使用ls命令自行查看。
您还有一个名为 dir2 的空目录。要将 dir1 的内容同步到同一系统上的 dir2,您将运行 rsync 并使用-a 标志,它是一个组合标志,代表“归档”。此标志以递归方式同步并保留符号链接、特殊和设备文件、修改时间、组、所有者和权限。是推荐使用的标志。
[/share/Public]# rsync -a dir1/ dir2
请注意,在这个命令的语法中,第一个参数的末尾有一个斜杠 (/),这个尾部斜杠表示 dir1 的内容。如果没有尾部斜杠,将会包括dir1目录,将被放置在 dir2 中。结果将创建一个如下所示的层次结构:
~/dir2/dir1/[ file]
另一个提示是在执行 rsync 命令之前仔细检查你的参数。 rsync 提供了一种通过传递 -n 或 --dry-run 选项来执行此操作的方法。 -v 标志,意思是“详细”,也是获得适当输出所必需的。您将在以下命令中组合 a、n 和v 标志。例如:
[/share/Public]# rsync -anv dir1/ dir2
输出: sendingincremental file list ./ File0 file1 file2 file3 file4 file5 file6 file7 file8 file9
现在将该输出与删除尾部斜杠时收到的输出进行比较,如下所示:
[/share/Public]# rsync -avn dir1 dir2
输出: sendingincremental file list dir1/ dir1/file0 dir1/file1 dir1/file2 dir1/file3 dir1/file4 dir1/file5 dir1/file6 dir1/file7 dir1/file8 dir1/file9
看出不同的地方了吗?此输出现在表明目录本身已被传输,而不仅仅是目录中的文件。
接下来就要讲讲使用 rsync 与远程NAS设备做数据备份同步的命令了。
要使用 rsync 与远程NAS备份同步,您需要在本地NAS和远程NAS之间配置 SSH 访问权限,以及在两个系统上都有 rsync工具软件。在两台NAS之间验证 SSH 访问后,您可以使用以下语法将上一节中的 dir1 文件夹同步到远程NAS。请注意,在这种情况下,如果您要传输实际目录,因此您将要去掉尾部斜杠,如果只需要传输目录中的内容,您就要加上尾部斜杠。为了叙述的方便,我们继续以现在的威联通NAS系统发送方,并假设有一台群晖NAS系统为接收方。它的ssh账号是admin,IP地址是192.168.x.y,目录卷在/volume1/Public为例:(谁是发起方,接收方都是可以的,本例仅仅是为了讲解要 rsync的命令)
此时会要求你输入群晖NAS的ssh账号admin的密码,只要正确输入密码就可以了。(具体实践的细节请参考第三讲“威联通与群晖之间数据备份同步实践范例”,以免实践不成功。这里仅仅讲解rsync命令的语法规则。)
此命令执行后就会在群晖NAS系统的目录卷/volume1/Public中创建一个dir1目录,并备份dir1目录中的所有文件到群晖NAS系统。
此命令可以不断地重复执行,只是如果两个NAS系统的数据备份已经同步了的话,根据在第一讲中介绍过的算法,并不会给网络通讯连接带来巨大的压力。特别是对于大尺寸的数据文件。例如视频文件,等等。
此过程称为“推送”操作,因为它将目录从本地的威联通NAS系统“推送”到远程的群晖NAS系统。相反的操作是“拉取”,用于将远程目录同步到本地系统。例如,如果 dir1 目录位于远程的群晖NAS系统而不是本地的威联通NAS系统上,假设威联通NAS系统的ssh账号也是admin,IP地址是192.168.x.x,目录卷在/share/Public, 则语法如下:
此时会要求你输入威联通NAS的ssh账号admin的密码,只要正确输入密码就可以了。
其实rsync命令与 cp,scp和类似工具一样,源始终是第一个参数,而目标始终是第二个。语法规则非常好记。当然rsync 还提供了许多用于更改实用程序默认行为的选项,请自行根据需要到网上查找即可。rsync 可以简化通过网络连接的文件传输,并为本地目录同步增加稳健性。 rsync 的灵活性使其成为许多不同文件级操作的理想选择。掌握 rsync 可以让您设计复杂的备份操作,并获得对传输方式和内容的细粒度控制。
与 rsync 命令一起使用的一些常用选项: - -v:详细
- -r:递归复制数据(但在传输数据时不保留时间戳和权限。)
- -a:归档模式,允许递归复制文件,还保留符号链接、文件权限、用户和组所有权以及时间戳。
- -z:压缩文件数据。
- -h:人类可读,以人类可读格式输出数字。
为了使两个NAS设备的目录真正保持同步,如果从源目录中删除了文件,则必须从目标目录中删除它们。默认情况下,rsync 不会从目标目录中删除任何内容。您可以使用--delete 选项更改此行为。在使用此选项之前,您可以使用 --dry-run 选项-n 来执行测试以防止不必要的数据丢失。例如:
威联通NAS 系统发起“推送”操作:
或者群晖NAS系统发起“拉取” 操作:
admin @DSM613:~ rsync-an –delete admin@192.168.x.x:/share/Public/dir1 /volume1/Public
如果您正在传输尚未压缩的文件,例如文本文件,您可以通过使用 -z 选项添加压缩来减少网络传输:(仅仅给出语法规则,就不举例了。) rsync -az source destination
上述如何使用rsync命令实现本地NAS和远程NAS之间数据备份同步,所谓的本地和远程我们还可以把本地理解为“发起方”,把远程理解为“接收方”。虽然两方都需要rsync这个应用工具,但仅仅在本地一方使用命令操作就可以解决所有的备份同步问题了。远程一方无需做任何操作。这正是我讲解命令时特意强调了“推送”与“拉取” 操作功能的目的。由此你也应该能体会出来为什么现有的各种品牌的NAS都使用rsync作为备份同步核心工具的原因了吧。
|