Linux下文件同步神器rsync

rsync的安装

1
yum install -y rsync

添加配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
max connection = 2
pid file = /var/run/rsyncd.pid
hosts allow = *
#hosts deny = *

[test]
path = /root/soft
auth user = rsync
read only = false
secrets file = /etc/rsyncd.secrets #密码文件

创建密码文件

1
2
vim /etc/rsyncd.secrets
rsync:rsync@123

启动

centos7下启动

1
systemctl start rsyncd

centos6下启动

1
rsync --daemon

centos6通过守护进程xinetd启动rsync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
yum install -y xinetd
vim /etc/xinetd.d/rsync
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
#vi /etc/service
#添加以下内容
rsync 873/tcp # rsync
#启动xinetd服务
/etc/init.d/xinetd start

客户端安装配置

1
2
3
4
5
6
7
#yum install -y rsync
#配置服务端指定的secrets file文件
#vi /etc/rsyncd.secrets
#format user:password
rsync:rsync@123

chmod 600 /etc/rsyncd.secrets

文件同步命令

1
rsync -avzP --password-file=/etc/rsyncd.secrets rsync@192.168.3.2::path $des_path

参数

  • -a 以递归方式传输文件,并保持文件属性。等于 -rtopgDl
  • -v 详细输出,显示输出信息
  • -z 压缩传输,添加–compress-level=2 2表示压缩级别
  • -P 显示同步的过程及传输时的进度等信息
  • –exclude= 指定排除不需要传输的文件
  • –exclude-from= 将要排除的文件写入一个文件,通过该参数指定可以排除文件内的文件
  • –delete 无差异同步,如果服务器上删除了,同步时也会删除本地

文件实时同步inotify-tools安装配置

安装

1
2
3
4
5
wget https://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz/download
tar -zxvf inotify-tools-3.13.tar.gz
./configure
make
make install

举例
实时监控/root/test目录变化,并调用rsync同步w文件到远程目录脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh

# get the current path
CURPATH=`pwd`

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
-e close_write /root/test | while read date time dir file; do

FILECHANGE=${dir}${file}
# convert absolute path to relative
FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`

#rsync --progress --relative -vrae 'ssh -p 22' $FILECHANGEREL usernam@example.com:/backup/root/dir && \

##同步的目录需注意,此处的$FILECHANGE是绝对路径,所以同步--relative参数是递归形势,不加此参数,所有文件包括子文件夹内的文件都会在同一级目录下
rsync --progress --relative -vzra --password-file=/etc/rsyncd.secrets $FILECHANGE rsync@192.168.3.2::test && \
echo "At ${time} on ${date}, file $FILECHANGE was backed up via rsync"
done