一个计算机技术爱好者与学习者

0%

好好学Linux:rsync命令

1. rsync命令简介

rsync is an open source utility that provides fast incremental file transfer. rsync is freely available under the GNU General Public License and is currently being maintained by Wayne Davison.

rsync是一个开源的提供快速增量文件传输的工具。rsync使用GNU协议,当前维护者是Wayne Davison。

rsync是开源的增量传输工具,速度很快。基本原理是文件分块检查md5,相同就不再传输,不同就增量传输。
rsync可以代替本地拷贝命令cp,也可以代替远程拷贝命令scp。

参考文档:

2. 安装rsync

2.1. centos

1
yum install -y rsync

3. rsync命令说明

3.1. 命令格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#Local:
rsync [OPTION...] SRC... [DEST]

#Access via remote shell:
#Pull:
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
#Push:
rsync [OPTION...] SRC... [USER@]HOST:DEST

#Access via rsync daemon:
#Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
#Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST)

特别注意:

  • SRC目录后面加/,表示拷贝SRC中的内容到DEST目录中
  • SRC目录后面不加/,表示在DEST目录中新建一个SRC目录,然后SRC中的内容到DEST/SRC
  • DEST目录后加不加/不做区别

3.2. 常用参数

  • -v:显示传输的过程,-vvvv可以获取更详细信息
  • –partial:保留部分传输的文件,也就是实现断点续传功能
  • –progress:显示进度
  • -P:–partial 和 –progress的集合
  • -r:–recursive 对子目录以递归模式处理
  • -t:–times,保持mtime属性。
  • -o:–owner,保持owner属性
  • -p:–perms:保持perms属性(权限)
  • -g:–group:保持group属性(所属组)
  • –device:拷贝设备文件
  • –specials:拷贝特殊文件
  • -D:–device和–specials的集合
  • -l:–links 拷贝软链接,而非软链接指向的对象
  • -L:拷贝软链接,以及软链接指向的对象
  • -a:–archive 归档模式,对子目录以递归模式处理,并且保持文件属性。等同于-rtopgDl
  • -z:传输时进行压缩提高传输效率
  • –exclude:排除不需要传输的文件
  • –include:指定必须要传输的文件
  • -b:–backup 对目标上已存在的文件做一个备份,备份的文件名默认使用~做后缀
  • –backup-dir:指定备份文件的保存路径
  • -u:–update 仅在源mtime比目标mtime新时才拷贝
  • –delete:以SRC为主,对DEST进行同步。多则删,少则补。
  • –dry-run:模拟运行rsync,而不真正传输
  • e:指定要使用的远程shell程序,默认是ssh
  • existing:只更新目标端已存在的文件,目标端不存在的文件不传输
  • ignore-existing:只更新目标端不存在的文件,目标端存在的文件不传输
  • W:–whole-file 全量传输,而不是默认的增量传输
  • –bwlimit 限速,单位为KB/s

特别注意:

  • 不加-t参数,如果两个文件的md5相同,mtime不同,传输时会更改目标文件的mtime为当前时间,增量修改。
  • 加上-t参数,如果两个文件的md5相同,mtime不同,传输时会更改目标文件的mtime和源文件相同,增量修改。

更多内容参考 rsync文档

4. 使用rsync

4.1. 本地拷贝断点续传

需求:本地拷贝/opt/nginx目录中的所有文件,到/opt/nginx.bak,断点续传

1
rsync -P -avz /opt/nginx/ /opt/nginx.bak/

4.2. 远程拷贝断点续传

需求1:拷贝本地/opt/nginx目录中的所有文件,到远程服务器192.168.56.102:/opt/nginx目录中,断点续传

1
2
rsync -P -avz /opt/nginx/ 192.168.56.102:/opt/nginx/
rsync -P -avz -e 'ssh -p 2222' /opt/nginx/ 192.168.56.102:/opt/nginx/

注意:要提前配置好ssh免密登录,配置方法参考文档《shell命令之ssh》

需求2:拷贝远程服务器192.168.56.102:/opt/nginx目录中的所有文件,到本地/opt/nginx目录中,断点续传

1
rsync -P -avz 192.168.56.102:/opt/nginx/ /opt/nginx/

注意:如果想暂时结束rsync,稍后继续,请使用ctrl+C,而不是直接kill。
直接kill进程会导致断点续传失效(缓存文件来不及写入到目标文件),补救办法是把缓存文件重命名为目标文件,就可以断点续传了。

4.3. 后台运行rsync

后台运行rsync,最好使用screen而不是nohup。
如果使用nohup,那么在终端关闭后,rsync可能也会终止,报错:

1
2
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(638) [sender=3.1.2]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(504) [generator=3.1.2]

没有找到原因,因此就先避免nohup和rsync配合使用。

使用screen后台运行rsync示例:

1
2
3
4
screen rsync -P -avz --log-file=/path/to/rsync.log /opt/nginx/ /opt/nginx.bak/
# ctrl+A+D
screen -ls
screen -r 23500.ttys005.B000000349215A

screen详细说明参考文档《Linux后台运行脚本或程序》

4.4. 拷贝时限速

拷贝时,限速20MB/s

1
rsync -P -avz --bwlimit=20480 /data1/file.tgz /data2/

5. rsync偶发报错问题

5.1. 问题描述

执行命令:

1
rsync -P -avz -e 'ssh -o StrictHostKeyChecking=no' filename.tgz root@192.168.56.101:/opt/

偶发报错:

1
2
rsync: [sender] write error: Broken pipe (32)
rsync error: error in rsync protocol data stream (code 12) at io.c(848) [sender=3.2.7]

添加了 --timeout=1200 参数后,偶发报错:

1
2
deflate on token returned 0 (487 bytes left)
rsync error: error in rsync protocol data stream (code 12) at token.c(481) [sender=3.2.7]

5.2. 解决办法

直接传输,不压缩

1
rsync -P -av -e 'ssh -o StrictHostKeyChecking=no' filename.tgz root@192.168.56.101:/opt/

参考文档:error in rsync protocol data stream

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-linux-rsync/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~