rsync 命令家族

使用 rsync 轻松地同步任意两台机器

使用 rsync 更轻松更快速地同步两台机器(比如笔记本计算机和桌面计算机),这提供一种高效的算法和多种选项。另外,如果不喜欢命令行操作,还可以通过几个图形化工具更简便地使用 rsync

Federico Kereki, 系统工程师

Federico Kereki 的照片Federico Kereki 是一名来自乌拉圭的系统工程师,拥有超过 20 年的开发、咨询和大学教学的经验。目前,他正在与各种各样的缩略词打交道:SOA、GWT、Ajax、PHP,当然还有 FLOSS!



2009 年 6 月 04 日

如果您同时使用笔记本计算机和桌面计算机,就可能需要及时地同步它们。另外,除了在家里运行同步之外,还可能希望从远程站点运行同步;就拿我来说,我在旅途中使用笔记本计算机,在此期间希望确保把在笔记本上做的工作备份到桌面计算机上。(丢失笔记本并因此丢失所有工作是真正的大灾难!)对于这个问题有许多解决方案:本文介绍一种工具 — rsync — 和几种相关工具,它们都提供简便的同步过程。

什么是 rsync?

rsync 应用程序是在 Linux® 和 UNIX® 上广泛使用的文件传输和同步程序,而且它已经移植到了 Windows® 上。它的关键特性是一个非常快的算法,它只通过数据链路发送文件差异,因此把机器之间传输的数据总量降低到最低限度。(如果使用 File Transfer Protocol [FTP] 或 rcpscp 等实用程序,那么即使只修改了一个字节,也会发送完整的文件)。当然,rsync 并非只能处理现有的文件:它还可以处理只在链路一端存在的文件和目录。最后,通过压缩数据来优化通信,因此可以通过非宽带连接使用这个工具。

rsync 的状态

rsync 实用程序最初是由 Samba 的开发者 Andrew Tridgell 开发的。这个软件采用 GNU General Public License (GPL),它的当前版本是 2008 年 12 月发布的 3.0.5。

获取并安装 rsync

可以找到针对大多数当前 Linux 发行版预编译的二进制包,首先应该找到适合自己的包。我使用 Smart 对 OpenSUSE 进行包管理,所以只需使用 sudo smart install rsync 命令安装 rsync 的最新版本。如果您喜欢自己进行编译,那么可以获取源代码(见 参考资料 中的链接)并用传统的 configure, make, make install 方法安装它;详细步骤参见源代码中的 README 文件。

为了进行安全的通信,需要安装 Secure Shell (ssh)。(可以使用 remote shell [rsh],但是它不够安全)。OpenSSH 是 ssh 的一种免费实现,在所有发行版上都有。还需要在防火墙上打开一个端口,让计算机可以相互连接。这些都是标准配置,更多信息见 参考资料 中的链接。

作为守护进程运行 rsync

有两种运行 rsync 的方法:作为守护进程运行和根据需要运行。如果只想同步两台计算机,那么选用哪种方法并没有明显的差异。作为守护进程运行 rsync(使用 rsync --daemon 命令)适用于服务器,允许多个不同的用户针对服务器同步自己的计算机。可以通过 man rsyncd.conf 了解可以指定的选项。但是要注意,对于同步笔记本和桌面计算机,不需要使用复杂的配置。

使用 rsync

现在,我们使用 rsync 把笔记本计算机直接同步到一个远程服务器。为此,可以使用与 清单 1 相似的代码。还可以把远程服务器同步到笔记本(文件将从服务器发送到笔记本),或者同步两个本地目录,但是不能同步两个远程服务器。

