博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rsync 同步
阅读量:6112 次
发布时间:2019-06-21

本文共 8303 字,大约阅读时间需要 27 分钟。

  hot3.png

1. rsync 介绍

1.1 rsync 是什么

  • rsync 可以用于实现增量的工具, 配合计划任务, rsync 可以实现时间即那个同步, 配合 inotify 或者 sersync 可以实现触发时实时同步.
  • rsync可以实现scp 远程拷(rsync 不支持远程到远程的拷贝, scp支持) cp的本地拷贝, rm删除和 ls -l 文件列表等等功能, 但是需要注意, rsync 最终目的是实现两端主机的文件同步, 因此实现 scp/cp/rm 等功能仅仅是同步的辅助手段.
  • rsync 的同步算法实现的机制较为复杂.

1.2 rsync 同步基本说明

  • rsync 目的是时间本地主机和远侧还给你主机的上的文件同步(包含本地推送到远程, 和远程拉取到本地), 也可以实现本地不同路径下的文件同步, 但不可以实现 远程1 到远程2 之间同步.
  • 就同步而言, 涉及到了源文件和目标文件的概念, 涉及了 那边是同步基准,即源端. 以及目的端.
  • rsync 文件同步过程有两个模式组成: 1. 决定那些文件需要同步, 2. 文件同步时的同步模式.
  1. 检查模式是指按照指定规则来检测那些文件需要同步, rsync 默认是采用 quick check 算法快速检查源文件和目标文件的大小, mtime(修改时间) 是否一致. 也可以通过rsync 中指定的某些选项,改变检查模式.
  2. 同步模式是指文件确定被同步后, 同步过程发生过程之前需要做哪些工作, 如: 是否需要删除源主机上没有但目标主机上的文件, 是否需要先备份目标文件, 是否追踪目标文件等操作.

2. rsync 工作方式

  • 下面是rsync 的语法:
Local:  rsync [OPTION...] SRC... [DEST]Access via remote shell:    pull:   rsync [OPTION...] [USER@]HOST:SRC... [DEST]    Push:   rsync [OPTION...] SRC...  [USER@]HOST:DESCAccess via rsync daemon:    Pull:   rsync [OPTION...] [USER@]HOST::SRC... [DEST]            rsync [OPTION...] sync://[USER]@HOST[:PORT]/SRC..  [DEST]    Push:   rsync [OPTION...] SRC... [USER@]HOST::DEST            rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

2.2 rsync 的三种工作方式

  1. 本地文件系统上的同步, 语法使用的是 Local段落内的.
  2. 本地主机上使用远程Shell 和远程主机通, 语法适用的是 Access via remote shell 段落的格式
  3. 本地主机通过网络套接字远程主机上的 rsync daemon , 语法使用的是 Access via rsync daemon: 段落.
  • 前两者使用的本质上是通过管道通信, 及远程shell , 方式3 是让远程主机上运行 rsync 服务, 监听在一个端口上, 等待客户端的连接
  • 存在第四种方式, 通过远程shell 临时启动一个 srync daemon, 不同于方式3 , 不要求远程主机上事前启动rsync, 而是临时派生rsync daemon, 单用途的一次性daemon, 用于临时读取 daemon 配置文件, 当本次rsync 同步完成后, 远程shell 的rsync daemon 进程也会自动消失, 通信方式语法与 Access via rsync daemon 相同, 但是要求 options指定使用 --rsh 选项或者 -e

第一个路径参数为源文件, 可以指定多个源文件, 最后一个为目标文件路径,

  • 如果主机和 path 路径之间使用一个冒号(:) 隔开表示使用远程 shell 通信方式

  • 如果主机和 path 另使用两个冒号(::) 隔开, 表示使用 rsync daemon 方式.

  • 注意: 原路径如果是一个目录的话, 尾部带上斜线/ 和不带上斜线的意义是不一样的, 带上斜线 表示: 备份该目录, 不带上斜线表示: 备份目录内的 文件和目录

