rsync 文件同步命令使用
一、rsync介绍
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录。
Rsync 是用于取代rcp的一个工具,Rsync使用所谓的 “Rsync 算法” 来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。您可以参考 How Rsync Works A Practical Overview 进一步了解 rsync 的运作机制。
Rsync 的初始作者是 Andrew Tridgell 和 Paul Mackerras,它当前由http://rsync.samba.org维护。
Rsync的基本特点如下:
- 可以镜像保存整个目录树和文件系统;
- 可以很容易做到保持原来文件的权限、时间、软硬链接等;
- 无须特殊权限即可安装;
- 优化的流程,文件传输效率高;
- 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
- 支持匿名传输,以方便进行网站镜像。
在使用
rsync
进行远程同步时,可以使用两种方式:远程Shell
方式(建议使用ssh
,用户验证由 ssh 负责)和C/S
方式(即客户连接远程rsync
服务器,用户验证由rsync
服务器负责)。无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。
rsync
在首次复制时没有速度优势,速度不如tar
,因此当数据量很大时您可以考虑先使用tar
进行首次复制,然后再使用rsync
进行数据同步。
二、服务器信息
腾讯云轻量应用服务器
- CPU:2核
- 内存:4G
- 外存:SSD 80G
- 带宽:8M
- 流量:1200G/月(只算出流量)
- 系统:Ubuntu 20.04.3 LTS
三、服务器安装服务
通常来说服务器都自带了rsync
服务,可使用rsycn --version
命令检测软件是否纯在,如没有可使用如下命令安装。
1 | sudo apt-get install rsync |
四、rsync启动配置
4.1 写配置文件
- 首先要选择服务器启动方式
- 对于负荷较重的
rsync
服务器应该使用独立运行方式 - 对于负荷较轻的
rsync
服务器可以使用xinetd
运行方式
- 对于负荷较重的
- 创建配置文件
rsyncd.conf
- 对于非匿名访问的
rsync
服务器还要创建认证口令文件
4.2 以xinetd
方式启动
xinetd是一个超级守护进程
xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。
xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。
本服务器采用的启用方式
4.2.1 安装xinetd
如果在/etc/
下没有xinetd.d
目录,则没安装xinetd
,需要执行一下命令安装。
1 | sudo apt-get install xinetd |
4.2.2 配置xinetd使rsync开始工作
安装完毕后,创建/etc/xinetd.d/rsync
配置文件,并且编辑
1 | sudo touch /etc/xinetd.d/rsync |
1 | service rsync |
:wq
退出保存。
4.2.3 启动rsync作为使用xinetd的守护进程
1 | sudo vim /etc/default/rsync |
主要修改:RSYNC ENABLE=inetd,使用xinetd启用
4.2.4 添加专门管理备份文件夹目录的用户rsyncAdmin
1 | sudo useradd -d /home/rsyncDir -m rsyncAdmin |
这样就在home目录生成rsyncDir,并且由rsyncAdmin管理。
4.2.5 创建 /etc/rsync/rsyncd.conf 配置rsync使其在
1 | sudo touch /etc/rsync/rsyncd.conf |
编辑里面的内容为:
1 | # 管理备份目录的用户 |
4.2.6 创建 /etc/rsync/rsyncd.secrets 配置用户名和密码.
1 | sudo vim /etc/rsync/rsyncd.secrets |
注意用以下格式命名虚拟用户名和密码
<user_name>:<password>
保存退出后设置好权限:
1 | sudo chmod 600 /etc/rsync/rsyncd.secrets |
4.2.7 启动
1 | sudo /etc/init.d/xinetd restart |
检查是否开始监听端口:
1 | netstat -an | grep 873 |
若有信息输出且显示LISTEN,则正在监听
检查是否能连接使用
1 | rsync lab@xxx.xxx.xxx.xxx::lab_backup # 然后输入之前设定的密码 |
有目录列出则成功
4.2.8 腾讯云服务器开放端口
在添加规则
处添加873的tcp端口。
4.3 独立运行 rsync 服务
最简单的独立运行 rsync 服务的方法是执行如下的命令:
1 | /usr/bin/rsync --daemon |
此方式启动需要修改/etc/default/rsync
文件,允许--daemon
启动:
RSYNC_ENABLE=false
改为RSYNC_ENABLE=true
否则在启动时报错:
1 | rsync daemon not enabled in /etc/default/rsync, not starting... ... (warning). |
五、客户端使用
5.1 Mac OS动安装rsycn
因为mac系统自带的rsycn版本比较古老,需要安装新一点版本的,这里采用手动编译安装的方式。
截止2022/3/11版本最新,若有更新版本,则需要修改下述中curl
链接中的版本号
随便打开一个工作目录,例如家目录/home/User
1 | cd ~; |
软件最终安装在/usr/local/bin
目录下,而原系统预安装的在/usr/bin
下
使用/usr/local/bin/rsync --version
即可验证是否安装陈工
为了方便直接使用rsync命令,可在~/.bashrc
或者~/.zshrc
加入
1 | alias rsync /usr/local/bin/rsync |
然后source ~/.bashrc
或~/.zshrc
。
因为最后的安装脚本没有考虑到需要删除原来Mac OS X自带的rsync.1 man
文件,所以需要删除旧版本的man文件。
1 | sudo rm /usr/share/man/man1/rsync.1.gz |
5.2 Ubuntu安装rsycn
1 | sudo apt-get install rsycn |
5.3 本地“推”上服务器
5.3.1 语法1:
rsync [OPTION …] [SRC] [USER]@[HOST]::[DEST] …
rsync命令 参数选项 [本机路径] [虚拟用户]@[主机地址]::[模块名]…
5.3.2 语法2:
rsync [OPTION …] [SRC] rsync://[USER]@[HOST]/[DEST] …
rsync命令 参数选项 [本地路径] rsync://[虚拟用户]@[主机地址]/[模块名]..
5.3.3 用法举例
1 | rsync -avzP --delete --exclude "*.DS_Store" . lab@175.178.73.244::lab_backup/实验室文件 |
注: 这个命令的意思就是说,用lab用户登录到服务器上,把当前文件夹中的数据,同步到服务器目录实验室文件/
下。当服务器没有实验室文件/
这个目录时,系统会自动创建一个;当存在实验室文件/
这个目录中,要注意它的写权限。并且文件本地对服务器要完全一致(本地删了服务器也要删除对应文件),排除本地*.DS_Store
文件。
参数:
- -a 参数,相当于
-rlptgoD
,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件; - -z 传输时压缩;
- -P 传输进度;
- -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档
- –delete 表示服务器端上的数据要与客户端完全一致
- –exclude “.DS_Store” 排除本地`.DS_Store`文件
5.4 服务器“拉”回本地
5.4.1 语法1:
rsync [OPTION…] [USER@]HOST::SRC… [DEST]
rsync命令 参数选项 [本机路径] [虚拟用户]@[主机地址]::[模块名]…
5.4.2 语法2:
rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]
rsync命令 参数选项 [本地路径] rsync://[虚拟用户]@[主机地址]/[模块名]..
注意–delete要慎用!!!我试过因为路径没写好的问题删了自己本地的一堆文件,幸好git救了我。血的教训啊!
六、OPTION参数说明
1 | -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。 |
七、定时忘服务器同步
7.1 MAC OS
7.1.1 运行cron
1 | sudo /usr/sbin/cron start |
运行后有cron: cron already running, pid: 1169
显示。
7.1.2 创建密码文件
1 | mkdir /Users/<Username>/.rsync |
7.1.3 创建定时任务
1 | crontab -e |
保存退出,crontab: installing new crontab
则成功加入列表。
crontab -l
查看列表。
语义:每天凌晨0点10分打开目标路径后执行同步服务器指令
7.1.4 大坑
百分号问题
1 | man 5 crontab |
Percent-signs (%) in the command,
unless escaped with backslash (\), will be changed into newline charac-
ters, and all data after the first % will be sent to the command as
standard input.
大概意思是说
在cron文件的第六列,也就是命令列
百分号(%)被赋予了特殊含义
被看做是换行符,而且,其后面的内容被当做命令的标准输入
所以,要想正常使用百分号(%)的功能
需要在其前面添加转义符(\)
环境变量问题
Unix/Linux下使用crontab时的运行环境已经不是用户环境了,因此原本用户下的一些环境变量的设置就失效了。
/etc/crontab
文件定义的系统cron
环境变量,默认的PATH
是/sbin:/bin:/usr/sbin:/usr/bin
在写脚本的时候,最好加上:
1 | #!/bin/bash |
cron权限问题
在设置里“完全磁盘访问权”加上cron
软件,在/usr/sbin
下。
7.2 Ubuntu 20.04 TLS
7.2.1 运行cron
1 | 安装:apt-get install cron |
运行后有* cron is running
显示。
7.2.2 创建密码文件
1 | mkdir ~/.rsync |
7.2.3 创建定时任务
1 | # 第一次使用crontab -e会提示选择编辑器,用vim.basic |
保存退出,crontab: installing new crontab
则成功加入列表。
crontab -l
查看列表。
语义:每天晚上10点10分打开目标路径后执行同步服务器