摘要
现今有很多人都在同时使用多台计算机 - 一台在家用,一台或多台在办公室用,还可能携带便携式计算机或 PDA 在途中使用。很多文件是所有这些计算机上共同需要的。所以,您可能希望能在所有计算机上工作,修改文件,让所有计算机都能提供最新的数据。
数据同步对于通过快速网络永久互联的计算机而言并不是个问题。在这种情况下,使用 NFS 这样的网络文件系统并将文件储存在服务器上,就可以支持所有主机通过网络访问相同的数据。但如果网络连接较差或者不是永久连接,这种方法就行不通了。使用便携式计算机在途中工作时,所有所需文件的副本都必须位于本地硬盘上。不过,您需要随后同步修改的文件。在一台计算机上修改某个文件后,一定要更新该文件在所有其他计算机上的副本。对于零星的副本,可以用 scp 或 rsync 手动更新。但如果涉及大量文件,这个过程要复杂得多,您必须小心操作,避免出现旧文件覆盖新文件之类的错误。
![]() | 数据丢失风险 |
|---|---|
开始通过同步系统管理数据之前,您应该熟悉所用的程序并测试其功能。一定要对重要文件进行备份。 | |
使用程序可以通过各种方法自动执行数据同步,从而克服手动同步数据时既耗时又容易出错的缺点。以下概要的目的只是让您大致了解这些程序的工作原理及它们的用法。如果打算使用它们,请阅读相应的程序文档。
CVS 主要用于对程序源代码进行版本管理;使用它可以在多台计算机上保留文件的副本。因此,该程序也适用于数据同步。CVS 在服务器上维护一个中央安装源,其中保存着文件和对文件的更改。本地执行的更改将提交到该安装源,并能够通过更新从其他计算机检索。这两个过程都必须由用户启动。
若多台计算机上都发生了更改,CVS 能够非常灵活地处理错误。这些更改将合并,若发生在同一行上,则会报告冲突。发生冲突时,数据库仍保持一致状态。冲突仅显示在客户端上并在客户端上解决。
在无需版本控制但需要通过慢速网络连接同步大型目录结构时,rsync 工具可以提供较为完善的机制,仅传送文件中的更改。这不仅适用于文本文件,还适用于二进制文件。为检测文件间的差异,rsync 会将文件划分为多个块,并计算各个块的校验和。
检测更改需要消耗一定的资源。要使用 rsync,准备同步的系统应能够伸缩自如。RAM 尤为关键。
在决定使用哪个程序时请考虑几个重要因素。
在分发数据时,常用的有两个模型。在第一个模型中,所有客户端都通过中央服务器来同步文件。所有客户端都应能够访问该服务器(至少能偶尔为之)。CVS 使用该模型。
另一个模型是让所有联网主机作为同级相互同步数据。rsync 实际在客户端模式下工作,但任何客户端都可用作服务器。
CVS 和 rsync 还适用于其他很多操作系统,包括各种 Unix 和 Windows 系统。
在 CVS 中,数据同步是由用户手动启动的。这样可以有效控制要同步的数据并易于解决冲突。不过,如果同步间隔过长,就容易发生冲突。
在 CVS 中很少发生冲突,即便是多人同时在一个大型程序项目上协作时也不例外。这是因为合并文档时基于的是单个行。发生冲突时,只有一个客户端会受影响。通常很容易解决 CVS 中发生的冲突。
rsync 中不提供冲突解决功能。用户自己要避免意外覆盖文件,并手动解决所有可能的冲突。为了安全起见,还可以使用 RCS 之类的分版本系统。
在 CVS 中,必须使用命令 cvsadd 明确添加新目录和文件。这样用户可以更有效地控制要同步的文件。但另一方面,这样也容易遗漏新文件,特别是在有大量文件时,很容易忽略 cvs update 输出中的问号。
CVS 的另一个功能是能够重建旧文件版本。每次一有更改都可以插入一个简短的编辑注释,以后根据文件内容和这些注释就很容易跟踪文件的变化。这对论文和程序文本大有帮助。
所有相关主机的硬盘上都要有足够的可用于所有分发数据的空间。CVS 还要求服务器为安装源准备额外的空间。文件历史记录也储存在服务器上,这进一步增加了空间要求。更改文本格式的文件时,只需保存修改的那些行。而二进制文件则要求在每次更改文件时都要有与文件大小相同的额外空间。
有经验的用户通常从命令行运行 CVS。不过,图形用户界面也适用于 Linux(如 cervisia)以及其他操作系统(如 wincvs)。许多开发工具(如 kdevelop)及文本编辑器(如 Emacs)都提供针对 CVS 的支持。在这些前端上解决冲突往往较为容易。
rsync 相当容易使用,还适合初学者。CVS 某种程度上较难操作。用户应该了解安装源和本地数据之间如何交互。对数据的更改首先要在本地与安装源合并。使用命令 cvs update 可完成上述操作。然后必须使用命令 cvs commit 将数据发回安装源。一旦了解了此过程,新手也就能毫不费力地使用 CVS 了。
在传送数据的过程中,最好防止数据被拦截或操纵。CVS 和 rsync 可以方便地通过 ssh(安全外壳)使用,从而防止遭受此类攻击。应避免通过 rsh(远程外壳)运行 CVS。也不建议在不安全的网络中使用 pserver 机制访问 CVS。
开发人员使用 CVS 来管理程序项目已有很长时间,所以该程序极为稳定。由于能够保存开发历史记录,CVS 甚至能够预防某些用户错误,如意外删除文件。
表 26.1. 文件同步工具的功能: -- = 很差,- = 差或不可用,o = 中等,+ = 好,++ = 很棒,x = 可用¶
|
CVS |
rsync | |
|---|---|---|
|
客户端/服务器 |
客户端-服务器 |
客户端-服务器 |
|
可移植性 |
Lin、Un*x、Win |
Lin、Un*x、Win |
|
交互能力 |
x |
x |
|
速度 |
o |
+ |
|
冲突 |
++ |
o |
|
文件选择 |
所选/文件、目录 |
目录 |
|
历史 |
x |
- |
|
硬盘空间 |
-- |
o |
|
GUI |
o |
- |
|
难易程度 |
o |
+ |
|
攻击 |
+ (ssh) |
+(ssh) |
|
数据丢失 |
++ |
+ |
如果经常编辑各个文件并且这些文件以 ASCII 文本或程序源代码文本之类的格式储存,则应该使用 CVS 来进行同步。用 CVS 同步其他格式的数据(如 JPEG 文件)固然可行,但这会产生大量数据,因为文件的所有变体都永久储存在 CVS 服务器中。这种情况下将无法利用 CVS 的大多数功能。只有在所有工作站都可以访问同一服务器时,才能使用 CVS 同步文件。
服务器是储存所有有效文件(包括所有文件的最新版本)的主机。任何固定的工作站都可以充当服务器。如果可能,应该对 CVS 安装源的数据进行定期备份。
配置 CVS 服务器时,通过 SSH 授予用户访问服务器的权限是一种不错的方式。如果用户在服务器上的用户名为 tux,并且在服务器和客户端上都安装了 CVS 软件,则必须在客户端设置以下环境变量:
CVS_RSH=ssh CVSROOT=tux@server:/serverdir
可使用命令 cvsinit 从客户端初始化 CVS 服务器。只需执行一次初始化。
最后,必须给同步指派名称。在客户端选择或创建目录,以包含要使用 CVS 来管理的文件(该目录也可以为空)。目录的名称同时也是同步的名称。在本例中,目录名为 synchome。转到此目录并输入以下命令,将同步名称设置为 synchome:
cvs import synchome tux wilber
许多 CVS 命令都需要注释。为此,CVS 会启动一个编辑器(在环境变量 $EDITOR 中定义的编辑器;如果未定义任何编辑器,则使用 vi)。通过提前在命令行中输入注释(如下例所示),可以避免调用编辑器。
cvs import -m 'this is a test' synchome tux wilber
现在,在所有主机上都可以使用 cvsco synchome 将该同步安装源签出。该操作将在客户端上创建新的子目录 synchome。要向服务器提交更改,请转到目录 synchome(或其子目录之一),然后输入 cvscommit。
默认情况下,所有文件(包括子目录)都要提交给服务器。若仅提交单个文件或目录,请按 cvscommit file1 directory1 中的方式进行指定。在将新文件和目录提交给服务器之前,必须使用 cvsadd file1 directory1 之类的命令先将其添加到安装源中。随后再使用 cvscommit file1 directory1 命令提交新添加的文件和目录。
如果转到另一个工作站,则需要签出同步安装源(如果在同一工作站上的较早会话中尚未执行该操作)。
使用 cvsupdate 开始与服务器同步。如 cvsupdate file1 directory1 所示更新各个文件或目录。要查看当前文件与服务器上储存的版本的差异,请使用命令 cvsdiff 或 cvsdiff file1 directory1。使用 cvs-nq update 可以查看哪些文件将受到更新的影响。
以下是更新期间显示的一些状态符号:
已更新本地版本。这将影响服务器提供的和本地系统缺少的所有文件。
已修改本地版本。若服务器发生更改,可以将差异并入本地副本。
已使用服务器上的版本修补本地版本。
本地文件与安装源中的当前版本冲突。
此文件在 CVS 中不存在。
状态 M 表示本地修改的文件。可以向服务器提交本地副本,也可以在删除本地文件后再次进行更新。更新后将能够从服务器中恢复缺失的文件。如果提交了本地修改的文件但提交的这个文件中的同一行发生了更改,则可能发生冲突(由 C 表示)。
在这种情况下,查看文件中的冲突标记(“>>” 和 “<<”),决定要采用哪个版本。由于这是一项令人不快的工作,您可以选择放弃更改,删除本地文件,然后输入 cvsup 从服务器恢复当前版本。
如果需要定期传送大量数据而更改的数据量不是很大,则适用 rsync。举例来说,创建备份时的情况往往就是这样。另一种应用涉及临时服务器。临时服务器是储存 Web 服务器的完整目录树的服务器,这些 Web 服务器定期镜像到 DMZ 中的 Web 服务器。
rsync 有两种操作方式。可用于存档或复制数据。要执行上述操作,目标系统上只需要有远程外壳,如 ssh。不过,rsync 也可用作守护程序,为网络提供目录。
rsync 的基本操作方式不需要任何特殊配置。rsync 能直接将完整目录镜像到其他系统中。举例来说,以下命令在名为 sun 的备份服务器上为 tux 的主目录创建了备份副本。
rsync -baz -e ssh /home/tux/ tux@sun:backup
以下命令用于回放该目录:
rsync -az -e ssh tux@sun:backup /home/tux/
到目前为止,该程序的操作方式与普通的复制工具 (如 scp) 的操作方式相差无几。
应该以“rsync”方式操作 rsync,以便充分利用其所有功能。这需要在其中一个系统上启动 rsyncd 守护程序。在文件 /etc/rsyncd.conf 中配置该守护程序。例如,要使目录 /srv/ftp 可用于 rsync,请使用以下配置:
gid = nobody
uid = nobody
read only = true
use chroot = no
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
[FTP]
path = /srv/ftp
comment = An Example
然后使用 rcrsyncdstart 启动 rsyncd。rsyncd 也可以在引导进程中自动启动。通过在 YaST 提供的运行级别编辑器中激活此服务或通过手动输入命令 insservrsyncd,都可以完成上述设置。也可以使用 xinetd 来启动 rsyncd。不过,建议只在很少使用 rsyncd 的服务器上采用这种启动方式。
下例还创建了一个列出所有连接的日志文件。此文件储存在 /var/log/rsyncd.log 中。
随后可以从客户端系统测试传送。请使用以下命令完成该操作:
rsync -avz sun::FTP
此命令列出服务器的 /srv/ftp 目录中现有的所有文件。此请求还记录在日志文件 /var/log/rsyncd.log 中。要启动实际的传送,请提供目标目录。使用 . 表示当前目录。例如:
rsync -avz sun::FTP .
默认情况下,使用 rsync 同步时不会删除任何文件。如果应强制删除,必须明确指定附加选项 --delete。为保证不删除任何较新的文件,可转而使用选项 --update。必须手动解决所有冲突。
关于 CVS 的重要信息可以在主页 http://www.cvshome.org 中找到。
有关 rsync 的重要信息,请参见手册页 manrsync 和 manrsyncd.conf。/usr/share/doc/packages/rsync/tech_report.ps 专门提供了关于 rsync 工作原理的技术参考。在 rsync 的网站 http://rsync.samba.org/ 上可以找到关于该项目的最新消息。