注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

唐老鸭的博客

太多的不如意让我们学会了抱怨,却忘记怎么去努力改变现状.

 
 
 

日志

 
 
 
 

Linux rsync  

2011-02-25 17:29:29|  分类: linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

做系统维护,数据备份的重要性怎么强调都不过分,因此一款好用的备份工具是必不可少的,我独爱rsync,速度快、安全、高效,接下来我就介绍如何配置通rsync同步备份服务器。

一般来说,一台linux服务器安装之后,直接用rysnc命令就就可以备份,但这仅仅是client,我们现在要做的是建立一台专门的备份服务器来接收客户端的备份数据,所以我们需要配置rsync服务器,让它常驻系统,通常有2种方法,自身的daemon功能和通过xinetd守护,但是无论哪种方法,都需要一个配置文件/etc/rsyncd.conf,需要我们自己创建。

客户端约定:
客户端1:test1.host1.com(192.168.0.1)
客户端2:test2.host2.com(192.168.0.2)

服务器端约定:
服务器ip:192.168.0.100
rsync配置文件:/etc/rsyncd.conf
备份文件存储主目录:/home/backup
客户端1数据存储目录:/home/backup/test1.host1.com
客户端1数据存储目录:/home/backup/test2.host2.com

接下来的操作,都是在备份服务器上进行的。

第一步,我们还是先检查一下系统是否安装了rsync。


?

1
2

[root@backup ~]
# rpm -q rsync
rsync
-2.6.8-3.1

看来我的系统已经安装了,如果你没安装,请执行下面的命令。


?

1

[root@backup ~]
# yum -y install rsync

第二步,创建/etc/rsyncd.conf文件,内容如下。


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#主要全局参数
uid           = root
gid           = root
use chroot    =
yes
                
#为了安全考虑,让rsync运行于chroot环境
log
file
     
=
/var/log/rsyncd
.log
#rsync的日志文件
pid
file
     
=
/var/run/rsyncd
.pid
#rsync的pid文件
hosts allow   = 192.168.0.0
/24
     
#允许访问的网络(我还推荐你在系统防火墙里也要设置)
hosts deny    = *                  
#除了允许的之外,默认禁止访问
 
 
#为每个客户端服务器专门配置
[test1.host1.com]
comment = backup
for
test1.host1.com
path =
/home/backup/test1
.host1.com
read
only = no
hosts allow = 192.168.0.1
 
 
[test2.host2.com]
comment = backup
for
test2.host2.com
path =
/home/backup/test2
.host2.com
read
only = no
hosts allow = 192.168.0.2

保存退出,如果你需要更多配置参数,请参照man rsyncd.conf

第三步,准备备份数据的存储目录


?

1

[root@backup ~]
# mkdir -p /home/backup/{test1.host1.com,test2.host2.com}

注:如果你需要备份2层以上的主目录,比如/var/lib/mysql/,最好事先在备份服务器上把要备份的多层主目录创建好。


?

1

[root@backup ~]
# mkdir -p /home/backup/test1.host1.com/var/lib/mysql

第四步,各种东西准备好了,现在我们该启动rsync了,2种方法,你任选一种。

1.使用rsync的–daemon选项启动,rsync服务默认使用873号端口。


?

1
2
3
4
5

[root@backup ~]
# rsync --daemon
[root@backup ~]
# lsof -i:873
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
rsync
  
3464 root    3u  IPv6  11515       TCP *:
rsync
(LISTEN)
rsync
  
3464 root    4u  IPv4  11516       TCP *:
rsync
(LISTEN)

可以看到rsync已经启动成功了。如果你要把他添加到开机启动,可以通过/etc/rc.local文件,执行如下命令即可。


?

1

[root@backup ~]
# echo '/usr/bin/rsync --daemon' >> /etc/rc.local

如果你需要终止它,执行


?

1
2
3

[root@backup ~]
# pkill rsync
[root@backup ~]
# lsof -i:873
[root@backup ~]
#

可以看到已经关闭了。但是很多用户可能希望,像别的程序一样通过启动脚本/etc/init.d/xxxx来启动或者终止服务会更方便,由于篇幅太长,我在后面的博文中再介绍(rsync启动脚本)。

