[ rsync 实现网站的备份,文件的同步,不同系统的文件的同步,如果是 windows 的话,需要 windows 版本 cwrsync ]
rsync,remote synchronize 顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync 是用 “rsync 算法” 提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过 ssh 方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
rsync 包括如下的一些特性:
架设 rsync 服务器比较简单,写一个配置文件 rsyncd.conf 。文件的书写也是有规则的,我们可以参照 rsync.samba.org 上的文档来做。当然我们首先要安装好 rsync 这个软件才行。
1. 获取rsync
rysnc 的官方网站:http://rsync.samba.org/ 可以从上面得到最新的版本。目前最新版是 3.1.2。当然,因为 rsync 是一款如此有用的软件,所以很多 Linux 的发行版本都将它收录在内了。
2. 软件包安装
sudo apt-get install rsync # 在debian、ubuntu 等在线安装方法
yum install rsync # Fedora、Redhat 等在线安装方法
rpm -ivh rsync # Fedora、Redhat 等rpm包安装方法
其它 Linux 发行版,请用相应的软件包管理方法来安装。
3. 源码包安装
tar -zxvf rsync-xxx.tar.gz
cd rsync-xxx
./configure --prefix=/usr ;make ;make install
注:在用源码包编译安装之前,您得安装 gcc 等编译开具才行
rsync 的主要有以下三个配置文件 rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器显示信息)
1. 服务器配置文件( /etc/rsyncd.conf ),该文件默认不存在,请创建它
具体步骤如下(以 root 身份创建吧~):
sudo mkdir /etc/rsyncd
sudo touch /etc/rsyncd/rsyncd.conf #创建rsyncd.conf,这是rsync服务器的配置文件
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
sudo touch /etc/rsyncd/rsyncd.secrets #创建rsyncd.secrets ,这是用户密码文件
chmod 600 /etc/rsyncd/rsyncd.secrets #将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功
touch /etc/rsyncd/rsyncd.motd
password file must not be other-accessible
2. 修改 rsyncd.conf
rsyncd.conf 是 rsync 服务器主要配置文件。我们先来个简单的示例,后面在详细说明各项作用。
比如我们要备份服务器上的 /home/hadoop5/file1,在 /home 中我想把 file2 和 softwares 目录排除在外;
vim /etc/rsyncd/rsyncd.conf
# Distributed under the terms of the GNU General Public License v2
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsyncd/rsyncd.secrets
motd file = /etc/rsyncd/rsyncd.motd
port = 873
address = 10.6.3.43
# uid = nobody
# gid = nobody
uid = hadoop5
gid = hadoop5
use chroot = no
read only = yes
#limit access to private LANs
hosts allow=10.6.3.32 10.6.3.33 10.6.3.36 10.6.3.48
hosts deny=*
# max connections = 0
#This will give you a separate log file
log file = /var/log/rsync.log
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[file1]
path = /home/hadoop5/file1
list=yes
ignore errors
auth users = hadoop5
comment = This is Zephyr's Blog
exclude = file2/ softwares/
注:关于 auth users 是必须在服务器上存在的真实的系统用户,如果你想用多个用户以 “,” 号隔开,比如auth users = hadoop5,root
3. 设定密码文件
密码文件格式很简单,rsyncd.secrets 的内容格式为:
用户名:密码
我们在例子中 rsyncd.secrets 的内容如下类似的;在文档中说,有些系统不支持长密码,自己尝试着设置一下吧。
vim /etc/rsyncd/rsyncd.secrets
添加如下:
hadoop5:hadoop5
修改属主和修改权限 (若已经是了,就无需修改了)
chown root.root /etc/rsyncd/rsyncd.secrets
chmod 600 /etc/rsyncd/rsyncd.secrets
4. 设定 rsyncd.motd 文件
它是定义 rysnc 服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等;类似 ftp 服务器登录时,我们所看到的 linuxsir.org ftp ……。 当然这在全局定义变量时,并不是必须的,你可以用#号注掉,或删除;我在这里写了一个 rsyncd.motd的内容为:
vim /etc/rsyncd/rsyncd.motd
自定义添加如下:
++++++++++++++++++++++++++++++++++++++++++
Welcome to Zephyr's Blog!
++++++++++++++++++++++++++++++++++++++++++
在 rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;
pid file = /var/run/rsyncd.pid #告诉进程写到 /var/run/rsyncd.pid 文件中;
port = 873 # 指定运行端口,默认是873,您可以自己指定;
address = 10.6.3.43 #指定服务器IP地址
uid = hadoop5
gid = hadoop5
Note:服务器端传输文件时,要发哪个用户和用户组来执行,默认是 nobody。 如果用 nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。有时候为了方便,可以用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。笔者在这里就用了 hadoop5 用户就 OK 了。
use chroot = no
Note:用 chroot,在传输文件之前,服务器守护程序在将 chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync 服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;笔者这里采用的是默认的 no 吧。
read only = yes
Note:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only 选项,自己尝试是做什么用的吧。
#limit access to private LANs
hosts allow=10.6.3.0/255.255.255.0
或者
hosts allow=10.6.3.32 10.6.3.33 10.6.3.36 10.6.3.48
Note:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;
max connections = 10
Note:客户端最多连接数
motd file = /etc/rsyncd.motd
/etc/rsyncd/rsyncd.motd 内容如下:
++++++++++++++++++++++++++++++++++++++++++
Welcome to Zephyr's Blog!
++++++++++++++++++++++++++++++++++++++++++
Note:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。
log file = /var/log/rsync.log
Note:rsync 服务器的日志;
transfer logging = yes
Note:这是传输文件的日志
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以 [name] 形式。这个名字就是在rsync 客户端看到的名字,其实有点像 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的
下面是前面配置文件模块的例子:
#模块它为我们提供了一个链接的名字,在本模块中链接到了 /home/hadoop5/file1 目录;要用[name] 形式
[file1]
#指定文件目录所在位置,这是必须指定的
path = /home/hadoop5/file1
#认证用户是hadoop5,是必须在服务器上存在的用户
auth users = hadoop5
#list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes
list=yes
#忽略IO错误
ignore errors = true
#注释可以自己定义
comment = This is Zephyr's Blog
exclude = file2/ softwares/
注:exclude是排除的意思,也就是说,要把 /home/hadoop5/ 目录下的 file2 和 softwares 排除在外; file2/ 和 softwares/ 目录之间有空格分开。
Note: 可以添加多个 模块。更多关于解释的请参考:rsync 服务器
启动rsync服务器相当简单,有以下几种方法
当 rsync 作为 daemon 运行时,它需要一个用户身份。如果你希望启用 chroot,则必须以 root 的身份来运行 daemon,监听端口(1024以下,默认 873),或设定文件属主;如果不启用 chroot,也可以不使用 root 用户来运行 daemon,但该用户必须对相应的模块拥有读写数据、日志和 lock file 的权限。综上,还是以 root 权限启动 rsync 服务进程吧!
1. 在 10.6.3.43 的主机上以 root 身份启动 rsync :
/usr/bin/rsync --daemon
/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf #--config用于指定rsyncd.conf的位置,如果在/etc下可以不写
2. 在 10.6.3.43 上查看相应进程:
sudo lsof -i :873
1. 修改 services 加入如下内容
sudo vim /etc/services
添加如下:
rsync 873/tcp # rsync
rsync 873/udp # rsync
这一步一般可以不做,通常都有这两行(我的 CentOS6.5 默认有)。修改的目的是让系统知道873端口对应的服务名为rsync。如没有的话就自行加入。
2. 设定 /etc/xinetd.d/rsync
sudo vim /etc/xinetd.d/rsync
上述, 主要是要打开 rsync 这个 daemon, 一旦有 rsync client 要连接时, xinetd会把它转接给 rsyncd(port 873)。
3. service xinetd restart 使上述设定生效.
sudo service xinetd restart
sudo lsof -i :873
4. rsync服务器和防火墙
Linux 防火墙是用iptables,所以我们至少在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
iptables -L 查看一下防火墙是不是打开了 873端口
如果你不太懂防火墙的配置,可以先 service iptables stop
将防火墙关掉。当然在生产环境这是很危险的,做实验才可以这么做哟!
在配置完 rsync 服务器后,就可以从客户端发出 rsync 命令来实现各种同步的操作。rsync 有很多功能选项,下面就对介绍一下常用的选项:
1. rsync的命令格式可以为:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
sync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
2. rsync 有六种不同的工作模式:
3. rsync中的参数:
-a 以archive模式操作、复制目录、符号连接 相当于-rlptgoD -r 是递归 -l 是链接文件,意思是拷贝链接文件; -p 表示保持文件原有权限; -t 保持文件原有时间; -g 保持文件原有用户组; -o 保持文件原有属主; -D 相当于块设备文件; -z 传输时压缩; -P 传输进度; -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档; -e ssh的参数建立起加密的连接。 -u 只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时 --progress是指显示出详细的进度情况 --delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致 --password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了
例如在某一个 rsync 的客户端上(比如 10.6.3.48 上) 的 hadoop5 用户上使用 rsync 客户端进行检验,则先 创建密码文件。
cd /home/hadoop5/
echo hadoop5 > rsyncd.secrets
chmod 600 rsyncd.secrets
该密码文件的内容和 rsync 服务器上的 /etc/rsyncd/rsyncd.secrets 文件中的密码是一样的才行。
1. 列出 rsync 服务器上的所提供的同步内容
rsync --list-only 10.6.3.43:: // 需要输入密码且输入的密码并不回显,输好就回车
或
rsync --list-only --password-file=/home/hadoop5/rsyncd.secrets 10.6.3.43::
注:前面是 rsync 所提供的数据源,也就是我们在 rsyncd.conf 中所写的 [file1] 模块。而“This is Zephyr’s Blog”是由 [file1] 模块中的 comment = This is Zephyr’s Blog 提供的;为什么没有把rhel4opt数据源列出来呢?因为我们在[rhel4opt]中已经把list=no了。
下面笔者都将采用 --password-file=/home/hadoop5/rsyncd.secrets
的选项,省的人工手输入密码。
2. 列出 rsync 服务器上的所提供的同步 file1 内容
rsync --list-only --password-file=/home/hadoop5/rsyncd.secrets 10.6.3.43::file1
3. rsync客户端同步数据
如果只输入源地址,没有目的地址,则相当于列举 --list-only
,而不同步
rsync -avzP --password-file=rsyncd.secrets 10.6.3.43::file1 /home/hadoop5/file
只有指定了 DEST 的路径后,才会下载
rsync -avzP --password-file=/home/hadoop5/rsyncd.secrets 10.6.3.43::file1 /home/hadoop5/file1
这个命令的意思就是说,用 hadoop5 用户登录到服务器上,把 file1 数据,同步到本地当前目录 file1上。当然本地的目录是可以你自己 定义的。如果当你在客户端上当前操作的目录下没有 file1 这个目录时,系统会自动为你创建一个;当存在 file1 这个目录中,你要注意 它的写权限。如果只是写 file1 ,那么默认就是当前下的 file1 文件。
4. 客户端上的数据要与服务器端完全一致
rsync -avzP --delete --password-file=/home/hadoop5/rsyncd.secrets 10.6.3.43::file1 /home/hadoop5/file1
这回我们引入一个–delete 选项,表示客户端上的数据要与服务器端完全一致,如果 file1 目录中有服务器上不存在的文件,则删除。最终目的是让 file1 目录上的数据完全与服务器上保持一致;用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除;
5. 定时更新
vim /home/hadoop5/update-file1.sh
添加如下:
#!/bin/bash
rsync -avzP --password-file=/home/hadoop5/rsyncd.secrets 10.6.3.43::file1 /home/hadoop5/file1
crontab -e
输入以下一行:
0,30 * * * * /home/hadoop5/update-file1.sh
killall crond 注:杀死crond 服务器的进程;
ps aux |grep crond 注:查看一下是否被杀死;
/usr/sbin/crond 注:启动 crond 服务器;
1. 如何通过 ssh 进行 rsync,而且无须输入密码?
答:这个请参考 “Centos6.5下SSH免密码登陆配置”
2. 如何通过在不危害安全的情况下通过防火墙使用 rsync?
答:这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用 ssh,这时最好新建一个备份用户,并且配置 sshd 仅允许这个用户通过 RSA 认证方式进入。如果服务器在防火墙内,则最好限定客户端的 IP 地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防火墙打开 TCP 端口 22 的 ssh 外发连接就 ok 了。
3. 我能将更改过或者删除的文件也备份上来吗?
答:当然可以。你可以使用如:
rsync -other -options -backupdir = ./backup-2000-2-13 ...
这样的命令来实现。这样如果源文件: /path/to/some/file.c
改变了,那么旧的文件就会被移到 ./backup- 2000-2-13/path/to/some/file.c
,这里这个目录需要自己手工建立起来
4. 我需要在防火墙上开放哪些端口以适应 rsync?
答:视情况而定。rsync 可以直接通过 873 端口的 tcp 连接传文件,也可以通过 22 端口的 ssh 来进行文件传递,但你也可以通过下列命令改变它的端口:
rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:
5. 我如何通过 rsync 只复制目录结构,忽略掉文件呢?
rsync -av --include '*/' --exclude '*' source-dir dest-dir
6. 为什么我总会出现”Read-only file system”的错误呢?
答:看看是否忘了设 “read only = no”了
7. 为什么我会出现’@ERROR: invalid gid’的错误呢
答:rsync 使用时默认是用 uid=nobody; gid=nobody 来运行的,如果你的系统不存在 nobody 组的话,就会出现这样的错误,可以试试 gid = ogroup 或者其它
8. 绑定端口 873 失败是怎么回事
答:如果你不是以 root 权限运行这一守护进程的话,因为 1024 端口以下是特权端口,会出现这样的错误。你可以用 –port 参数来改变。
9. 为什么我认证失败——@ERROR: auth failed on module test ?
答:应该是没有以你的用户名登陆导致的问题,甚至是 rsync 上的用户没有相应的设置
10. 出现以下这个讯息, 是怎么一回事?
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
答:这是因为密码设错了, 无法登入成功, 请再检查一下 rsyncd.secrets 中的密码设定, 二端是否一致?
11. 出现以下这个讯息, 是怎么一回事?
password file must not be other-accessible
continuing without password file
Password:
答:这表示 rsyncd.secrets 的档案权限属性不对, 应设为 600。请下 chmod 600 rsyncd.secrets
12. 出现以下这个讯息, 是怎么一回事?
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
答:这通常是您的 rsyncd.conf 中的 path 路径所设的那个目录并不存在所致.请先用 mkdir开设好备份目录.
13. 是不是只能以 root 才能启动 rsync 服务?
答:当然不是了,具体可以参考 附录中
网上大部分教程都是讲关于 root 权限的 rsync 服务。但官网上讲是可以非 root 权限下运行 rsync 服务。笔者也尝试了下,几次失败后也成功了。大体试验环境如下:
IP 地址 | 用户名 | rsync 角色 | 所有相关配置文件位置 | 是否开启 rsync |
---|---|---|---|---|
10.6.3.43 | hadoop5 | Server | /home/hadoop5/softwares/rsyncd | 是 |
10.6.3.32 | hadoop5 | Client | /home/hadoop5/softwares/rsyncd | 否 |
10.6.3.33 | hadoop5 | Client | /home/hadoop5/softwares/rsyncd | 否 |
10.6.3.36 | hadoop5 | Client | /home/hadoop5/softwares/rsyncd | 否 |
10.6.3.48 | hadoop5 | Client | /home/hadoop5/softwares/rsyncd | 否 |
以下操作是在 10.6.3.43 的 hadoop5 用户上完成
1. 创建 rsyncd 目录及配置文件
mkdir -p /home/hadoop5/softwares/rsyncd
touch /home/hadoop5/softwares/rsyncd/rsyncd.conf
touch /home/hadoop5/softwares/rsyncd/rsyncd.secrets
touch /home/hadoop5/softwares/rsyncd/rsyncd.motd
chmod 600 /home/hadoop5/softwares/rsyncd/rsyncd.secrets
2. 配置 rsyncd.conf
pid file = /home/hadoop5/softwares/rsyncd/rsyncd.pid
lock file = /home/hadoop5/softwares/rsyncd/rsync.lock
secrets file = /home/hadoop5/softwares/rsyncd/rsyncd.secrets
motd file = /home/hadoop5/softwares/rsyncd/rsyncd.motd
log file = /home/hadoop5/softwares/rsyncd/rsync.log
port = 1873
address = 10.6.3.43
uid = hadoop5
gid = hadoop5
use chroot = no
read only = yes
hosts allow=10.6.3.32 10.6.3.33 10.6.3.36 10.6.3.48
hosts deny=*
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[file1]
path = /home/hadoop5/file1
list=yes
auth users = hadoop5
ignore errors = true
comment = This is Zephyr's Blog exclude = file2/ softwares/
3. 配置 rsyncd.secrets
hadoop5:hadoop5
4. 配置 rsyncd.motd
++++++++++++++++++++++++++++++++++++++++++
Welcome to Zephyr's Blog!
++++++++++++++++++++++++++++++++++++++++++
5. 启动 rsync 服务
/usr/bin/rsync --daemon --config=/home/hadoop5/softwares/rsyncd/rsyncd.conf
6. 检验服务是否启动
ps -ef | grep rsync
netstat -ntpl
lsof -i :1873
7. 在某一个客户端 (10.6.3.48) 上检验
mkdir -p /home/hadoop5/softwares/rsyncd
touch /home/hadoop5/softwares/rsyncd/rsyncd.secrets
chmod 600 /home/hadoop5/softwares/rsyncd/rsyncd.secrets
echo hadoop5 >> /home/hadoop5/softwares/rsyncd/rsyncd.secrets
rsync -avzP --port=1873 --password-file=/home/hadoop5/softwares/rsyncd/rsyncd.secrets \
hadoop5@10.6.3.43::file1 /home/hadoop5/file1