参考地址:
[1]. rsync实现免密码操作的一种实现方式
[2]. rsync error: error in socket IO (code 10) at clientserver.c(128) [Receiver=3.1.1]
[3]. rsync的介绍和配置
[4]. Rsync同步过程中遇到的常见问题
一、Rsync 安装
服务端客户端都要安装
使用 yum 或 apt 安装
# yum 安装
yum -y install rsync
# apt 安装
sudo apt-get install rsync
二、Rsync 使用
# 提交 远程工作目录默认为用户主目录
rsync <local-file> <username>@<host>:<dir>
# 拉取
rsync <username>@<host>:<file> <local-dir>
# 将本机当前所在目录下的 file1 文件上传至目标机器的 /home/user/ 下
# 随后会提示输入密码
rsync ./file1 user@192.168.137.100:/home/user/
# 拉取文件
rsync user@192.168.137.100:/home/user/hello.c ./
2-1)无密码配置
上面的方法每次都要交互输入密码,很不方便,配置不输密码的方式:
1. 在服务端编辑配置文件 /etc/rsyncd.conf(服务端)
vim /etc/rsyncd.conf
uid = 1000
gid = 1000
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
secrets file = /etc/rsyncd.secrets
auth users = user # 认证用户 user1,user2,...
[share] # 模块名自定义
path = /home/user/share # 路径
read only = no
2. 编辑文件 /etc/rsyncd.secrets(服务端)
vim /etc/rsyncd.secrets
user:12345 # user:password
3. 以守护进程方式工作(服务端)
rsync --daemon --config=/etc/rsyncd.conf
4. 修改 /etc/secrets 权限(服务端)
chmod 600 /etc/secrets
5. 环境变量配置密码(客户端)
export RSYNC_PASSWORD=12345
# 全局环境变量配置
# 在末尾添加上面的内容
sudo vim /etc/profile
6. 无密码传输方式(客户端)
rsync file2 user@192.168.137.100::share
rsync user@192.168.137.100::share/hello.c ./
2-2)优化使用
2-2-1)主机名替代主机地址
每次输入都要使用地址,为这个地址设置别名(客户端)
vim /etc/hosts
# 添加一行
192.168.137.100 nfs
# 以后可以使用 nfs 代替 192.168.137.100
rsync file2 user@nfs::share
2-2-2)传输慢的问题
使用的时候,发现传输很慢,即使很小的文件都要5秒以上
原因1:服务端反向解析的原因
原因2:网络问题
# 在服务端做以下修改
vim /etc/hosts
# 添加客户端信息
192.168.137.102 nfs
至于网络问题,由于我的使用环境是一台 Win 主机,一台虚拟机,主机通过以太网外连接一台 Linux 主机,当时发现虚拟机把文件上传至 Linux 主机时,即使很小也非常慢,上面的方式虽然解决了一点,提速 30% 吧,但是问题还在。于是尝试 Linux 主机 ping 虚拟机时发现 ping 不通(虚拟机网段:192.168.197.xxx;Linux 主机网段:192.168.137.xxx),虚拟机能 ping 通 Linux 主机。在 Window 中我将虚拟机网卡和以太网建立一个网桥,让 Wifi 共享网络到这个网桥中,于是 Linux 主机和虚拟机都在一个网段上了,这时候去尝试上传文件,秒传。问题解决,over。
改进前:(197.131 -> 197.1 -> 137.1 -> 137.100)
改进后:(137.102 -> 137.1 -> 137.100)
三、其它
3-1)免密传输的第二种方式
在上面介绍的免密方法日常使用非常方便,但是笔者在使用 Visual Studio 进行远程 Linux 驱动开发时,生成的文件需要从虚拟机中传输到目标开发板的 Linux 系统中。起初尝试在 Makefile 中执行 rsync 之前去设置环境变量,但是依然要求输入密码,导致卡死。
于是笔者找到了第二种免密传输的方式。具体思路是,预先将密码保存在客户端的文件中,rsync 有一个参数可以从文件中读取密码。
这种方式的缺点是必须获取 root 权限
# 创建一个保存密码的文件(客户端)
vim /etc/rsyncd.passwd
# 将密码保存,只保存密码
123456
# 修改权限
chmod 600 /etc/rsyncd.passwd
# 传输命令如下
rsync --password-file=/etc/rsyncd.passwd hello.ko user@nfs::share