2.xinetd守护
修改/etc/xinetd.d/rsync文件,把


?

1

disable =
yes

改成


?

1

disable = no

然后重启xinetd即可,


?

1

[root@backup ~]
# /etc/init.d/xinetd restart

如果你的xinetd开机并没自动启动的话,需要执行


?

1

[root@backup ~]
# chkconfig xinetd on

第五步,到此为止,rsync服务器端已经完成了,接下来,我们以客户端test1.host1.com(192.168.0.1)为例,试试如何同步文件。注意,该步操作时在客户端服务器上进行的。
约定:
备份脚本路径:/root/bin/backup.sh
需要备份的目录:/etc/ /home/

1.创建一个简单的备份脚本/root/bin/backup.sh,内容如下。


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#!/bin/sh
#command
rsync
=
/usr/bin/rsync
echo
=
/bin/echo
 
 
#backup server info
remote_host=192.168.0.100
remote_path=test1.host1.com
 
 
#backup
backup_path=
"/etc/ /home/"
for
path
in
$backup_path;
do
    
date
=`
date
"+%D %H:%M:%S"
`
    
$
echo
"--- Start Backup $path $date ----"
    
$
rsync
-av --delete $path $remote_host::$remote_path$path
    
date
=`
date
"+%D %H:%M:%S"
`
    
$
echo
"--- End Backup $path $date ----"
done
exit
0

2.好了,我们来执行一下看看备份情况。


?

1
2
3
4
5
6
7
8

[root@test1 ~]
# /root/bin/backup.sh
--- Start Backup
/etc/
02
/22/11
09:48:36 ----
building
file
list ...
done
created directory
/etc
传送的每个文件的详细信息省略......
sent 2960717 bytes  received 1828 bytes  658343.33 bytes
/sec
total size is 2954407  speedup is 1.00
--- End Backup
/home/
02
/22/11
09:50:20 ----

已经备份完毕了,你可以去备份服务器上去看看备份情况了。

到此为止,一个简单的rsync同步备份服务器的配置和备份测试都已经OK了,可是要是你的服务器是通过公网备份的话,就是很危险的,接下来我再说明一下如何用ssh来加密我们备份数据的传输。

第六步,通过ssh加密传输。
约定:备份服务器在初期状态是通过密码认证登录的并且root可以登录。

1.接下来的操作是在客户端上进行的,我们还是以test1.host1.com(192.168.0.1)为例。


?

1
2
3
4
5
6
7
8
9
10

[root@test1 ~]
# ssh-keygen -t rsa
Generating public
/private
rsa key pair.
Enter
file
in
which
to save the key (
/root/
.
ssh
/id_rsa
):直接回车
Created directory
'/root/.ssh'
.
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:
94:b7:51:5e:6b:6b:01:81:b2:e1:a6:6b:e8:56:a2:8c root@test1.host1.com

然后,把公钥通过scp复制到备份服务器(192.168.0.100)上去。


?

1
2
3
4
5
6
7

[root@test1 ~]
# scp ~/.ssh/id_rsa.pub 192.168.0.100:/root/.ssh/
The authenticity of host
'192.168.0.100 (192.168.0.100)'
can't be established.
RSA key fingerprint is 3c:fe:7e:0a:35:79:a2:cf:13:55:ba:87:8b:62:e5:cb.
Are you sure you want to
continue
connecting (
yes
/no
)?
yes
Warning: Permanently added
'192.168.0.100'
(RSA) to the list of known hosts.
root@192.168.0.100's password:
id_rsa.pub                                    100%  404     0.4KB
/s
  
00:00

修改前面我们创建的backup.sh文件,在第5行后追加2行:


?

1
2

ssh
=
/usr/bin/ssh
key=
/root/
.
ssh
/id_rsa

把第16行


?

1

$
rsync
-av --delete $path $remote_host::$remote_path$path

改成


?

1

$
rsync
-av -e
"$ssh -i $key"
--delete $path $remote_host::$remote_path$path

2.接下来的操作在备份服务器端进行的,把刚刚复制到备份服务器的公钥追加到/root/.ssh/authorized_keys末尾。


?

1

[root@backup ~]
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

?

1