2.3 选项和说明

常用选项:

-v:     verbose 显示详细信息, 可以使用 -vvvv 显示更加详细信息-P:     显示文件传出的进度信息(-P="=", --partial --progress. 其中 --progress 才是显示进度信息)-n:     --diy-run:  仅测试传输, 不实际传输, 常配合 -vvvv 配合使用使用查看 rsync 如何工作-a:     --archive:  归档模式, 表示递归传输 并保存文件属性, 等同于 -rtopgDl-r:     --recursive:    递归传输目录-t:     --times:    保存mtime 信息, 建议任何情况下都保存 -t, 否则会更新 mtime 设置为系统当前时间, 导致下次更新: 检查 mtime 不同, 而增量备份传输无效.-o:     --owner:    保持 owner 属主-g:     --group:    保持 group 属组-p:     --perms     保持 perms  权限-D:     --divice --specials 选项组合, 拷贝设备文件和特殊文件-l:     --links:    如果 目标文件时软连接, 拷贝时会追溯到链接的对象,-z:                 传输时进行压缩提高效率-R:     --relative: 使用相对路径, 意味将命令行中执行啊指定全路径非路径尾部的文件发给服务端, 包含属性.--size-only:        默认算法是检查文件大小和mtime 不同的问津,  该选项只检查文件大小.-u:     --update:   仅在源 mtime 比目标已存在文件的 mtime新时, 才会进行拷贝-d:     --dires:    不进行递归, 仅拷贝目录本身, --max-size:         限制 rsync 传出的最小文件大小, 禁止传输小文件或垃圾文件--exclude:          指定需要传输的文件-b:     --backup:   对目标已存在的文件备份, 备份文件会会使用 ~ 作为后缀--backup-dir:       指定给你别分文件保存路径, 不指定默认的带本分文件保存在同一个目录下.-e:                 指定使用的远程shell 程序, 默认是 ssh--port:             连接daemon 时 使用的远程端口,默认 873--password-file:    daemon 模式的密码文件, 可以读取密码文件非交互模式, 这不是远程 shell 密码文件, 而是 rsync 模块认证的密码.-W  --whole-file:   rsync 将不再使用 增量传输, 在网路带宽高于 磁盘带宽时, 比增量高效.--existing:         要求 只更新目标端已存在的文件, 和 --existing 结合使用特殊功能, --remove-source-files:  要求删除源端已成功传输的文件.

3. rsync 示例

  1. 安装 rsync

  2. rsync 同步tmp/rsync_test/a/ 目录下的文件备份 到 /root/a/

  1. 使用rsync 远程拷贝, 通过账户名密码(秘钥)和主机 拷贝

  1. 远程拷贝文件并 排除不想拷贝的文件, 删除目标目录下中 在源目录下没有的文件
  • 使用 -delete 删除目标目录中 不在源文件的文件

  1. 增量备份
  • a.txt 文件 被更新过, 这里仅备份别修改过的文件 使用

  • 备份 和查看

4. rsync daemon 模式

4.1 简介

  • rsync 虽然可以通过远程shell 能实现两端主机上的文件同步, 但是在处理复杂的传输 时较为复杂,

  • rsync daemon 是rsync --daemon 或者加上其他选项启动, 会读取配置文件, 默认是 /etc/rsyncd.conf 并监听 873 端口, 外部有客户端 对此端口发起请求, 通过这个网络套接字完成连接.

  • 远程shell 连接时通过管道符完成通信和数据传输, 连接的一端是远程主机, 连接到的目标端, 目标端根据shell 机型 fork 出rsync 进程使其成为 rsync server, 而rsync daemon 事先在 server 端运行好的 rsync 端的连接, 连接建立后所有通信方式都是通过套接字完成.

  • 连接命令由两种类型, 一种是rsync 风格是风格使用双冒号的 rsync user@host::src desc 一种是 url 风格rsync://user@host:port/src desc 对于 rsync 风格连接命令, 需要指定端口号, 则使用 --port

