rsync经典用例总结

rsync是经典的数据传输工具,但本篇博客总结的既不细致,也不全面。惭愧,惭愧。。。

更新策略

  • rsync默认通过比较文件修改时间(Modify)和大小进行启发式更新
  • 策略验证
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
    mkdir /tmp/{a,b}
    # 文件内容不同,大小相同
    echo a >/tmp/a/index.html
    sleep 1
    echo b >/tmp/b/index.html
    # touch -d "2019-08-27 11:35:00" /tmp/{a,b}/*
    # 访问时间不同
    touch -ad "2019-08-27 11:35:00" /tmp/a/index.html
    touch -ad "2019-08-27 11:36:00" /tmp/b/index.html
    # Modify时间相同,change时间不同
    touch -md "2019-08-27 11:35:00" /tmp/a/index.html
    sleep 1
    touch -md "2019-08-27 11:35:00" /tmp/b/index.html
    stat /tmp/{a,b}/*
    # rsync没有覆盖
    rsync -avzP /tmp/a/index.html /tmp/b/index.html
  • 干预策略的参数:
    • –size-only: 仅比较文件大小
    • –ignore-times或-I:无脑覆盖
    • –checksum或-c: 忽略时间,检查大小,大小相同时比较MD5
    • –whole-file或-w:禁用rsync delta算法,源和目的文件不同时,传输整个文件

备份更新

1
rsync -avzP -b --suffix=$(date "+.bak%Y%m%d%H%M%S") --backup-dir=/data/backup/  ${src}  ${dst}
  • 备份目录下如果存在同名文件会被新的备份文件强制覆盖
  • -b –suffix 既适用推送也适用于拉取,但是都是在dest侧备份
  • -b –backup-dir 仅适用于拉取,推送数据时适用会报错
  • 另外mv命令也有备份实现方案alias mv='mv -v -b -S "$(date "+.mvbak%Y%m%d_%H%M")"'

递归创建目录

1
rsync -avzP -R src dest
  • -R 参数会在dest目录基础上递归创建src目录路径,如rsync -avzP -R 10.0.0.1::data/data/test1/test2/test3 /data/test,在本地会生成路径/data/test/data/test1/test2/test3

慎用–delete

1
2
3
4
5
6
7
8
9
10
rsync -avzP --delete 10.0.0.1::data/data/test /data/test        //该种写法会在/data/test下再创建一层test目录,不会删除/data/test的其它目录

rsync -avzP --delete 10.0.0.1::data/data/test/ /data/test //该种写法会将本地/data/test目录下的文件与src目录强一致
的效果是截然不同的,自己体会下。细思极恐。。。

另外,
rsync -avzP --delete 10.0.0.1::data/data/test/ /data/test

rsync -avzP --delete 10.0.0.1::data/data/test/* /data/test //该种写法会将src目录下的子文件和目录和本地/data/test中的同名子文件和目录进行强一致,本地/data/test中的其它文件目录不会被删除
的效果也不同,使用时要十分谨慎。

安全相关

相关配置解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use chroot = yes                    # rsync守护进程将在与客户机的文件传输之前chroot到“path”
numeric ids = no # 启用此参数将禁用当前守护程序模块按名称映射用户和组
read only = yes # 禁用上传
write only = yes # 禁用下载
list = yes # 是否显示模块名
fake super = yes # 允许rsync进程不以root运行而存储文件的完整属性,从rsync-3.1.2版本开始,关闭该属性,将本地root所属文件推至远端时,会报错:`rsync: chgrp xxx failed: Operation not permitted (1)`,也可通过去掉-a参数消除报错。rsync-3.0.9不存在此问题。
secrets file = /etc/rsyncd.secrets # 权限600
reverse lookup = yes # 日志中是否记录反向解析结果
forward lookup = yes # 日志中是否记录正向解析结果
[data] # rsync中允许定义多个同名模块,最后加载的模块配置会覆盖之前定义的配置
uid = root
gid = root
path = /
exclude = * 策略优先级:"filter" > "include from" > "include" > "exclude from" > "exclude"
# 限制到子目录权限层级
include = data data/test data/test/shouldAllow*** # 等同于 filter = + data + data/test + data/test/shouldAllow*** - *
auth users = root guest
hosts allow = 10.0.0.0/8 192.168.0.0/16 # 开启hosts allow后会默认deny所有白名单以外的客户端IP
&include /etc/rsyncd.d # 顺序加载/etc/rsyncd.d/*.conf
&merge /etc/rsyncd.d # 顺序加载/etc/rsyncd.d/*.inc
  • rsync配置文件中如果出现多个重复模块定义,会merge到一起,也就是说在上一个模块中定义的配置如果在下一个同名模块中没有被覆盖依然生效
  • merge 引入的子配置文件的起始内容认为是引入位置所在模块的局部配置,include引入的子配置文件的起始内容认为是引入位置之后的全局配置
  • rsync不是按格式区分全局配置还是局部配置,在出现模块定义之前的配置是全局配置,在出现模块定义之后出现的配置都属于这个模块
  • 安全提醒:配置文件权限没有限制,建议应设置成600
  • 如果在子配置文件中定义全局配置如read only = yes 对于&include之前已经出现过的模块不生效
  • &include不支持跟多个文件,如: &include /etc/rsyncd.d/a.conf /etc/rsyncd.d/b.conf
  • 如果使用&include引入子配置,子配置文件不存在时会导致rsync服务不可用,错误信息:rsync: safe_read failed to read 1 bytes [Receiver]: Connection reset by peer (104) (code 12)

rsync认证

  • RSYNC_PASSWORD仅适用于rsync协议,rsync配置中指定的用户密码,rsync服务需要通过daemon方式启动;

    1
    export RSYNC_PASSWORD="passwd"
  • rsync协议使用的两种方式

    • rsync 协议
      1
      2
      rsync rsync://username@1.2.3.4:/abc /def
      rsync 1.2.3.4::abc/ /def
    • ssh 协议
      1
      rsync 1.2.3.4:/abc/ /def
      • 仅适用rsync客户端,通过ssh协议传输

rsync 日志

  • transfer logging

    1
    transfer logging = yes
    • 配置文件中开启transfer logging,可以使rsync使用ftp格式的文件来记录下载和上载操作在单独的日志文件中
  • log format 格式定义符

1
2
3
4
5
6
7
8
9
10
11
12
13
%h 远程主机名
%a 远程IP地址
%l 文件长度字符数
%p 该次rsync会话的进程id
%o 操作类型:"send"或"recv"
%f 文件名
%P 模块路径
%m 模块名
%t 当前时间
%u 认证的用户名(匿名时是null)
%b 实际传输的字节数
%c 当发送文件时,该字段记录该文件的校验码
默认log格式为:"%o %h [%a] %m (%u) %f %l",通常,在每行的头上会添加"%t [%p] "。

配置文件范例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# cat /etc/rsyncd.conf
address = 10.0.0.1
uid = root
gid = root
use chroot = yes
numeric ids = no
read only = no
max connections = 100
pid file = /var/run/rsyncd.pid
log file = /var/log/rsync.log
lock file = /var/run/rsync.lock

transfer logging = yes

[data1]
uid = nobody
gid = nobody
path = /data
hosts allow = 10.0.0.0/8 192.168.0.0/16

[data2]
uid = nobody
gid = nobody
path = /
exclude = *
include = data1/***
hosts allow = 10.0.0.0/8 192.168.0.0/16

[data]
uid = nobody
gid = nobody
comment = data
path = /
exclude = *
include = data1/***
read only = false
list = false
hosts allow = 10.0.0.0/8 192.168.0.0/16

参考