[root@backup ~]
# chmod 600 /root/.ssh/authorized_keys

3.最后,通过1和2小步将所有客户端的公钥都上传到备份服务器上之后,我们修改/etc/ssh/sshd_config
文件,禁止使用密码登陆。这一步也是在备份服务器上进行的。


?

1

PasswordAuthentication
yes

改成


?

1

PasswordAuthentication no

重启sshd


?

1

[root@backup ~]
#/etc/init.d/sshd restart

好了,现在你可以在你客户端执行备份脚本来备份了,如果你再加上crontab计划任务来执行,那么就更方便了。
比如我们追加每天早上4点30分备份,并把备份过程的信息和错误信息记录到/var/log/backup.log,那么修改/etc/crontab文件,追加如下一行。


?

1

30 04 * * * root
/root/bin/backup
.sh >>
/var/log/backup
.log 2>&1

当然如果时间长了,日志文件/var/log/backup.log会很大,可以通过logrotate来管理日志,我将在以后的博文中介绍如何用logrotate来管理日志文件。

注1:可能有人会发现,一遍一遍的在各个客户端上生产公钥和密钥,然后把公钥复制到备份服务器上去,
而为什么不在备份服务器上生产公钥和密钥,然后把私钥复制到客户端去呢?这样当然也是可以的,但是所有的客户端都是用同一套密钥和公钥认证,安全性降低了。同样我还推荐你定期更换密钥和公钥对。

注2:关于备份脚本你可以根据你自己的需求去完善,而且rsync的功能远不止这点。比如有的人想把/etc每天都备份,保存一个星期的,这样我们可以先在本地创建一个专门的备份目录/backup,以星期为前缀打包/etc,然后再把备份目录上传到备份服务器上。


?

1
2
3
4
5
6

#backup for /etc
OLDLANG=$LANG
export
LANG=
"us_EN.UTF-8"
weekday=`
date
+
"%A"
`
$
tar
-czvf
/backup/
${weekday}.etc.
tar
.gz
/etc
export
LANG=$OLDLANG

注3:由于备份服务器打开了root登录功能,建议你在防火墙里设置只能是客服端和管理端的ip可以连接22号端口。

注4:如果你总觉的打开了root登录还是危险,那么我们再在备份服务器端做如下限制,让rsync用root登录时只能执行我们允许的命令。

修改/etc/ssh/sshd_config


?

1

PermitRootLogin
yes

改成


?

1

PermitRootLogin forced-commands-only

然后重启sshd

创建一个检查命令是否允许的脚本/root/.ssh/checkcmd.sh,内容如下:


?

1
2
3
4
5
6
7

#!/bin/sh
if
[[
"$SSH_ORIGINAL_COMMAND"
=~
"rsync\ --server*"
]]
then
    
$SSH_ORIGINAL_COMMAND
else
    
echo
"Reject"
fi

给脚本添加执行权限:


?

1

[root@backup ~]
# chmod u+x /root/.ssh/checkcmd.sh

然后修改/root/.ssh/authorized_keys文件,在对应客户端的公钥前面追加选项,
还是以test1.host1.com(192.168.0.1)的公钥为例。


?

1

from=
"192.168.0.1"
,
command
=
"/root/.ssh/checkcmd.sh"
ssh
-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnqQu4xg9EGa2+U30N7QKQsPjTr3FFGFKB
/lzJVJ4fAtwUiNRtWjtMdJy9SRJ4YQm83y6IO1exwT3O2zWbsU4RiteeZ21jgCK/ELQcjYNhwyD
+xk2ECKxN5qk8ugeuQxYofm0nDDDStyChcu7si0hpGCZSQBYpEx2oO+623iSzVurqfQEUexY2qf9SS+vHSZTxodwwIxhF70YJDSem+sc2QsJ7MnH
/PQrCVlN1rnZ7zPFJjFa5t6IFCEBMy/0G02c07tiy/JGpHCA77dv4TzZmcgD61TQfD8zuXRToe55eEFdG3pSdchT49dAzZk1GvBV52Et5N9jSXpmW2kaFWNWwQ
== root@test1.host1.com

Tag after backup, rsync, ssh

  评论这张
 
阅读(955)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018