4.1 daemon 配置文件 rsyncd.conf

默认rsync --daemon 读取的配置文件为 /etc/rsync.conf, 有些版本的可能该文件默认不存在,

### 全局配置参数port = 873          # 指定 rsync 端口uid = rsync         # rsync 服务运行的用户, 文件传输成功后属主id为这个uidgid = rsync         # rsync 运行的用属组use chrot = no      # rsync daemon 传输前是否切换到指定给的 path 目录下max connections = 200   # 指定最大连接数timeout = 300           # rsync 连接的客户端超时时间, 0 表示永远等待motd file = /var/rsyncd/rsync.motc  # 客户端连接来显示的消息pid file = /var/run/rsyncd.pid      # rsync daemon 的 pid 文件lock file = /var/run/rsync.lock     # 指定锁文件log file = /var/run/rsyncd.log      # 指定 rsync 的日志文件syslogdont compress = *.gz *.tgz *.zip *.zip *.z *.Z *.rpm *.deb *.bz2    # 指定那些文件不使用压缩#### 指定模块, 并设定模块配置的参数, 可创建多个模块[web]               # 模块IDpath = /tmp/web/    #  该模块的路径, 启动 rsync daemon 前该目录必须存在, 该目录就是rsync 访问的路径ignore errors       # 忽略某些IO错误read only = false   # 指定该目录 是否为只读,  false 为读写, true 为只读 不可上传list = false        # 客户端请求显示模块是, 该模块是否显示, false 表示影藏hosts allow = 10.0.0.0/24   # 指定允许连接的客户端机器, 可以是网段, 或多个ip,iphost deny = 10.0.0.1/24     # 黑名单, 禁止某个ipauth users = rsync_backup   # 指定该模块的用户列表, 只有 列表内指定的用户才能连接到模块, 用户明和密码保存在 serts file 中secrets file = /rsyncd.passwd   # 保存 auth user 用户列表的用户和密码, 每行包含一个username:passowd , 由 "secrets modes",  默认 true 需要的文件非 rsync daemon 用户不可读写, 之启用 auth user 该选项有效[date]path = /tmp/data/ read only = falseignors = errorscomment = date directory
  1. 客户端推送到服务单时, 文件属主, 属组, 是配置文件中指定的uid 和 gid 但是客户端从服务器来去时, 文件属主, 属组都是 客户端操作 rsync 用户身份, 影刺 rsync 程序的用户是当前用户
  2. auth users 和 secrets 两行不是必要的, 如果没有的话, 默认是使用匿名连接, 如果使用了, 则 secrets file 权限必须是 600 , 客户端密码文件也必须是 600
  3. secrets file 权限, 实际上除了满足运行你rsync daemon用户可读, 还要检查 strict mode 设置, 如果设置 false 则无需关注文件权限

4.1 daemon 配置和使用

4.1.1 客户端配置

  1. 添加 rsync 用户,

  1. 编辑配置文件
[fangfc@node10009 a]$ sudo vim /etc/rsyncd.conf    # /etc/rsyncd: configuration file for rsync daemon mode    # See rsyncd.conf man page for more options.    # configuration example:    port = 873    uid = rsync    gid = rsync    use chroot = yes    max connections = 200    pid file = /var/run/rsyncd.pid    exclude = lost+found/    transfer logging = yes    timeout = 900    ignore nonreadable = yes    dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2    [data]    path = /opt/data/    ignore errors    list = false    read only = false    host allow = 192.168.20.0/24    auth users = user1, user2, fangfc    secrets file = /etc/rsyncd.passwd
  1. 创建密码文件
