对员来说,平时的工作重心应该集中在维护系统正常运转,能够正常提供服务上,这里往往牵涉到一个数据备份的问题,在我所了解 的情况中,有80%的系统管理员不是太关心自己的安全性,但往往对备分镜像的技术相当感兴趣,但由于商业产品的软硬件价格都相当高 昂,因此往往会选择自由软件。这里准备介绍的rsync就是这样的软件,它可以满足绝大多数要求不是特别高的备份需求。 一、特性简介 rsync是类系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的特性如下: 1、可以镜像保存整个目录树和文件系统。 二、使用方法 rsync的使用方法很简单,我就举自己使用的例子来说明吧。 1、系统环境 rsync支持大多数的类unix系统,无论是、还是BSD上都经过了良好的测试。我的系统环境为: server: 4.3 ip: 192.168.168.52 2、配置server端的/etc/rsyncd.conf文件 bash-2.03# cat /etc/rsyncd.conf uid = nobody [inburst] # 这里是认证的模块名,在client端需要指定 [web] 3、在server端生成一个密码文件/etc/inburst.pas bash-2.03# cat /etc/inburst.pas 出于安全目的,文件的属性必需是只有属主可读。 4、在server端将rsync以守护进程形式启动 bash-2.03# rsync --daemon 如果要在启动时把服务起来,有几种不同的方法,比如: a、加入inetd.conf 编辑/etc/services,加入rsync 873/tcp,指定rsync的服务端口是873 b、加入rc.local 在各种中,rc文件存放位置不尽相同,可以修改使系统启动时rsync --daemon加载进去。 5、从client端进行测试 下面这个命令行中-vzrtopg里的v是verbose,z是压缩,r是recursive,topg都是保持文件原有属性如属主、时间的参数。--progress是指显示 出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。后面的inburst@ip中, inburst是指定密码文件中的用户名,之后的::inburst这一inburst是模块名,也就是在/etc/rsyncd.conf中自定义的名称。最后的/tmp是备份 到本地的目录名。 在这里面,还可以用-e ssh的参数建立起的连接。可以用--password-file=/password/path/file来指定密码文件,这样就可以在脚本中使 用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。 bash-2.03# rsync -vzrtopg --progress --delete inburst@192.168.168.52::inburst /tmp/ 6、创建更新脚本 如果有比较复杂的工作,利用一些常见的脚本语言可以有帮助。比如: bash-2.03# cat /usr/local/bin/rsync.sh #!/bin/sh rsync -vzrtopg --progress --delete inburst@192.168.168.52::inburst /home/quack/backup/$DATE --password-file=/etc/rsync.pass > /var/log/rsync.$DATE 7、修改/etc/crontab做好定时 比如: bash-2.03# echo "15 4 * * 6 root rsync.sh">>/etc/crontab 三、FAQ Q:如何通过ssh进行rsync,而且无须输入密码? 1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件 Q:如何通过在不危害安全的情况下通过防火墙使用rsync? 这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。 Q:我能将更改过或者删除的文件也备份上来吗? 你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。 手工建立起来 Q:我需要在防火墙上开放哪些端口以适应rsync? rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口: rsync --port 8730 otherhost:: Q:我如何通过rsync只复制目录结构,忽略掉文件呢? Q:为什么我总会出现"Read-only file system"的错误呢? Q:为什么我会出现'@ERROR: invalid gid'的错误呢? nogroup或者其它 Q:绑定端口873失败是怎么回事? Q:为什么我认证失败? 你用的是: 应该是没有以你的用户名登陆导致的问题,试试rsync -a max@144.16.251.213::test test 四、一些可借鉴的脚本 这里这些脚本都是rsync网站上的例子: 1、每隔七天将数据往中心服务器做增量备份 #!/bin/sh # This script does personal backups to a rsync backup server. You will end up # directory to backup # excludes file - this contains a wildcard pattern per line of files to exclude # the name of the backup machine # your password on the backup server
BACKUPDIR=`date +%A` export PATH=$PATH:/bin:/usr/bin:/usr/local/bin # the following line clears the last weeks incremental directory # now the actual transfer 2、备份至一个空闲的硬盘 #!/bin/sh export PATH=/usr/local/bin:/usr/bin:/bin LIST="rootfs usr data data2" for d in $LIST; do DAY=`date "+%A"` 3、对vger.rutgers.edu的cvs树进行镜像 #!/bin/bash cd /var/www/cvs/vger/ RUN=`lps x | grep rsync | grep -v grep | wc -l` rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog sum1=`sum $HOME/ChangeLog` if [ "$sum1" = "$sum2" ]; then rsync -az --delete --force vger.rutgers.edu::cvs/ /var/www/cvs/vger/ 4、利用find的一种巧妙方式 rsync -avR remote:'`find /home -name "*.[ch]"`' /tmp/ 可以用这种方法列出需要备份的文件列表——这种方法似乎比较少人用到 |