本地环境是Windows,一些数据都是使用Git同步Linux服务器上,但由于我修改文件的频率过高,用起来就很难受:( 经过一番探索后,决定使用rsync进行数据同步,运行原理见一位前辈的分析。使用下来感觉方便了不少,还可以通过脚本实现定时同步,定时备份,很实用的一个软件。

安装Linux服务端

yum install rsync
systemctl start rsyncd

由于CentOS库版本较低,所以编译安装,官网下载最新版本后解压,编译所需环境见文档

tar -zxvf rsync-3.2.3.tar.gz
cd rsync-3.2.3
./configure --prefix=/etc/rsync --disable-ipv6 --disable-xxhash --disable-lz4
make && make install

添加环境变量:

ln -s /etc/rsync/bin/rsync /usr/bin/rsync

rsync有两种验证方式,一种是SSH认证,灵活性较高,只需要安装rsync就行了,不需要修改配置文件,另一种是rsync-daemon方式,默认使用873/tcp端口,若使用这种方式,需要修改如下配置文件:

vi /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

uid=root
gid=root
max connections=4
# port=873
# log file=/var/log/rsync.log
pid file=/var/run/rsync.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# hosts allow=*

[demo]
path=/home/demo
# auth users = root
secrets file=/etc/rsyncd.passwd
read only = no
comment = sync files

创建验证文件

vi /etc/rsyncd.passwd

添加用户和密码,如root:111,修改之后修改文件权限

chmod 600 /etc/rsyncd.passwd

启动rsync:

/etc/rsync/bin/rsync --daemon --config=/etc/rsyncd.conf

安装Windows客户端

下载cwRsync,之后添加环境变量以便使用rsync命令时识别Windows下的盘符路径,密码文件和服务端一致。

同步命令

常用参数如下:

-a 归档模式,使用递归传输并保持文件的属性
-v 显示传输过程
-z 传输中进行压缩,提高传输速度,文本文件建议使用
-u 增量更新
-e 指定使用ssh方式进行数据同步

--port=[端口号] 指定rsync服务端口
--delete 删除目标目录中有而源目录中没有的文件

将本地/local/path/中的文件同步备份到远程/remote/path/目录,path末尾的/表示拷贝当前目录下的文件,而不是拷贝当前的目录。

通过SSH方式:

rsync -avu -e "ssh -p [端口号]" /local/path/ user@ip:/remote/path/

通过sync-daemon方式:

rsync -avu /local/path/ user@ip::demo --password-file=rsync.password

*我测试ssh方式时出现以下错误,未能解决QAQ

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(228) [Receiver=3.2.3]
rsync: [sender] safe_read failed to read 4 bytes: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(276) [sender=3.2.3]

*2020.11.13更新:
后来又尝试apt安装rsync为3.1.2版本,为避免可能存在的问题,Windows上也下载了相应的版本,再次尝试通过SSH同步,出现错误:

dup() in/out/err failed
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.2]

在Stack Overflow上发现了相同的问题,是由于SSH的版本不匹配,因为我同时还安装了Git,就直接调用了Git的ssh导致报错,解决办法是指定使用rsync的SSH:

rsync -avu -e "./ssh -p [端口号]" /local/path/ user@ip:/remote/path/

然后又用最新版本测试了下,成功同步。

不过同步之后发现文件的权限不对...毕竟跨平台传输,权限方式也不一样,查阅后发现可以使用--chmod设置权限,既然chmod都可以用,我又顺便试了下--chown,也可以成功指定所有者,这下所有问题就基本解决了。

rsync -avu --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r --chown=user:group -e "./ssh -p [端口号]"  /local/path/ user@ip:/remote/path/

Tags: rsync

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.