linux rsync详解

http://www.moncleronlinemarts.com/2011/04/linux-rsync1/

官网主页

http://www.samba.org/rsync/

Rsync: 有史以来最好的备份系统

http://blog.chinaunix.net/u1/58969/showart_461524.html

rsync 服务器架设方法 v0.1b (正在修订中)

http://www.linuxsir.org/main/?q=node/256

Backing up your files with rsync(参考一下英文文档,会显得比较有档次,哈哈)

http://articles.slicehost.com/2007/10/9/backing-up-your-files-with-rsync

测试环境

下面的测试有2台机器组成:

1虚拟机(OS:cenos5.4) 172.16.251.241 做源服务器

2 free服务器(OS:freebsd8.0)172.16.251.45 做目标服务器

文档写于2010.8.21

什么是rsync

Rsync 是一个小巧的算法的强大实现。

它最基本的功能是高效地镜像一个文件系统的能力。使用 rsync,可以灵活地选用一组网络协议,诸如 nfs、smb 或 ssh,方便地让一个文件系统与另一个文件系统保持同步更新。

Rsync 的第二个功能,也就是备份系统使用的功能,它可以把已经发生改变或是被删除的文件的老的版本归档。Rsync 的功能太多了,不可能在这里一一叙述,笔者强烈建议读者阅读 rsync.samba.org 上的资料来研读 rsync。

结论:1我们一般只使用第一种同步复制文件的功能,这个功能最大的用处就是备份,他的最大优点就是:

1)只备份改变的文件,因此备份速度特别快,而scp是不具备这样功能的。

2)不用架设rsync服务器,只需要一个ssh自动登陆,一个cron, 就可以做到异地定时备份,比tar打包然后scp传输方便很多!

3)支持被覆盖和删除的文件存档,任何文件的历史记录都能找到

2也可能会用到镜像的功能,这样主服务器一旦当掉,马上启用备服务器的镜像文件

3 用于发布源代码

Svn的服务器将源代码检出到本地,然后用手动操作一个rsync脚本,同步到生产环境的nfs服务器上去。

通常的备份策略

1每日定时直接执行rsync脚本,同步主服务器和备份服务器

2然后每周定时执行脚本,调用tar命令 , 在备份服务器上打包归档。(这步可以不做,因为rsync可以保留被覆盖或者被删除的文件)

安装rsync

Centos一般都是自带的

而free下需要安装 , whereis rsync找到位置 , 然后port安装即可

基本的rsync语法

用man rsync看到各种命令详细解释

语法是这样的:和scp很类似,scp –r /backup [email protected]:/etc

rsync –av /backup [email protected]:/etc

1rsync [OPTION]… SRC [SRC]… DEST

2 rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST

3rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST

4rsync [OPTION]… SRC [SRC]… rsync://[USER@]HOST[:PORT]/DEST

5rsync [OPTION]… SRC

6rsync [OPTION]… [USER@]HOST:SRC [DEST]

7rsync [OPTION]… [USER@]HOST::SRC [DEST]

8rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]

可以看到:1我们可以在源服务器上执行rsync, 也可以在目标服务器执行rsync都是可以的, 我个人的喜欢是在目的也就是备份的服务器上执行的rsync

2 第5个的意思是

Usages with just one SRC arg and no DEST arg will list the source files

instead of copying.

这个命令最大的好处在于可以计算你要复制的文件有哪些,可以对比复制以后的文件数量,看是否复制成功,后面解释

3 :和::的区别在于,前者利用系统自带的ssh 等传输,而::是利用rsync 服务器的协议来传输。

当然, ::模式和rsync://[USER@]HOST[:PORT]/模式是等效的

例子:最常用的复制-av 最好记的参数,av ,大家都知道这个词

我想把虚拟机(OS:cenos5.4) 172.16.251.241的内容拷贝到free服务器(OS:freebsd8.0)172.16.251.45上

登陆到172.16.251.45上 进入/root 是没有bashshell这个文件夹的

在目标服务器172.16.251.45上执行以下命令

rsync -av -e ssh [email protected]:/root/bashshell /root/bashshell 2> /root/rsync_error

1以上的句子用的是第6种语法,将远端主机172.16.251.241的:/root/bashshell 上的内容拷贝到本地主机的/root/bashshell 上

2 参数

-a, –archive

This is equivalent to -rlptgoD. It is a quick way of saying you

want recursion and want to preserve almost everything (with -H

being a notable omission). The only exception to the above

equivalence is when –files-from is specified, in which case -r

is not implied.

Note that -a does not preserve hardlinks, because finding multi-

