<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[用rsync对网站进行镜像备份]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 04 Feb 2010 11:01:03 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	对系统管理员来说，平时的工作重心应该集中在维护系统正常运转，能够正常提供服务上，这里往往牵涉到一个数据备份的问题，在我所了解<br/><br/>的情况中，有80%的系统管理员不是太关心自己服务器的安全性，但往往对备分镜像的技术相当感兴趣，但由于商业产品的软硬件价格都相当高<br/><br/>昂，因此往往会选择自由软件。这里准备介绍的rsync就是这样的软件，它可以满足绝大多数要求不是特别高的备份需求。<br/><br/>一、特性简介<br/><br/>rsync是类unix系统下的数据镜像备份工具，从软件的命名上就可以看出来了——remote sync。它的特性如下：<br/><br/>1、可以镜像保存整个目录树和文件系统。<br/>2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。<br/>3、无须特殊权限即可安装。<br/>4、优化的流程，文件传输效率高。<br/>5、可以使用rcp、ssh等方式来传输文件，当然也可以通过直接的socket连接。<br/>6、支持匿名传输。<br/><br/>二、使用方法<br/><br/>rsync的使用方法很简单，我就举自己使用的例子来说明吧。<br/><br/>1、系统环境<br/><br/>rsync支持大多数的类unix系统，无论是Linux、Solaris还是BSD上都经过了良好的测试。我的系统环境为：<br/><br/>server: FreeBSD 4.3&nbsp;&nbsp; ip: 192.168.168.52<br/>client: Solaris 8&nbsp;&nbsp;&nbsp;&nbsp; ip: 192.168.168.137<br/>rsync 版本 2.4.6(可以从http://rsync.samba.org/rsync/获得最新版本)<br/><br/>2、配置server端的/etc/rsyncd.conf文件<br/><br/>bash-2.03# cat /etc/rsyncd.conf<br/><br/>uid = nobody<br/>gid = nobody<br/>use chroot = no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 不使用chroot<br/>max connections = 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 最大连接数为4<br/>pid file = /var/run/rsyncd.pid<br/>lock file = /var/run/rsync.lock<br/>log file = /var/log/rsyncd.log&nbsp;&nbsp;&nbsp;&nbsp; # 日志记录文件<br/><br/>[inburst]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 这里是认证的模块名，在client端需要指定<br/>path = /home/inburst/python/&nbsp;&nbsp;&nbsp;&nbsp; # 需要做镜像的目录<br/>comment = BACKUP CLIENT IS SOLARIS 8 E250<br/>ignore errors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 可以忽略一些无关的IO错误<br/>read only = yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 只读<br/>list = no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 不允许列文件<br/>auth users = inburst&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 认证的用户名，如果没有这行，则表明是匿名<br/>secrets file = /etc/inburst.pas&nbsp;&nbsp;&nbsp;&nbsp; # 认证文件名<br/><br/>[web]<br/>path = /usr/local/apache/htdocs/<br/>comment = inburst.org web server<br/><br/>3、在server端生成一个密码文件/etc/inburst.pas<br/><br/>bash-2.03# cat /etc/inburst.pas<br/>inburst:hack<br/><br/>出于安全目的，文件的属性必需是只有属主可读。<br/><br/>4、在server端将rsync以守护进程形式启动<br/><br/>bash-2.03# rsync --daemon<br/><br/>如果要在启动时把服务起来，有几种不同的方法，比如：<br/><br/>&nbsp;&nbsp; a、加入inetd.conf<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 编辑/etc/services，加入rsync&nbsp;&nbsp; 873/tcp，指定rsync的服务端口是873<br/>&nbsp;&nbsp;&nbsp;&nbsp; 编加/etc/inetd.conf，加入rsync&nbsp;&nbsp; stream&nbsp;&nbsp; tcp&nbsp;&nbsp; nowait&nbsp;&nbsp; root&nbsp;&nbsp; /bin/rsync rsync --daemon<br/><br/>&nbsp;&nbsp; b、加入rc.local<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 在各种操作系统中，rc文件存放位置不尽相同，可以修改使系统启动时rsync --daemon加载进去。<br/><br/>5、从client端进行测试<br/><br/>下面这个命令行中-vzrtopg里的v是verbose，z是压缩，r是recursive，topg都是保持文件原有属性如属主、时间的参数。--progress是指显示<br/><br/>出详细的进度情况，--delete是指如果服务器端删除了这一文件，那么客户端也相应把文件删除，保持真正的一致。后面的inburst@ip中，<br/><br/>inburst是指定密码文件中的用户名，之后的::inburst这一inburst是模块名，也就是在/etc/rsyncd.conf中自定义的名称。最后的/tmp是备份<br/><br/>到本地的目录名。<br/><br/>在这里面，还可以用-e ssh的参数建立起加密的连接。可以用--password-file=/password/path/file来指定密码文件，这样就可以在脚本中使<br/><br/>用而无需交互式地输入验证密码了，这里需要注意的是这份密码文件权限属性要设得只有属主可读。<br/><br/>bash-2.03# rsync -vzrtopg --progress --delete inburst@192.168.168.52::inburst /tmp/<br/>Password:<br/>receiving file list ... done<br/>./<br/>1<br/>785 (100%)<br/>1.py<br/>4086 (100%)<br/>2.py<br/>10680 (100%)<br/>a<br/>0 (100%)<br/>ip<br/>3956 (100%)<br/>./<br/>wrote 190 bytes&nbsp;&nbsp; read 5499 bytes&nbsp;&nbsp; 758.53 bytes/sec<br/>total size is 19507&nbsp;&nbsp; speedup is 3.43<br/><br/>6、创建更新脚本<br/><br/>如果有比较复杂的工作，利用一些常见的脚本语言可以有帮助。比如：<br/><br/>bash-2.03# cat /usr/local/bin/rsync.sh<br/><br/>#!/bin/sh<br/>DATE=`date +%w`<br/><br/>rsync -vzrtopg --progress --delete inburst@192.168.168.52::inburst /home/quack/backup/$DATE --password-file=/etc/rsync.pass &gt;<br/><br/>/var/log/rsync.$DATE<br/><br/>7、修改/etc/crontab做好定时<br/><br/>比如:<br/><br/>bash-2.03# echo &quot;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp; rsync.sh&quot;&gt;&gt;/etc/crontab<br/><br/>三、FAQ<br/><br/>Q：如何通过ssh进行rsync，而且无须输入密码？<br/>A：可以通过以下几个步骤<br/><br/>1. 通过ssh-keygen在server A上建立SSH keys，不要指定密码，你会在~/.ssh下看到identity和identity.pub文件<br/>2. 在server B上的home目录建立子目录.ssh<br/>3. 将A的identity.pub拷贝到server B上<br/>4. 将identity.pub加到~[user b]/.ssh/authorized_keys<br/>5. 于是server A上的A用户，可通过下面命令以用户B ssh到server B上了<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g. ssh -l userB serverB<br/>这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。<br/><br/>Q：如何通过在不危害安全的情况下通过防火墙使用rsync?<br/>A：解答如下：<br/><br/>这通常有两种情况，一种是服务器在防火墙内，一种是服务器在防火墙外。<br/>无论哪种情况，通常还是使用ssh，这时最好新建一个备份用户，并且配置sshd仅允许这个用户通过RSA认证方式进入。<br/>如果服务器在防火墙内，则最好限定客户端的IP地址，拒绝其它所有连接。<br/>如果客户机在防火墙内，则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了。<br/><br/>Q：我能将更改过或者删除的文件也备份上来吗？<br/>A：当然可以：<br/><br/>你可以使用如：rsync -other -options -backupdir = ./backup-2000-2-13&nbsp;&nbsp; ...这样的命令来实现。<br/>这样如果源文件:/path/to/some/file.c改变了，那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c，这里这个目录需要自己<br/><br/>手工建立起来<br/><br/>Q：我需要在防火墙上开放哪些端口以适应rsync？<br/>A：视情况而定<br/><br/>rsync可以直接通过873端口的tcp连接传文件，也可以通过22端口的ssh来进行文件传递，但你也可以通过下列命令改变它的端口：<br/><br/>rsync --port 8730 otherhost::<br/>或者<br/>rsync -e &#039;ssh -p 2002&#039; otherhost:<br/><br/>Q：我如何通过rsync只复制目录结构，忽略掉文件呢？<br/>A：rsync -av --include &#039;*/&#039; --exclude &#039;*&#039; source-dir dest-dir<br/><br/>Q：为什么我总会出现&quot;Read-only file system&quot;的错误呢？<br/>A：看看是否忘了设&quot;read only = no&quot;了<br/><br/>Q：为什么我会出现&#039;@ERROR: invalid gid&#039;的错误呢？<br/>A：rsync使用时默认是用uid=nobody;gid=nobody来运行的，如果你的系统不存在nobody组的话，就会出现这样的错误，可以试试gid =<br/><br/>nogroup或者其它<br/><br/>Q：绑定端口873失败是怎么回事？<br/>A：如果你不是以root权限运行这一守护进程的话，因为1024端口以下是特权端口，会出现这样的错误。你可以用--port参数来改变。<br/><br/>Q：为什么我认证失败？<br/>A：从你的命令行看来：<br/><br/>你用的是：<br/>&gt; bash$ rsync -a 144.16.251.213::test test<br/>&gt; Password:<br/>&gt; @ERROR: auth failed on module test<br/>&gt;<br/>&gt; I dont understand this. Can somebody explain as to how to acomplish this.<br/>&gt; All suggestions are welcome.<br/><br/>应该是没有以你的用户名登陆导致的问题，试试rsync -a max@144.16.251.213::test test<br/><br/>四、一些可借鉴的脚本<br/><br/>这里这些脚本都是rsync网站上的例子：<br/><br/>1、每隔七天将数据往中心服务器做增量备份<br/><br/>#!/bin/sh<br/><br/># This script does personal backups to a rsync backup server. You will end up<br/># with a 7 day rotating incremental backup. The incrementals will go<br/># into subdirectories named after the day of the week, and the current<br/># full backup goes into a directory called &quot;current&quot;<br/># tridge@linuxcare.com<br/><br/># directory to backup<br/>BDIR=/home/$USER<br/><br/># excludes file - this contains a wildcard pattern per line of files to exclude<br/>EXCLUDES=$HOME/cron/excludes<br/><br/># the name of the backup machine<br/>BSERVER=owl<br/><br/># your password on the backup server<br/>export RSYNC_PASSWORD=XXXXXX<br/><br/><br/>########################################################################<br/><br/>BACKUPDIR=`date +%A`<br/>OPTS=&quot;--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --delete --backup --backup-dir=/$BACKUPDIR -a&quot;<br/><br/>export PATH=$PATH:/bin:/usr/bin:/usr/local/bin<br/><br/># the following line clears the last weeks incremental directory<br/>[ -d $HOME/emptydir ] &#124;&#124; mkdir $HOME/emptydir<br/>rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/<br/>rmdir $HOME/emptydir<br/><br/># now the actual transfer<br/>rsync $OPTS $BDIR $BSERVER::$USER/current<br/><br/>2、备份至一个空闲的硬盘<br/><br/>#!/bin/sh<br/><br/>export PATH=/usr/local/bin:/usr/bin:/bin<br/><br/>LIST=&quot;rootfs usr data data2&quot;<br/><br/>for d in $LIST; do<br/>&nbsp;&nbsp;&nbsp;&nbsp; mount /backup/$d<br/>&nbsp;&nbsp;&nbsp;&nbsp; rsync -ax --exclude fstab --delete /$d/ /backup/$d/<br/>&nbsp;&nbsp;&nbsp;&nbsp; umount /backup/$d<br/>done<br/><br/>DAY=`date &quot;+%A&quot;`<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>rsync -a --delete /usr/local/apache /data2/backups/$DAY<br/>rsync -a --delete /data/solid /data2/backups/$DAY<br/><br/>3、对vger.rutgers.edu的cvs树进行镜像<br/><br/>#!/bin/bash<br/><br/>cd /var/www/cvs/vger/<br/>PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin<br/><br/>RUN=`lps x &#124; grep rsync &#124; grep -v grep &#124; wc -l`<br/>if [ &quot;$RUN&quot; -gt 0 ]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp; echo already running<br/>&nbsp;&nbsp;&nbsp;&nbsp; exit 1<br/>fi<br/><br/>rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog<br/><br/>sum1=`sum $HOME/ChangeLog`<br/>sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`<br/><br/>if [ &quot;$sum1&quot; = &quot;$sum2&quot; ]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp; echo nothing to do<br/>&nbsp;&nbsp;&nbsp;&nbsp; exit 0<br/>fi<br/><br/>rsync -az --delete --force vger.rutgers.edu::cvs/ /var/www/cvs/vger/<br/>exit 0<br/><br/>4、利用find的一种巧妙方式javascript:%20void(0);<br/><br/>rsync -avR remote:&#039;`find /home -name &quot;*.[ch]&quot;`&#039; /tmp/<br/><br/>可以用这种方法列出需要备份的文件列表——这种方法似乎比较少人用到。<br/><br/>五、参考资料：<br/><br/>1、http://rsync.samba.org/<br/>2、rsync examples<br/>3、rsync FAQ
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 用rsync对网站进行镜像备份]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>