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

安装 Linux 服务端

# CentOS
yum install rsync
systemctl start rsyncd
# Debian
apt install rsync

由于 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 端口,若使用这种方式,需要修改如下配置文件:

vim /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

创建验证文件

vim /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/