分类: LINUX
2009-07-10 09:53:20
传统上,在Unix系统下使用的备份工具主要有tar、dump(rdump)、restore(rrestore)、dd、cpio、rcp等工具。这些工具中大多数适合于本地备份(native backup),倘若要执行远程备份(remote backup)的话,往往显得力不从心。在Linux系统下提供了一个工具——rsync,据其文档说明,它是rcp工具的一个替代品,但是更快捷、更灵活。rsync采用的remote-update协议允许rsync通过网络链路传输两组文件的增量,而是不是文件本身,据此rsync可以提高传输效率。
rsync所具有的功能特色主要有:
l 支持对连接、设备、用户、组、权限的拷贝;
l 支持类似GNU tar工具的exclude和exclude-from选项;
l 类似CVS的exclude模式:忽略相同的文件;
l 可以使用多种远程shell工具,比如rsh或者ssh;
l 不需要root权限即可运行;
l 将文件传输流水线化以减少延迟开销;
l rsync服务器允许以匿名或者认证方式登录(特别适合于做镜像)。
和大多数网络工具一样,rsync也是以服务器/客户端的方式工作的。但较为特别的一点是:rsync服务器和客户端都使用同一个程序——rsync(如果按常见的做法,则应该是服务器程序为rsyncd,客户端程序为rsync)。启动服务器的时候需要指明--daemon选项,以表明启动的是服务器。而在启动客户端程序的时候则不应开启--daemon选项。
在下文中,假设需要备份的主机为192.168.0.100,其上运行rsync服务器,将该主机称之为rsync-server;存放备份数据的主机为192.168.0.200,其上运行rsync客户端程序,将该主机称之为rsync-client。
1 服务器端的配置
rsync的配置文件为/etc/rsyncd.conf,这个配置文件控制着rsync服务器的认证、访问、logging、可用模块等信息。关于这个配置文件的详细说明请参见rsyncd.conf(5)。在本文中,仅对将要使用到的几个配置选项进行说明。需要提醒的是,默认情况下Fedora Core系统的/etc目录下没有rsyncd.conf这个文件,自行创建该文件即可。rsync服务器默认运行在TCP端口873上。
在本文的示例中,要备份的数据统统位于rsync-server主机上的/home目录下,rsync-server主机上的配置文件/etc/rsyncd.conf的内容如下所示:
[home]
path=/home
uid=0
gid=0
配置文件rsyncd.conf的写法非常类似于samba服务器配置文件。rsyncd.conf文件主要包括两类配置信息:全局参数和模块参数。全局参数配置包含着用来控制rsync服务器运行方式的信息,比如日志文件的位置、套接口选项等,全局参数应该出现在第一个模块配置之前。在全局参数之后,是模块参数配置。不同的模块(module)以模块名区分,模块名包含在方括号之中,模块名之后的行都是针对该模块的配置信息,直到遇到下一个模块为止。rsyncd.conf配置文件是基于行的——也就是说一个文本行就是一条配置信息。每一行中出现的第一个等号是重要的,在这个等号之前是参数名,等号之后是参数值。也就是说,每一个参数都是以name=value的形式出现在每一行上的。在第一个等号之前或之后的空格都将被忽略。以#开始的行将被视为注释行而被忽略,如果参数信息太长以至于在一行上写不下,那么可以使用\将其延续到下一行上。参数值分为两种:字符参数和布尔参数,如果是布尔参数,那么可以使用的值为:yes/no,1/0,true/false。布尔参数值不用关心字符的大小写,但是字符参数值却是区分大小写的。
有了上述说明之后,就可以来看一下上面的示例配置文件的含义了:
l [home]
创建一个名为home的模块;
l path=/home
home模块要导出的路径为/home。每一个模块都必须具有path参数;
l uid=0
uid参数指定了以何种用户权限访问该模块(即文件传输时的用户权限);
l gid=0
gid参数指定了以何种组权限访问该模块(即文件传输时的组权限);
除了上面这些模块参数之外,对于模块还有其他很多参数可以选用,比如,可以指定访问控制选项以控制哪些主机可以访问rsync服务器,哪些主机不可以;可以指定哪些文件应当排除在被传输的文件之外(exclude);或者可以指定哪些文件应当被包括在被传输的文件集合之内(include);可以指定rsync客户端的超时时间;可以指定是否采用压缩传输;等等,详见rsyncd.conf(5)。在指定了rsync服务器配置选项之后,应当启动rsync服务器,采用如下命令即可:
[root@localhost etc]# rsync --daemon
[root@localhost etc]# ps auxw | grep rsync
root 4988 0.0 0.0 1688 4 ?
root 7427 0.0 0.2 3544
rsync服务器在启动之后即转入后台运行。ps命令显示的结果表明rsync服务器程序进入了睡眠状态。当有客户端与之建立连接时,rsync服务器将被唤醒。
2 运行客户端
rsync客户端有六种运行方式:
l 拷贝本地文件。调用方式为:
rsync [OPTION]... SRC [SRC]... DEST
注:SRC和DEST都是本地文件(或目录)。
l 通过远程shell从本地主机拷贝文件到远程主机。调用方式为:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
注:SRC是本地文件,DEST是远程主机上的文件。
l 通过远程shell从远程主机拷贝文件到本地主机。调用方式为:
rsync [OPTION]... [USER@]HOST:SRC DEST
注:SRC是远程主机上的文件,DEST是本地文件。
l 从远程rsync服务器拷贝文件到本地主机。调用方式为:
rsync [OPTION]... [USER@]HOST::SRC [DEST]
或者
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
注:SRC是远程主机上的文件,DEST是本地文件。
l 从本地主机拷贝文件到远程rsync服务器。调用方式为:
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
注:SRC是本地文件,DEST是远程主机上的文件。
l 列出远程主机上的文件列表。调用方式为:
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC
注:SRC是远程主机上的文件(或目录)。
在上述六种运行模式中,除了列表模式(最后一种)外,其余模式都要求SRC和DEST中至少一个是本地文件(或目录)。
rsync的传输既可通过远程shell通道完成,也可以直接以服务器/客户端的方式完成。如果是后者,实际上就是通过套接口实现的数据传输。在本文的示例中,采用服务器/客户端的方式,不采用远程shell通道作为传输接口。
本文的示例中,在rsync-client上如下运行rsync客户端程序:
[root@localhost backup_31_64]# rsync –v --archive --recursive --progress --delete --times --perms --compress rsync://rsync-server:/home /home/backup_rsync_server/
该命令将把rsync-server主机上的/home目录下的所有数据同步到本地主机的/home/backup_rsync_server/目录下。在这个命令中使用的几个选项的含义如下:
l -v
输出详细信息。
l --archive
采用归档模式。在这种模式下,几乎所有东西都将被保留(如用户、组、权限、时间等)。
l --recursive
这个选项告诉rsync要递归地拷贝目录。如果不指定该选项,rsync不会拷贝目录。
l --progress
这个选项告诉rsync打印传输的进展情况。通常与-v联合使用。
l --delete
这个选项告诉rsync删除任何存在于接收端但不存在于发送端的文件。
l --times
这个选项告诉rsync将文件的更改时间与文件一起传输,并在远程系统上更新它们。
l --perms
这个选项命令rsync确保远程系统上的文件权限与本地系统上的文件权限相同。
l --compress
这个选项告诉rsync将数据压缩之后再传输。该选项在低速链路上非常有用。
可以看到,这里采用的是rsync六种工作方式中的第四中工作方式,rsync://是一个URL标记。以上列举的是rsync客户端程序常用的选项,rsync命令完整的选项列表请参考rsync(1)。
发出上述命令之后,rsync开始从rsync-server主机同步数据到本地主机的/home/backup_rsync_server/目录下。同步过程中的文件传输等信息将在控制台上显示出来。
3 结论
本文展示了在Linux系统下如何通过rsync工具完成备份工作的基本流程。尽管只就使用rsync工具的一种简单情形做了说明,但是在此基础上很容易扩展到rsync的其它工作模式上去。rsync工具灵活的选项、增量更新的备份方式、多样的功能模式使得它非常适合于在多台主机之间进行远程备份。