本地环境是 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/
如果你认为这篇文章还不错,可以考虑支持作者。