ply-linked files is expensive. You must separately specify -H.

-a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;

这个参数又叫“归档”,不过我觉得应该叫做“all”,因为他就是把文件连同全部属性一起拷贝走了

v显示详细拷贝过程

av通常是必备的!!!

-e ssh指定使用ssh方式 ,如果不用这个参数也可以复制,默认的就是ssh,还可以设定端口

-e ‘ssh -p 30000′: this ensures rsync uses the SSH protocol and sets the port.

3 2> /root/rsync_error

显示错误的日志

为了避免将日志文件删除,(后面说到—delete参数) ,请不要将这个日志文件放到要拷贝的文件夹下面 ,也就是说2> rsync_error是不行的。

4以上句子实际上存在问题的

因为最后生成的结果是这样

/root/bashshell/bashshell 多出一个bashell文件夹了

为什么呢,因为 系统判断:我复制的是一个叫做bashshell的文件夹,因此我会在目标服务器,新建路径/root/bashshell (不管这个路径是否存在),然后在这个路径下 新建文件夹 bashell ,然后将其内部数据全部复制,这样形成了/root/bashshell/bashshell

正确的写法 :目标路径只需要写为/root即可。

其实这个问题是linux固有性质,你mv /root/bashshell /

打开根目录一看,实际上还是存在/bashshell。

因为移动的是“文件夹”bashshell , 而不是里面的文件。

这点需要小心!!!!

5如果复制单个文件的话,是不会自动新建目标的路径的,比如我复制文件123到目标/root/test下面,但是/root/test这个路径是不存在的,那么需要事先手动新建好,这个问题也要注意!!

问题:现在我要求目标数据和源的数据完全一致的,怎么办? –delete参数

首先搞清楚几件事,对于源服务器文件的删除,修改和增加,同步以后是怎么处理的?

1 如果源机器修改了文件 ,那么rsync应该怎么处理

答案:应该目标机器和源机器文件内容一致,即目标机器的那个文件会被覆盖为最新的同名文件

源机器有一个123的文件

[root@CentOS5-4 bashshell]# cat 123

11111

执行rsync同步,这时候目标机器123也应该为11111

然后修改源机器

[root@CentOS5-4 bashshell]# cat 123

22222

再次执行 rsync , 目标机器也会变成22222

[root@free /tmp]# cat bashshell/123

22222

2第二个问题:源服务器增加了文件,同步会怎么做?

源服务器新增了一个touch文件

执行rsync以后

目标服务器出现了123文件

3第三个问题:源服务器删除了文件,目标服务器怎么做?

比如源服务器删除了xxxwenjian

Rm xxx

但是执行rsync以后,目标服务器是不会删除这个文件的

问题就在这里,如果想要删除这个文件,必须加—delete参数

结论:如果想要源和目标同步,也就是目标和源一样,那么必须增加—delete参数

小心:用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除。千万当心了!!

问题:如果我想保留—delete删除或者修改过的文件,方便以后寻找怎么办?用—-backup –backup-dir=`date +%Y-%m-%d`

用—backup可以解决2个问题:

1 delete会删除源服务器没有,而目标服务器上有的文件,应该如何保留这些文件

2 源服务器修改了文件,但是现在更新了文件。

一旦同步,目标服务器会更新成和源服务器一样最新的文件,但是现在我想保留原来的老版本的文件怎么办?

用backup一切都可以得到解决

测试1:首先同步 ,然后源服务器删除了文件xxx

执行

[root@free /tmp]# rsync -av –delete –backup –backup-dir=`date +%Y-%m-%d` [email protected]:/root/bashshell /tmp 2> /root/rsync_error

[email protected]′s password:

receiving file list … done

deleting bashshell/xxx

bashshell/

可以看到 文件xxx被删除了

但是可以在这里找到这个文件,2010-08-20就是=`date +%Y-%m-%d` 生成的文件夹

[root@free /tmp]# ls /tmp/2010-08-20/bashshell/xxx

/tmp/2010-08-20/bashshell/xxx

–backup-dir=`date +%Y-%m-%d` 会在DEST也就是/tmp下生成对应的日期文件,用来存在删除的数据!!!

如果一小时同步一次的话,可以使用更加详细的date模式。

[root@free /tmp]# date ‘+%Y-%m-%d-%H’

2010-08-20-10

这里的10代表早上10点

测试2 保存修改以后的文件

源服务器上的文件123

[root@CentOS5-4 bashshell]# cat 123

111

现在修改里面内容为222

执行同步

[root@free /tmp]# rsync -av –delete –backup –backup-dir=`date +%Y-%m-%d` [email protected]:/root/bashshell /tmp 2> /root/rsync_error