[fangfc@node10009 a]$ sudo vim  /etc/rsyncd.passwd    user1:123    user2:123    fangfc:123[fangfc@node10009 a]$ sudo chmod 600 /etc/rsyncd.passwd # 设置 密码文件权限
  1. 创建rsync 模块目录
  • 创建目录, 并设置权限
[fangfc@node10009 a]$ sudo mkdir /opt/data[fangfc@node10009 a]$ sudo chown -R rsync:rsync /opt/data/
  1. 启动rsync daemon
[fangfc@node10009 a]$ sudo rsync --daemon[fangfc@node10009 a]$ ps aux | grep rsyncroot       3732  0.0  0.0 114740   396 ?        Ss   14:06   0:00 rsync --daemonfangfc     3734  0.0  0.0 112704   976 pts/0    S+   14:06   0:00 grep --color=auto rsync[fangfc@node10009 a]$

4.1.2 客户端配置

  1. 添加rsync用户
[fangfc@node10011 a]$ sudo groupadd -r  rsync[fangfc@node10011 a]$ sudo useradd -N -M -G rsync -r -s /sbin/nologin  rsync[fangfc@node10011 a]$ id rsyncuid=996(rsync) gid=100(users) groups=100(users),994(rsync)
  1. 创建密码文件
[fangfc@node10011 a]$ [fangfc@node10011 a]$ sudo vim /etc/rsyncd.passwd    123
  1. 设置密码文件权限
[fangfc@node10011 a]$ sudo chmod 600 /etc/rsyncd.passwd [fangfc@node10011 a]$
  1. 设置配置文件
[date]use users = user1

4.2 测试

  • 客户端推送到服务端
[fangfc@node10011 a]$ sudo rsync -arv --port=873 --password-file=/etc/rsyncd.passwd  /home/fangfc/a/ fangfc@192.168.10.9::data/sending incremental file list./a.txtb.txtnginx/nginx/123.txtnginx/abc.txtnginx/fastcgi.confnginx/fastcgi_paramsnginx/koi-utfnginx/koi-winnginx/mime.typesnginx/nginx.confnginx/scgi_paramsnginx/uwsgi_paramsnginx/win-utfnginx/conf.d/nginx/conf.d/nginx.confnginx/default.d/sent 20,691 bytes  received 313 bytes  42,008.00 bytes/sectotal size is 19,608  speedup is 0.93[fangfc@node10011 a]$
  • 服务端修改了文件, 客户端拉取更新
[fangfc@node10009 a]$ lsa.txt  b.txt  nginx[fangfc@node10009 a]$ touch c.txt[fangfc@node10009 a]$ echo "abc" > b.txt [fangfc@node10009 a]$ lsa.txt  b.txt  c.txt  nginx[fangfc@node10009 a]$
  • 客户端拉取
[fangfc@node10011 a]$ sudo  rsync -avz --delete --password-file=/etc/rsyncd.passwd user1@192.168.10.9::data/  /home/fangfc/a/receiving incremental file list./b.txtc.txtsent 72 bytes  received 580 bytes  1,304.00 bytes/sectotal size is 19,612  speedup is 30.08[fangfc@node10011 a]$

END

转载于:https://my.oschina.net/nikoF/blog/2907370

你可能感兴趣的文章
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
linux系统安装的引导镜像制作流程分享
查看>>
解决ros建***能登录不能访问内网远程桌面的问题
查看>>
pfsense锁住自己
查看>>
vsftpd 相关总结
查看>>
bash complete -C command
查看>>
解决zabbix 3.0中1151端口不能运行问题
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
dubbo
查看>>
【Git入门之四】操作项目
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
高利率时代的结局,任重道远,前途叵测
查看>>
Debian 6.05安装后乱码
查看>>
欢迎大家观看本人录制的51CTO精彩视频课程!
查看>>
IntelliJ IDEA中设置忽略@param注释中的参数与方法中的参数列表不一致的检查
查看>>
关于软件开发的一些感悟
查看>>