清单 1. 相同 rsync 命令的两个版本
rsync --compress --recursive --delete --links \
--times --perms --owner --group \
--verbose --progress --stats \
--rsh="ssh" \
--exclude "*bak" --exclude "*~" \
/my/path/at/the/laptop/* myserver:/some/path/at/the/server

rsync -zrltpogve "ssh" --progress --stats --delete \
--exclude "*bak" --exclude "*~" \
/my/path/at/the/laptop/* myserver:/some/path/at/the/server

注意,清单 1 中选项的次序是任意的,而且大多数选项有短格式。首先,--compress(或 -z)指定将压缩数据,这可以节省带宽。应该总是使用这个选项。(在非常高速的数据链路上,不进行压缩可能也可以,但是对于大多数远程连接,压缩都是有帮助的)。可以使用补充选项 --compress-level=level 指定压缩的级别;但是,通常可以接受标准的压缩级别。

--recursive (-r) 选项让 rsync 递归地复制所有目录。这会复制目录中的所有文件,包括其中的子目录及其内容。如果不需要这个功能,可以使用 --dirs 选项 (-d) 产生相反的效果:跳过子目录及其内容。

在默认情况下,rsync 把需要的文件复制到目标计算机,但是并不删除额外文件。通过使用 --delete 选项,目标目录会与原目录保持完全一致。但是要注意:如果把一个空目录同步到远程目录,就会删除远程目录中的所有内容!

如果原目录中有符号链接,--links 选项(或 -l)会在目标目录中重新创建这些符号链接。另一种方法是使用 --copy-links(或 -L)复制符号链接指向的文件或目录,而不是复制符号链接本身。如果有符号链接指向复制的树之外的文件或目录(这是一种安全风险),可以使用 --copy-unsafe-links--safe-links 选项忽略这样的链接,这更安全。

后面四个选项(--times--perms--owner--group-tpog)分别让 rsync 保持原来的更新时间戳、权限、所有者和组信息。同时指定所有这些选项的简便方法是使用 --archive(或 -a),这还会设置 --recursive--links 选项。

后面三个选项(--verbose--progress--stats)提供关于 rsync 正在执行的操作的大量信息。如果对这些信息不感兴趣,只需跳过它们,除非出现错误,rsync 会悄悄地运行。

尽管当前的 rsync 版本默认使用 ssh,但是可以使用 --rsh(或 -e)选项强制使用 ssh。如果需要使用额外的 ssh 参数(例如希望让 ssh 使用非标准端口),可以添加这些参数,例如 --rsh "ssh -p 12345"

可以使用 --exclude 选项(和对应的 --include)选择要同步的文件。在这个示例中,排除了常见的备份文件。应该根据需要排除和包含文件,从而优化发送的内容。

最后,指定源路径和目标路径。不要忘记最后的 /*,否则结果可能不符合期望。可以通过查看文档了解 some/path、some/path/some/path/* 之间的差异。但是,使用 /* 是最保险的方法。

可以使用 -a 选项 (--archive) 简化清单 1 中的命令,见 清单 2。(如果作为根在服务器上运行 rsync-a 选项可能会复制一些额外的内容 — 请查阅文档 — 这不是一种安全的做法)。rsync 还有许多选项;可以通过 rsync --helpman rsync 了解所有选项。

清单 2. 相同命令的简短版本
rsync -zae "ssh" --delete --exclude "*bak" --exclude "*~" \
/my/path/at/the/laptop/* myserver:/some/path/at/the/server

在不需要密码的情况下使用 rsync

如果像上面这样使用 rsync,那么每次都必须输入远程计算机的密码。对于一般的使用,这只是有点儿麻烦;但是,如果要从 cron 过程使用 rsync,这会造成严重的阻碍。

为了实现不需要密码的 rsync 会话,必须设置一个公共-私有密钥对。首先,在笔记本上运行 ssh-keygen -t rsa。在询问密码时,保持为空。这个命令在主目录中的(隐藏的).ssh 目录中创建两个文件:id_rsa 和 id_rsa.pub。

然后,登录服务器,在主目录中运行 mkdir .ssh; chmod 0700 .ssh。返回到笔记本上,把刚创建的 id_rsa.pub 作为 authorized_keys2 复制到新的 .ssh 目录中。在笔记本上,可以运行 scp .ssh/id_rsa.pub your_server:.ssh/authorized_keys2

这就完成了!在此之后,就可以通过 ssh 连接服务器(并运行 scprsync),而不需要输入密码。

图形化替代工具

如果您喜欢使用图形用户界面 (GUI) 而不是命令行,那么可以选择几种工具。但是,应该记住一点:并没有 “完美的替代工具”,在使用任何程序之前,应该进行充分的测试。一些程序尽管看起来很有意思,但是它们还处于开发阶段,还不太成熟;一些程序提供更先进的功能。还有一些失败的过时的工具。

GAdmin-Rsync

GAdmin-Rsync(见 图 1)是 Gadmintools 包的组成部分,Gadmintools 包是一组供 Linux 系统管理员使用的 GUI 工具。它的最新版本是 2009 年 1 月发布的 0.1.1,前一个版本是 2008 年 6 月发布的 0.1.0。它的安装非常简单:如果没有找到适合自己发行版的包,那么只需下载源代码并运行简单的 ./Autoinstall 过程。

图 1. 尽管 GAdmin-Rsync 的版本号很低,界面也需要进一步开发,但是它的功能很不错
Gadmin-rsync

让人吃惊的一点是这个程序需要根密码。您可以说我过分小心,但是除非绝对必须,我肯定不愿意作为根用户工作;根用户犯的错误往往会造成惨重的损失!

在第一次使用这个工具时,它要求指定要运行的备份的详细信息。GAdmin-Rsync 允许定义多个备份,很容易重新运行它们。需要指定备份的类型(本地到本地、本地到远程或远程到本地)以及适当的目录和服务器信息。但是,要注意一点:我没有找到编辑服务器参数的方法,所以修改服务器参数就需要创建新的备份 — 这对用户不太方便。我还遇到了另一个问题:这个程序不接受无密码连接。

GAdmin-Rsync 中没有什么花哨的东西。例如,无法进行 “演习”。相反,能够简便地指定在以后运行的 cron 作业。这种功能可能反映了这个程序的 “面向根用户” 思想:它并不适合一般用户,而是供系统管理员使用的。(Help 特性也反映了这种思想:它只说 “How to backup using GAdmin-Rsync: Visit http://www.gadmintools.org” — 这比 “RTFM” 注释强不了多少!)您是否喜欢这个程序,取决于您的系统管理经验,但是如果适当地使用,它是很有帮助的。

Grsync

Grsync(见 图 2)是一个基于 GTK 的 rsync GUI,但是它不仅能够在 Gnome 上使用。它的最新版本是 2008 年 12 月发布的 0.6.2,这意味着它仍然处于开发阶段。它最有意思的特性包括:

  • 把设置保存为 “会话”,这样就可以方便地重新运行备份过程。
  • 在实际提交备份之前,允许进行 “模拟”(演习)。
  • 可以在备份作业之前和之后执行额外命令。
  • 包含一个命令行版本 grsync-batch,可以使用它从 cron 作业运行 Grsync 会话。
图 2. Grsync 没有提供底层 rsync 命令的许多选项,但是非常方便和稳定。
Grsync

在它的主页(见 参考资料 中的链接)上,可以找到源代码,如果您有 GTK 和 Autotools,可以自己编译源代码。但是,也可以找到针对许多发行版编译的二进制代码,包括 OpenSUSE、Mandriva、Red Hat(以及 Fedora 和 CentOS)等等。Grsync 只是一个前端,所以它不包含 rsync:您必须先自行安装 rsync

Grsync 并没有提供 rsync 的所有特性,但是对于大多数用户来说,它包含的选项已经足够了。如果需要其他特性,可以单击 Advanced Options 选项卡,然后就能够添加所需的任何选项。但是,要注意语法:如果出现语法错误,Grsync 并不会给出提示,但是在执行备份时 rsync 会显示错误消息。尽管有这些不足,这个程序仍然是非常方便和稳定的 — 可能是我考察的所有 GUI 中最好的一种。

QSync 和 TKsync

QSync 是一种基于 Qt 的界面,但是它的开发似乎到 2005 年 12 月发布的 0.3 版就已经停止了。我不推荐这个工具:它需要自己的 rsync 版本,所以不使用最新的 rsync 包,而是使用内部版本(肯定比较旧)。我下载了一个 OpenSUSE 包,但是它无法运行;坦白地说,对于一个似乎已经被放弃的包,不值得花费精力进行定制的编译。作者本人在 2003 年承认 “QSync 的同步部分还不十分完善”,在此之后没有更新,所以有理由相信这个问题还未解决。

在 Google 上搜索 rsync GUI 可能会搜索到另一个项目 TKsync,它的最新版本是 2004 年发布的 0.2.1。但是,搜索不到这个项目的主页(似乎被删除了)。因此,这个项目应该已经消亡了。如果您碰巧找到了它的安装包,最好不要使用它。

Zynk

尽管 Zynk 还处于开发的早期阶段,但是这个程序很值得注意。另外,可以找到针对多个发行版的版本,您还应该了解它当前的限制。最后要注意,Zynk 是一个 GTK+ 应用程序,但是没有 Gnome 也能运行;我在 K Desktop Environment (KDE) 中做过测试。

Zynk 的当前版本是 2009 年 2 月发布的 0.0.2。由于它还处于开发状态,作者本人警告说,“目前还有许多 bug!这个软件中只有一部分功能能够正常工作!要使用它的话,风险自负!” 根据他的估计,这个程序只完成了大约 10%,尽管看起来不止这么少,见 图 3

图 3. Zynk 还处于开发的早期阶段,但是似乎有前途
Zynk

Zynk 显然提供 rsync 的大多数选项(也可能是所有选项)。(顺便说一句,需要先安装 rsync)。在窗口底部,可以看到要执行的命令及其输出。

经过测试之后,我不得不同意这个程序还需要进一步开发。但是与 QSync 不同,它的开发还在进行,有理由相信它会越来越成熟。

结束语

rsync 应用程序是命令行工作的必备工具,您需要学习如何使用它实现简便、安全且快速的笔记本-桌面同步。如果您更喜欢使用 GUI,Grsync 似乎是目前最好的工具,QSync 已经过时了,而 GAdmin-Rsync 和 Zynk 还处于开发的早期阶段。

参考资料

学习

  • Andrew Tridgell 在他的博士论文 “Efficient Algorithms for Sorting and Synchronization” 中讨论了 rsync,并在他的 技术报告 中详细讨论了 rsync 算法。
  • rsync 站点 是必须访问的站点。它提供 FAQ文档示例 和其他参考资料。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • 技术书店 浏览关于这些主题和其他技术主题的图书。

获得产品和技术

  • 研究 ssh,安装 OpenSSH(ssh 的免费版本)来实现安全的通信。
  • 下载 rsync 并安装它。
  • GAdmin-Rsync 是 Gadmintools 包的组成部分,Gadmintools 包是一组供 Linux 系统管理员使用的 GUI 工具。
  • Grsync 仍然在更新,其功能虽然有限,但是相当有用。
  • Krsync 是在 Linux 图形化脚本工具 Kommander 上构建的。
  • QSync 已经过时了,可能会被放弃;建议不要使用它。
  • Zynk 看起来很有意思,但是它还处于早期阶段,还不成熟。
  • 使用 Smart 进行包管理。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX, Linux
ArticleID=394161
ArticleTitle=rsync 命令家族
publish-date=06042009