[email protected]′s password:

receiving file list … done

bashshell/123

会显示123传输的字样,目的服务器上123会被覆盖为新的123,内容为222

查看目标服务器上的123文件

[root@free /tmp]# cat bashshell/123

222

但是原来的文件123 ,也就是内容为111的, 会被存档在这里!!

[root@free /tmp]# cat /tmp/2010-08-20/bashshell/123

111

结论:以下结构比较完美了

rsync -av –delete –backup –backup-dir=`date +%Y-%m-%d` [email protected]:/root/bashshell /tmp 2> /root/rsync_error

可以实现目标绝对和源保持一致,还可以将修改删除的文件保存下来,避免以后需要时候找不到

问题:如果一个文件一天修改多次,但是因为rsync只同步一次,最多一天只能保存一个修改的版本,所以利用rsync监视每一个文件修改的版本是不现实的。他的作用只是尽最大可能的备份。

最好还是用svn来保存每个文件的修改版本。

问题: 我想得到详细的rsync同步过程日志内容怎么办?

加上一句1>>/tmp/`date +%Y-%m-%d`.log 可以得到每次同步的详细信息

我因为一天备份一次 ,以上语句够用了

如果每小时或者不定时备份的话

最好加上小时分秒 这样更加直观 可以知道具体什么时间做的

研究下man date即可得知怎么写

问题:想要rsync自动登陆服务器怎么办?

通常我们rsync都是不同机器之间备份,如果同一个机器,还需要备份吗?

现在的问题是 ,每次执行rsync都必须输入密码,手动同步倒是无所谓,但是如果要自动同步,也就是写到cron每天同步一次怎么办,必须实现自动输入密码

实现自动登陆的方法很多种:

1 利用ssh的自动登陆方法,两边保留钥匙,这个办法最简单方便的,但是安全性存在问题,因为就算你登陆用户密码无论怎么改,客户机也能登陆上去,非常牛逼,所以最好登陆用户为一般用户。

2 expect脚本自动输入,很麻烦。

3 在要访问的那台机器建立rsync服务器,然后用自定义的密码文件访问。

也就是使用 –password-file 这个参数,登陆远端的rsync服务器,这个也很麻烦

一般都是用第一种办法:详细的参看笔记ssh那章

以下是过程:

1 在客户端生成密钥

目的机器登陆源机器,所以目的机器为客户端,在这台机器产生密钥,首先我目的机器是free服务器,不是很重要的,所以设置的操作用户为root即可

这台机器是 freebsd,但是 ,生成密钥的命令的和linux一样

下面可以看到,公匙被自动保存到了/root/.ssh/id_rsa.pub

验证文件被保存到了 /root/.ssh/id_rsa

[root@free /tmp]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

ea:9d:50:94:85:33:3a:01:ae:98:1f:f1:bd:17:6f:24 [email protected]

The key’s randomart image is:

+–[ RSA 2048]—-+

| .. .. |

| . . +o |

| . . ooo |

| o + .o. |

|o o . ..E . |

| . . + = |

| . + . o |

| . + o |

| . o |

2

2将公匙拷贝到服务器登陆那个用户的家目录下

~/.ssh/id_rsa.pub [email protected]:/home/yjwan

这里我为了安全起见,并不想客户端登陆源服务器的时候,用root密码,所以我准备用一个一般用户 yjwan , 作为登陆的用户,你可以建立一个,因此,我把公共密钥拷贝到了/home/yjwan下

3很重要的一步

在源服务器上操作,在用户yjwan家目录下建立 .ssh文件夹 ,进入这个文件夹,并且将上一级的那个id_rsa.pub内容写入到authorized_keys文件

[root@CentOS5-4 yjwan]# pwd

/home/yjwan

[root@CentOS5-4 yjwan]# mkdir .ssh

[root@CentOS5-4 yjwan]# cd .ssh

[root@CentOS5-4 .ssh]# cat ../id_rsa.pub >>authorized_keys

4在客户端也就是目标服务器上 ,测试一下 是否大功告成了

[root@free /tmp]# rsync -av –delete –backup –backup-dir=`date +%Y-%m-%d` [email protected]:/home/yjwan /tmp 2> /root/rsync_error

我用yjwan登陆的 [email protected] 复制的是:/home/yjwan 因为yjwan用户对这个路径必定有读取权限

执行这个命令以后,passwd的字样不会弹出,直接开始同步了。可以证明 ,不用输入密码 ,也可以传输文件了

你可能感兴趣的:(linux,脚本)