Total Pageviews

Thursday, 1 November 2012

rsync的参数详解

选项说明
-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,强制对文件传输进行校验
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
         
rsync foo/bar/foo.c remote:/tmp/
则在/tmp目录下创建foo.c文件,而如果使用-R参数:
rsync -R foo/bar/foo.c remote:/tmp/
则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。
-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
–backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, –links 保留软链结
-L, –copy-links 想对待常规文件一样处理软链结
–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
–safe-links 忽略指向SRC路径目录树以外的链结
-H, –hard-links 保留硬链结
-p, –perms 保持文件权限
-o, –owner 保持文件属主信息
-g, –group 保持文件属组信息
-D, –devices 保持设备文件信息
-t, –times 保持文件时间信息
-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, –dry-run现实哪些文件将被传输
-W, –whole-file 拷贝文件,不进行增量检测
-x, –one-file-system 不要跨越文件系统边界
-B, –block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, –rsh=COMMAND 指定替代rsh的shell程序
–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
–existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
–delete 删除那些DST中SRC没有的文件
–delete-excluded 同样删除接收端那些被该选项指定排除的文件
–delete-after 传输结束以后再删除
–ignore-errors 及时出现IO错误也进行删除
–max-delete=NUM 最多删除NUM个文件
–partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
–force 强制删除目录,即使不为空
–numeric-ids 不将数字的用户和组ID匹配为用户名和组名
–timeout=TIME IP超时时间,单位为秒
-I, –ignore-times 不跳过那些有同样的时间和长度的文件
–size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T –temp-dir=DIR 在DIR中创建临时文件
–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 –partial
–progress 显示备份过程
-z, –compress 对备份的文件在传输时进行压缩处理
–exclude=PATTERN 指定排除不需要传输的文件模式
–include=PATTERN 指定不排除而需要传输的文件模式
–exclude-from=FILE 排除FILE中指定模式的文件
–include-from=FILE 不排除FILE指定模式匹配的文件
–version 打印版本信息
–address 绑定到特定的地址
–config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
–port=PORT 指定其他的rsync服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=FORMAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息。
------------------------------------------------------

近段时间工作需要做了些scp和rsync的异地安全备份,整理了一下,希望多大家有用。

scp的备份指南:
需求:用scp自动完成异地文件的定时copy
难点:如何让异地主机建立安全的信任关系

1、在A机器上用root运行ssh-keygen,将生成/root/.ssh/identity和/root/.ssh/identity.pub两个文件;

2、在A机器上运行scp /root/.ssh/identity.pub test@192.168.1.10:/upload/.ssh/authorized_keys(假设B机器的IP地址为192.168.1.10,B 机器上开了用户test,要上传到的目录是/upload,需输入密码)。目的是将本地的identity.pub放到远程机器上并改名为 authorized_keys,这样就建立了新任主机,以后就不需要每次ssh都需要输入密码了;

3、通过crontab建立脚本,例:30 02 * * 1-5 scp /home/data/* test@192.168.1.10:/upload。
(每天2:30am自动将/home/data下面的所有文件以test用户名传到远程主机192.168.1.10的/upload目录中);

认证原理:
 如果你希望从A作为用户user1 SSH 到B 作为用户user2, 若要用RSA键对法认证且不需要密码,则B上的ssh 后台程序拿出~user2/.ssh/authorized_keys中的与A有关的RSA公钥来对A上的以user1身份运行的ssh客户程序进行挑 战,前面我们已经把A上的identity.pub拷贝到B上作为authorized_keys了。则A保持私钥identity,而B上的sshd又 拿出A的公钥来挑战,因此成功,你可以加很多行到authorized_keys以允许其它服务器的公钥可以加进来。

scp特点:
使用ssl加密,安全性高。

rsync的备份指南:
需求:用rsync完成异地文件的同步
难点:如何建立异地信任关系

1、在A主机上(rsync服务器)上编译安装rsync,需要版本在2.4.3以上(http://rsync.samba.org),在/etc目录下建立rsyncd.conf文件,内容如下:
uid = nobody
gid = nobody
use chroot = no             # 不使用chroot
max connections = 4         # 最大连接数为4
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock     # 日志记录文件

[test]                 # 这里是认证的模块名,在客户端需要指定
   path = /home/test         # 需要同步的目录
   comment = test folder
   uid = root
   ignore errors         # 可以忽略一些无关的IO错误
   read only = yes         # 只读
   list = no             # 不允许列文件
   auth users = rsynctest    # 认证的用户名,如果没有这行,则表明是匿名
   secrets file = /etc/test.scrt     # 认证用户密码文件

2、在/etc下建立test.scrt文件,输入:
用户名:密码
例:rsynctest:testrsync
将文件属性修改为600(千万注意)

3、启动rsync服务:rsync --daemon (rsync运行在tcp 873端口,可以通过netstat -an|grep LISTEN察看)。

4、在B主机上(rsync客户机)上建立/etc/test文件,内容为A主机的密码,例:
testsync

5、用crontab建立脚本,例:0 21 * * 1-5 rsync -vzrtp --progress --delete --password-file=/etc/test rsynctest@192.168.1.10::test /home/rsynctest

rsync中的参数:v是verbose,z是压缩,r是recursive,tp都是保持文件原有属性如属主、时间
的参数。--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。--password-file=/etc/test来指定密码文件,这样就可以在脚本中使
用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读(600)。

rsynctest@192.168.1.10中,rsynctest是指定密码文件中的用户名,192.168.1.10是A主机的IP地 址::test是指模块名[test],也就是在/etc/rsyncd.conf中自定义的名称。最后的/home/rsynctest是备份到本地的 目录名。
(也可以用-e ssh的参数建立起加密的连接,然后和scp中信任主机的办法一样如法炮制)
(在上面实例中的rsynctest并不是真实的用户,可以根据自己需要文本定义,这也是使用rsync的一大好处)

rsync的特点:
特性如下:

1、可以镜像保存整个目录树和文件系统。
2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。
3、无须特殊权限即可安装。
4、优化的流程,文件传输效率高。
5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
6、支持匿名传输。

rsync的功能还很强大,深入的眼就可以到官方网站上了解.
---------------------------------------------------------
rsync的试用方法 


一、设置Rsync Server端
Rsync server需要设定四个方面:
1.规划建立备份目录区
2.设定: /etc/xinetd.d/rsync
3.设定: /etc/rsyncd.conf
4.设定: 密码文件。

说明如下:
1.规划建立备份目录区:
建议你在rsync server上开一个较大的磁盘分割区,并在其下建立好备份用的目录。比如:/home/asialinux。
2.设定: /etc/xinetd.d/rsync:
即#vi /etc/xinetd.d/rsync
#default: off
#description:The rsync server is a good addition to am ftp server,as it
#    allows crc checksumming etc.
service rsync
{
    disable = no
    socket_type   = stream
    wait      = no
    user      = root
    server     = /usr/bin/rsync
    server_args   = --daemon
    log_on_failure += USERID
}
把其中的disable = yes 改为 disable = no之后退出保存就可以了,这还没有完成,还需启动rsync的服务。
#service xinetd restart
或者
#ntsysv
选中
rsync确定即可。
这样就开通了873通道(port),一旦有rsync client连接,xinetd就会把它转介给rsyncd跑port873。

3.设定: /etc/rsyncd.conf
如果在/etc下没有这个文件,请不要迷惑,自己创建一个不就得了,假设要备份的机器名为asialinux(IP:192.168.0.1),
即Samba文件服务器:
#vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
secrets file = /etc/rsync.pass

[backup]
path = /home/server/asialinux
auth users = feixue
uid = root
gid = root
secrets file = /home/rsyncd.secrets
read only = no
退出vi编辑模式并保存。

说明:
[backup]代表欲备份的主机代号,可以和主机名相同,也可以自定。本例为backup,而没有用asialinux以便大家在下面使用rsync命令时加以理解。
Path就是用来存放备份档案的绝对目录,请你一定要用mkdir开设好,名称自定,如本例要在/home目录下面建立server目录以及server下面的子目录asialinux。
注:如果你没有建立目录、目录建立的不对或者路径不对,都将不能进行rsync的备份,情况如下所示:
#rsync –rvlHopDtS --password-file=/root/rsyncd.recrets /home feixue@testsmb::backup
@ERROR:chroot failed
rsync:connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(165)

auth users代表授权的账号,名称可自定。
secrets file代表存储账号和密码的档案路径。

当然,大家可以在/etc/rsyncd.conf内加入更多的区块,来备份多台主机或者一台主机的多个目录等,可以灵活运用。

4.设定:密码文件
如果没有和ssh在一块儿运用的话,rsyncd.secrets的内容很简单,格式为 账号:密码
例如:
feixue:asialinux
注:上述设定只是一个范例,请大家务必自定一组,千万不可以直接套用。
账号和密码设定完成之后,为了安全,还要对其属主和权限进行限定,我测试过,server和client端的权限都设为000时,只要密码两者相符,依然可以正常的备份。:D
#chown root.root rsyncd.secrets
#chmod 600 rsyncd.secrets
这样,我们的Rsync Server端就设定完成了,当然你可以查看rsync的记录日志档案,请参考:/var/log/rsyncd.log。

二、设置Rsync Client端
假设欲备份的机器名称为testsmb(IP:192.168.2.220)下的目录/home备份到Rsync Server(asialinux)上。可以做如下设定:
 1.设定密码文件
 2.测试rsync执行指令
 3.将rsync指令放入工作排程(crontab)
说明如下:
1.设定密码文件
假设把密码文件放在/root/rsyncd.secrets,内容很简单,只要含有一行密码即可:
#vi /root/rsyncd.secrets
asialinux
退出vi编辑模式并保存。
注:为了安全,设定密码档案的属性为:600。rsyncd.secrets的密码一定要和Rsync Server密码设定档案里的密码一样。
如果不同,将会出现如下的错误:
#rsync –rvlHopDtS --password-file=/root/rsyncd.recrets /home feixue@testsmb::backup
@ERROR: auth failed on module backup
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(165)
2. 测试rsync执行指令
一切设定完之后,我们可以带着兴奋的心情来测试、体验一下Rsync的魅力吧:)
# rsync –rvlHopDtS --password-file=/root/rsyncd.recrets /home feixue@testsmb::backup
如果出现如下所示的画面,那么恭喜一下,成功了:
上传备份
# rsync –rvlHopDtS --password-file=/root/rsyncd.recrets /home feixue@testsmb::backup
下载备份
# rsync -vzrtopg --delete --password-file=/etc/rsync.pass --progress user@192.168.1.26::shanxlu /home/wenti
building file list ... done
.profiles/Application Data/Microsoft/Office/WEBFDR16.INF
.profiles/Application Data/Microsoft/WELCOME/DEFAULT.WBM

若出现如下:
# rsync –rvlHopDtS --password-file=/root/rsyncd.recrets /home feixue@testsmb::backup
rsync: getaddrinto: testsmb 873: Name or service not know
rsync error: error in socket IO (code 10 ) at clientserver.c(83)

请分别编辑Rsync Server(假设hostname为asialinux,IP:192.168.0.1)和Rsync Client(假设hostname为testsmb,IP:192.168.0.2)的/etc/hosts文件,分别加入对方的IP地址和机器名,如 下:
[root@asialinux root]#vi /etc/hosts
192.168.0.2    testsmb
退出vi编辑模式并保存。
[root@testsmb root]#vi /etc/hosts
192.168.0.1    asialinux
退出vi编辑模式并保存。
如果没有出现期望的画面,那么请检查一下你的设定。

3.将rsync指令放入工作排程(crontab)
现在可以把我们的备份工作置入排程了,假设每天凌晨1点开始备份工作:
#crontab –u root –e
0 1 * * * /usr/bin/rsync --password-file=/root/rsyncd.recrets /home feixue@testsmb::backup
如果你有其他的目录需要备份,则如法炮制吧


@rsync 试用参数:
-h , --help 显示rsync求助资讯
--version 顯示rsync版本
-v , --verbose 复杂的输出信息
-q , --quiet 安静模式,几乎没有讯息产生, 常用在以cron执行rsync
-I, --ignore-times 通常rsync为了加快速度会忽略同样档案大小且同样,同样存取时间点的档案
可以通过此参数开关此快速检查.
--size-only rsync  只检查档案大小是否改变,不管时间存取点是否改变
通常用在mirror, 且对方时间不太正确时
-c, --checksum 在传送之前透过128bit的md4检查码来检查所有要传送的档案(会托满速度);
-a, --archive archive mode 权限保存模式,相当于 -rlptgoD 参数.
很快速的保存几乎所有的权限设定,除了硬式连接(透过-H设定).
-r, --recursive 复制所有下面的资料(透过)
-R, --relative 使用相对路径
如: rsync foo/bar/foo.c remote:/tmp/ 在远端产生/tmp/foo.c档案
rsync -R foo/bar/foo.c remote:/tmp/ 在远端产生/tmp/foo/bar/foo.c 档案
-R, --relative 不使用相对路径
-b, --backup 目的地端先前已经存在的档案在传输或删除前会被备份
--backup-dir=DIR 设定备份的资料夹
--suffix=SUFFIX 指定备份的档案名称字尾形式(预设为~)
-K, --keep-dirlinks 接收方将连接到资料夹的档案视为资料夹处理
-l, --links 复制所有的连接
-H, --hard-links 保留硬式连结
-p, --perms 保留档案权限
-o, --owner 保留档案所有者(root only)
-g, --group 保留档案群组
-D, --devices 保留device资讯(root only)
-t, --times 保留时间点
-n, --dry-run 不实际执行传送, 只显示将会有的传输动作
-S, --sparse 尝试去处理稀疏的档案, 让这些档案在目的端占去较少的磁碟空间
-W, --whole-file 复制所有的档案, 不额外作检查
--no-whole-file 关闭 --whole-file 参数
-x, --one-file-system 不要跨越档案系统分界(只在一个档案系统处理)
-B, --block-size=SIZE 强制透过rsync程式去比对修复block-sizeforce
-e --rsh=COMMAND 定义所试用的remote shell
--rsync-path=PATH 定义rsync在远端机器存放资料的路径
--existing 只对比更新目的端已经存在的档案
--ignore-existing 忽略目的断已经存在的档案(也就是不更新)
--delete 删除传送断已经不存在,而目的端存在的档案
--delete-excluded 除了把传送端已经不存在, 而目的端存在的档案删除之外, 也删除 --exclude 参数所包含的档案
--delete-after rsync预设会在档案传送前进行相关删除动作确保接收端有足够的档案空间,
单可以透过 --delete-after 让删除动作在档案传送后在进行删除
--ignore-errors 忽略任何错误即使是I/O error 也进行 --delete 删除动作
--max-delete=NUM 定义rsync不要删除超过NUM个档案
--partial rsync若遇到传输过程中断时, 会把那些已经传输的档案删除.
在某种状况下保留那些部分传送的档案是令人高兴的;
你可以透过 --partial 参数达到这个目的.
--partial-dir=DIR 在 --partial 参数启动时, 你还是可以定义rsync把那些部分传送的档案
写入定义的资料夹, 而非直接写入目的端,需要注意的是,
此资料夹不应该被其他试用者可以写入.(如:/tmp)
--force 当目的端资料夹被传送端非资料夹名称覆盖时, 强制rsync删除资料夹, 即使该资料夹不是空的.
--numeric-ids 不将传送端档案的uid及gid值, 与目的端的使用者/群组进行配对,
若传送端并没有uid及gid的对应名称(如:原帐号群组被删除的遗留档案),
或目的端没有相对应的帐号/群组, 保留数字型式的uid/gid
--timeout=TIMEOUT 设定I/O 超时的时间(秒). 超过这个秒数而没有资料传送, rsync将会结束. 预设为0,也就是没有定义超时时间
-T, --temp-dir=DIR 定义rsync在接收端产生暂时性的复制档案时使用资料夹暂存, 预设时直接在接收端资料夹直接产生暂存档案
--compare-dest=DIR 定义rsync在目的端建立资料夹来比对传送过来的档案.
--link-dest=DIR 与 --compare-dest 相同,但同时会针对无法改变的档案建立硬式连结.
-z, --compress 压缩模式, 当资料在传送到目的端进行档案压缩.
-P -P参数和 --partial --progress 相同.只是为了把参数简单化.
-C, --cvs-exclude 排除那些通常不希望传送的档案, 定义的方式与CVS传送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上条件的都会被忽略不传送.
--exclude=PATTER 符合PATTERN(规则表示式)样式的档案不仅行传送
--exclude-from=FILE 和 --exclude 参数相同, 不过是把不进行传送的档案事先写入某一档案.
执行时, 透过此参数让rsync读取.
(; #开头的行列或者空白会被rsync忽略)
--include=PATTERN 定义rsync不要排除符合pattern样式的档案
--include-from=FILE 和--include参数相同,只不过把要包含的档案写到某一档案.
--files-from=FILE 把要传送的档案名称都精确的写入某一档案, 让rsync读取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup
-0 --from0 定义档案所要读取的档案时null字元结尾.
--version 现四版本信息.
--daemon 定义rsync以daemon型态执行
--no-detach 当以daemon形态执行时,不要进行分裂且变成背景程序.
--address=ADDRESS 定义所要连接(bind)的ip位置或者是host名称(daemon限定)
--config=FILE 定义所要读取的设定档rsyncd.conf位置(daemon限定)
预设值为 /usr/local/etc/rsyncd.conf
--port=PORT 定义rsyncd(daemon)要旨行的port(预设为tcp 873)
--blocking-io 使用blocking I/O连结远端的shell, 如rsh, remsh
--no-blocking-io 使用non-blocking连结远端的shell, 如ssh(预设值)
--stats 显示档案传送时的资讯状态
--progress 显示传送的进度.(给档案传送时,怕无聊的人用的..)
--log-format=FORMAT 定义log的格式(在rsyncd.conf设定)
--password-file=FILE 从档案读取与远端rsync伺服务连结的密码
--bwlimit=KBPS 定义传输频宽的大小(KBytes/秒)
--write-batch=FILE 把记录资料写入一个档案(给其他相同环境且相同需求的机器试用)
--read-batch=FILE 透过读取记录档案来进行传输.(档案由 --write-batch 参数产生)
--checksum-seed=NUM 定义档案 checksum-seed 的大小(byte)
-4 --ipv4 使用IPv4协定
-6 --ipv6 使用IPv6协定
-----------------------------

rsync安装配置实践

 

前言

Rsync代表”remote sync”,它是本地和远程主机文件同步工具。它只同步更改的文件,以此实现最小化传输数据。rsync的使用场景非常丰富,相信大家会经常使用,这里做下简单的总结。

扩展阅读

rsync - https://www.samba.org/rsync/

rsync简介:

rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm.

rsync 是类 unix 系统下的数据镜像备份工具,从软件的命名上就可以看出来了 ——remote sync。它的特性如下:

  1. 可以镜像保存整个目录树和文件系统
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等等
  3. 无须特殊权限即可安装
  4. 优化的流程,文件传输效率高
  5. 可以使用 rsh、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接
  6. 支持匿名传输

在使用 rsync 进行远程同步时,可以使用两种方式:远程 Shell 方式(用户验证由 ssh 负责)和 C/S 方式(即客户连接远程 rsync 服务器,用户验证由 rsync 服务器负责)。

无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。

rsync源配置文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 编辑rsync配置文件
vim /etc/rsync.conf

# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

# configuration example:

# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# 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

# [ftp]
# path = /home/ftp
# comment = ftp export area

rsyncd.conf 官方文档请参考 - https://www.samba.org/ftp/rsync/rsyncd.conf.html

rsync常用参数

注: 在指定复制源时,路径是否有最后的 “/” 有不同的含义,例如:

/data 表示将整个 /data 目录复制到目标目录
/data/ 表示将 /data/ 目录中的所有内容复制到目标目录

man rsync 翻译 (rsync 命令中文手册)
http://www.cnblogs.com/f-ck-need-u/p/7221713.html

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm.

Usage: rsync [OPTION]... SRC [SRC]... DEST
or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
or rsync [OPTION]... [USER@]HOST:SRC [DEST]
or rsync [OPTION]... [USER@]HOST::SRC [DEST]
or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.

Options
-v, --verbose increase verbosity
--info=FLAGS fine-grained informational verbosity
--debug=FLAGS fine-grained debug verbosity
--msgs2stderr special output handling for debugging
-q, --quiet suppress non-error messages
--no-motd suppress daemon-mode MOTD (see manpage caveat)
-c, --checksum skip based on checksum, not mod-time & size
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
-r, --recursive recurse into directories
-R, --relative use relative path names
--no-implied-dirs don't send implied dirs with --relative
-b, --backup make backups (see --suffix & --backup-dir)
--backup-dir=DIR make backups into hierarchy based in DIR
--suffix=SUFFIX set backup suffix (default ~ w/o --backup-dir)
-u, --update skip files that are newer on the receiver
--inplace update destination files in-place (SEE MAN PAGE)
--append append data onto shorter files
--append-verify like --append, but with old data in file checksum
-d, --dirs transfer directories without recursing
-l, --links copy symlinks as symlinks
-L, --copy-links transform symlink into referent file/dir
--copy-unsafe-links only "unsafe" symlinks are transformed
--safe-links ignore symlinks that point outside the source tree
--munge-links munge symlinks to make them safer (but unusable)
-k, --copy-dirlinks transform symlink to a dir into referent dir
-K, --keep-dirlinks treat symlinked dir on receiver as dir
-H, --hard-links preserve hard links
-p, --perms preserve permissions
-E, --executability preserve the file's executability
--chmod=CHMOD affect file and/or directory permissions
-A, --acls preserve ACLs (implies --perms)
-X, --xattrs preserve extended attributes
-o, --owner preserve owner (super-user only)
-g, --group preserve group
--devices preserve device files (super-user only)
--copy-devices copy device contents as regular file
--specials preserve special files
-D same as --devices --specials
-t, --times preserve modification times
-O, --omit-dir-times omit directories from --times
-J, --omit-link-times omit symlinks from --times
--super receiver attempts super-user activities
--fake-super store/recover privileged attrs using xattrs
-S, --sparse handle sparse files efficiently
--preallocate allocate dest files before writing them
-n, --dry-run perform a trial run with no changes made
-W, --whole-file copy files whole (without delta-xfer algorithm)
-x, --one-file-system don't cross filesystem boundaries
-B, --block-size=SIZE force a fixed checksum block-size
-e, --rsh=COMMAND specify the remote shell to use
--rsync-path=PROGRAM specify the rsync to run on the remote machine
--existing skip creating new files on receiver
--ignore-existing skip updating files that already exist on receiver
--remove-source-files sender removes synchronized files (non-dirs)
--del an alias for --delete-during
--delete delete extraneous files from destination dirs
--delete-before receiver deletes before transfer, not during
--delete-during receiver deletes during the transfer
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not during
--delete-excluded also delete excluded files from destination dirs
--ignore-missing-args ignore missing source args without error
--delete-missing-args delete missing source args from destination
--ignore-errors delete even if there are I/O errors
--force force deletion of directories even if not empty
--max-delete=NUM don't delete more than NUM files
--max-size=SIZE don't transfer any file larger than SIZE
--min-size=SIZE don't transfer any file smaller than SIZE
--partial keep partially transferred files
--partial-dir=DIR put a partially transferred file into DIR
--delay-updates put all updated files into place at transfer's end
-m, --prune-empty-dirs prune empty directory chains from the file-list
--numeric-ids don't map uid/gid values by user/group name
--usermap=STRING custom username mapping
--groupmap=STRING custom groupname mapping
--chown=USER:GROUP simple username/groupname mapping
--timeout=SECONDS set I/O timeout in seconds
--contimeout=SECONDS set daemon connection timeout in seconds
-I, --ignore-times don't skip files that match in size and mod-time
-M, --remote-option=OPTION send OPTION to the remote side only
--size-only skip files that match in size
--modify-window=NUM compare mod-times with reduced accuracy
-T, --temp-dir=DIR create temporary files in directory DIR
-y, --fuzzy find similar file for basis if no dest file
--compare-dest=DIR also compare destination files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
--skip-compress=LIST skip compressing files with a suffix in LIST
-C, --cvs-exclude auto-ignore files the same way CVS does
-f, --filter=RULE add a file-filtering RULE
-F same as --filter='dir-merge /.rsync-filter'
repeated: --filter='- .rsync-filter'
--exclude=PATTERN exclude files matching PATTERN
--exclude-from=FILE read exclude patterns from FILE
--include=PATTERN don't exclude files matching PATTERN
--include-from=FILE read include patterns from FILE
--files-from=FILE read list of source-file names from FILE
-0, --from0 all *-from/filter files are delimited by 0s
-s, --protect-args no space-splitting; only wildcard special-chars
--address=ADDRESS bind address for outgoing socket to daemon
--port=PORT specify double-colon alternate port number
--sockopts=OPTIONS specify custom TCP options
--blocking-io use blocking I/O for the remote shell
--stats give some file-transfer stats
-8, --8-bit-output leave high-bit chars unescaped in output
-h, --human-readable output numbers in a human-readable format
--progress show progress during transfer
-P same as --partial --progress
-i, --itemize-changes output a change-summary for all updates
--out-format=FORMAT output updates using the specified FORMAT
--log-file=FILE log what we're doing to the specified FILE
--log-file-format=FMT log updates using the specified FMT
--password-file=FILE read daemon-access password from FILE
--list-only list the files instead of copying them
--bwlimit=RATE limit socket I/O bandwidth
--outbuf=N|L|B set output buffering to None, Line, or Block
--write-batch=FILE write a batched update to FILE
--only-write-batch=FILE like --write-batch but w/o updating destination
--read-batch=FILE read a batched update from FILE
--protocol=NUM force an older protocol version to be used
--iconv=CONVERT_SPEC request charset conversion of filenames
--checksum-seed=NUM set block/file checksum seed (advanced)
-4, --ipv4 prefer IPv4
-6, --ipv6 prefer IPv6
--version print version number
(-h) --help show this help (-h is --help only if used alone)

Use "rsync --daemon --help" to see the daemon-mode command-line options.
Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.
See http://rsync.samba.org/ for updates, bug reports, and answers

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
# rsync 常用参数 
-v : 展示详细的同步信息
-a : 归档模式,相当于 -rlptgoD
-r : 递归目录
-l : 同步软连接文件
-p : 保留权限
-t : 将源文件的"modify time"同步到目标机器
-g : 保持文件属组
-o : 保持文件属主
-D : 和 --devices --specials 一样,保持设备文件和特殊文件
-z : 发送数据前,先压缩再传输
-H : 保持硬链接
-n : 进行试运行,不作任何更改
-P same as --partial --progress
--partial : 支持断点续传
--progress : 展示传输的进度
--delete : 如果源文件消失,目标文件也会被删除
--delete-excluded : 指定要在目的端删除的文件
--delete-after : 默认情况下,rsync 是先清理目的端的文件再开始数据同步;如果使用此选项,则 rsync 会先进行数据同步,都完成后再删除那些需要清理的文件。
--exclude=PATTERN : 排除匹配 PATTERN 的文件
--exclude-from=FILE : 如果要排除的文件很多,可以统一写在某一文件中
-e ssh : 使用 SSH 加密隧道传输

# 远程 Shell 方式
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST # 执行“推” 操作
or rsync [OPTION]... [USER@]HOST:SRC [DEST] # 执行“拉” 操作

# 远程 C/S 方式
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST # 执行“推” 操作
or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST # 执行“推” 操作
or rsync [OPTION]... [USER@]HOST::SRC [DEST] # 执行“拉” 操作
or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] # 执行“拉” 操作

rsync同步方式

Rsync 远程同步主要有两种方式:使用远程 shell(ssh或rsh) 或使用 rsync 的 daemon 方式

rsync 命令和 ssh,scp 命令有点相似。

我们创建两个测试目录和一些文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir dir1
mkdir dir2
touch dir1/somefile{1..100}
# dir1 中有 100 文件,dir2 中为空。使用 rsync 把 dir1 内容同步到 dir2,-r 选项代表递归,在同步目录时使用。
rsync -r dir1/ dir2
# 你也可以使用 -a 选项,代表同步所有,包括修改时间、群组、权限、特殊文件、也包括递归。
rsync -anv dir1/ dir2
# 注意上面的 dir1 / 中的 “/” 不能少,它代表同步目录下文件, 如果没有 “/” 代表同步这个目录。

# 和远程主机进行同步目录首先,你要确保有远程主机的 SSH 访问权限

# 把本地目录同步到远程主机:
rsync -a dir1/ root@linux:~/dir2
# 把远程主机目录同步到本地:
rsync -a root@linux:~/dir2/ dir1

本地文件同步

1
2
# 如果没有desc目录,会自动创建
rsync -avH /opt/resource/ /tmp/desc/

远程文件同步 –shell 方式

1
2
3
4
5
6
7
8
9
10
11
# 从本地传到远端,目标文件会被写成ssh登录用户的属组和属主(如下 www)
rsync -avH /opt/nginx-1.12.1/ www@172.18.50.125:/tmp/nginx/

# 使用 ssh 加密隧道方式传输,保障数据的安全性
rsync -avHe ssh /opt/nginx-1.12.1/ www@172.18.50.125:/tmp/nginx/

# 从远端传到本地,只要对目标文件有读的权限,就可以同步到本地
rsync -avH www@172.18.50.125:/tmp/nginx/ /tmp/nginx/

# 如果远程服务器ssh端口不是默认的22
rsync -avHe "ssh -p 11222" /opt/nginx-1.12.1/ www@172.18.50.125:/tmp/nginx/

远程文件同步 –daemon 方式

rsync服务端配置

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 创建 rsync 服务的目录和配置文件 (可选)
mkdir /etc/rsync
cd /etc/rsync
touch rsyncd.conf
touch rsyncd.secrets
touch rsyncd.motd
chmod 600 rsyncd.secrets

### rsyncd.conf 文件的配置
vim /etc/rsync/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# 传输文件使用的用户和用户组,如果是从服务器=>客户端,要保证www用户对文件有读取的权限;如果是从客户端=>服务端,要保证www对文件有写权限。
uid = www
gid = www
# 允许chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下,chroot为yes时必须使用root权限,且不能备份path路径外的链接文件
use chroot = yes
# 只读
read only = no
# 只写
write only = no
# 设定白名单,可以指定IP段(172.18.50.1/255.255.255.0),各个Ip段用空格分开
hosts allow = 172.18.50.110 172.18.50.111
hosts deny = *
# 允许的客户端最大连接数
max connections = 4
# 欢迎文件的路径,非必须
motd file = /etc/rsync/rsyncd.motd
# pid文件路径
pid file = /var/run/rsyncd.pid
# 记录传输文件日志
transfer logging = yes
# 日志文件格式
log format = %t %a %m %f %b
# 指定日志文件
log file = /var/log/rsync.log
# 剔除某些文件或目录,不同步
exclude = lost+found/
# 设置超时时间
timeout = 900
ignore nonreadable = yes
# 设置不需要压缩的文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# 模块,可以配置多个,使用如: sate@172.18.50.125::125to110
[125to110]
# 模块的根目录,同步目录,要注意权限
path = /tmp/nginx
# 是否允许列出模块内容
list = no
# 忽略错误
ignore errors
# 添加注释
comment = ftp export area
# 模块验证的用户名称,可使用空格或者逗号隔开多个用户名
auth users = sate
# 模块验证密码文件 可放在全局配置里
secrets file = /etc/rsync/rsyncd.secrets
# 剔除某些文件或目录,不同步
exclude = lost+found/ conf/ man/

### rsyncd.secrets 文件的配置
cat rsyncd.secrets
# 用户名:密码
sate:111111

### rsync启动
rsync --daemon --config=/etc/rsync/rsyncd.conf

rsync客户端配置

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
# 从 服务端 => 客户端 同步数据,会提示输入密码
rsync -avzP --delete sate@172.18.50.125::125to110 /tmp/sync/

# 从 客户端 => 服务端 同步数据,会提示输入密码
rsync -avzP --delete /tmp/sync/ sate@172.18.50.125::125to110

# 注: 如果是 /tmp/sync,则同步sync目录;如果 /tmp/sync/,则同步sync目录下的文件

# 免密码同步,将密码写到文件,再通过 --password-file 指定该文件,注:该文件的权限必须是 600
echo "111111" > /tmp/secrets.file
chmod 600 /tmp/secrets.file
rsync -avzP --delete --password-file=/tmp/secrets.file sate@172.18.50.125::125to110 /tmp/sync/

# --exclude 排除文件目录时,如果有多个同名目录的情况
# 目录结构
tree
.
├── dir1
│ └── test
│ ├── 3.file
│ ├── 4.file
│ └── 5.file
├── dir2
└── test
├── 1.file
├── 2.file
└── 3.file

# 情况一 : 排除 /test 目录,同步其他目录(同步的是/tmp/sync/ 下边的文件)
rsync -avP --delete --password-file=/tmp/secrets.file --exclude=test /tmp/sync/ sate@172.18.50.125::125to110

# 会发现,该目录下所有 test 目录都被排除了,如果想只排除第一层目录的 test,可以如下(/ 代表所同步目录第一层):
rsync -avP --delete --password-file=/tmp/secrets.file --exclude=/test/ /tmp/sync/ sate@172.18.50.125::125to110

# 情况二 : 和情况一不同的是 同步的 /tmp/sync 这个目录(同步的是/tmp/sync 目录本身,导致 exclude 后边的参数也会变化)
rsync -avP --delete --password-file=/tmp/secrets.file --exclude=/sync/test/ /tmp/sync sate@172.18.50.125::125to110

rsync简化配置实践

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
39
40
# 配置服务端rsyncd.conf
vim /etc/rsyncd.conf

read only = no
list = yes
uid = root
gid = root

[backup]
path= /data/
hosts allow = 10.71.12.0/23

# 设置服务
systemctl start rsyncd
systemctl enable rsyncd

# 配置rsync客户端

# 编辑backup.sh同步脚本
vim backup.sh

#!/bin/sh
SOURCE=$1
DEST=$2

CMD="rsync -ravz --bwlimit=2000 $1 rsync://{{log_server_ip}}:873/backup/$2"

PROCS=$(pgrep -f "{{log_server_ip}}:873/backup/$2")

if [ "x" != "x$PROCS" ]; then
echo "not finished"
exit
fi

$CMD

# 修改crontab
vim /etc/crontab
15 * * * * root cd /opt/scripts/ && ./backup.sh /var/log/tmp/ 10.71.12.89/$(date +\%Y-\%m)

rsync 有用的选项和注意事项

-n 选项,方便你执行rsync命令前预览结果,不会真正执行

1
2
3
4
$ rsync -n --delete -r . machineB:/home/userB/
deleting superman/xxx
deleting main.c
deleting acclink

–delete 选项,如果源端没有此文件,那么目的端也别想拥有,删除之。

rsync -aP --delete source dest

-P 选项非常有用,它是 -progress 和 -partial 的组合。第一个选项是用来显示传输进度条,第二个选项允许断点续传和增量传输:

rsync -aP source dest

-z 选项,压缩传输的文件,对于已经压缩过的文件不建议添加该参数,针对大文件压缩包传输效率会降低8倍,且消耗CPU

rsync -az source dest

–bwlimit 选项,限制传输带宽,参数值的默认单位是 KBPS,也就是每秒多少 KB

rsync -avzP --bwlimit=100 source dest

–remove-source-files 该选项告诉rsync移除sender端已经成功传输到receiver端的文件(不包括任何目录文件)。

rsync -avP --remove-source-files source dest

rsync过滤模块比较复杂,建议参考官网和Google实例测试
–exclude 选项如果只有前者可以单独使用,多个规则需要写多条
–include 选项通常需要配合–exclude同时使用
过滤规则比较多可以写在文件里读取,由于rsync不支持正则表达式,复杂的逻辑建议先使用bash shell过滤

Basically, first include all directories, then exclude all files.

rsync -a --include='*/' --exclude='*' source/ destination/

https://rsync.samba.org/documentation.html

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
mkdir -p /data/test_backup/gop-live-msdk_api
cd data/test_backup/
touch -t 201912020808.20 test1202.txt
touch -t 201912010808.20 test1201.txt
touch -t 201911300808.20 test1130.txt
touch -t 201911290808.20 test1129.txt
touch -t 201911280808.20 test1128.txt

cd data/test_backup/gop-live-msdk_api
touch gop-live-msdk_api-data-2019-12-02_00103
touch gop-live-msdk_api-data_current
touch gop-live-msdk_api-error-2019-12-02_00103
touch gop-live-msdk_api-error_current
touch gop-live-msdk_api-data-2019-11-30.tgz

vim /data/exclude.txt
*_0*
*_current

vim /data/rsync_backup_mirror_xxx.sh

#!/bin/bash
var_src="/data/test_backup/"
var_des="rsync://xxx:873/backup/"
#rsync -aP --delete --exclude-from '/data/exclude.txt' ${var_src} ${var_des}
rsync -aP --exclude-from '/data/exclude.txt' ${var_src} ${var_des}

rsync常见错误

1
2
rsync: failed to connect to 192.168.205.135 (192.168.205.135): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [Receiver=3.1.2]

解决:防火墙问题,放行端口或直接关闭

1
2
@ERROR: auth failed on module rsync_test
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]

解决:用户名与密码问题或模块问题,检查用户名与密码是否匹配,服务器端模块是否存在

1
2
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [Receiver=3.1.2]

解决:服务器端配置文件 /etc/rsyncd.conf 问题,检查配置文件参数是否出错

参考文章

Rsync+Inotify 文件自动同步,推荐使用lsyncd+rsync

sersync 基于 rsync+inotify 实现数据实时同步:  https://wsgzao.github.io/post/sersync/

CentOS7 部署 lsyncd+rsync 实现服务器文件实时同步:  https://www.xiebruce.top/919.html 

rsync (一):基本命令和用法

Rsync(Remote Sync):10个实用的例子

rsync 的使用方法

---------------------

使用rsync快速同步与备份服务器数据

在重新研究备份方案时,发现了rsync。与rclone兼容已有协议/服务不同,它是一个CS架构的软件,需要在客户机和服务器上同时部署,虽然增加了一些服务器的负载,不过带来的优势却是很明显的,可以通过数据压缩等各种优化来加快同步。rsync是直接同步文件系统的,有更高的效率。而且,rsync是基于时间戳和文件大小来检查文件是否一致的,这样在文件系统只发生少量变动的情况下在极短的时间内就可以完成同步任务。(基于时间戳和文件大小的方法在原理上可能会出现实际文件发生改动但是时间戳和大小不变的情况,不过正常情况下不会出现这种情况,可以放心使用)

rsync是基于delta-transfer的差分同步方案,对于一些经常改变但是只有一小部分发生更新的大文件非常有效,比如说日志,在降低了网络通信开销的同时也加快了同步速度。此外,它是一个跨机的文件同步的工具,这样就可以异地备份,提高可靠性。

安装部署

rsync部署起来也很方便,直接 sudo apt install -y rsync就可以了,然后在服务器上使用命令rsync --daemon运行服务端。

配置和使用

首先要写一下配置文件。前面的部分是全局的配置,后面可以针对每一个子项进行配置,比如我们要同步/data目录。

# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
uid = root
gid = root

# 如果要在客户端上保留文件系统权限和用户,这里需要配置成yes
use chroot = yes
# 如果服务端只用来提供同步,这里可以设置成yes,避免数据被误操作
read only = no

# 配置允许的客户端网段,需要注意的是docker需要配置`--net host`才能正确使用。
# hosts allow = 192.168.1.0/255.255.255.0 172.18.50.111
# hosts deny = *

# 配置单客户端最大的连接,这个如果只是私人使用,基本用不到
#max connections = 4

transfer logging = yes
log format = %t %a %m %f %b
log file = /var/log/rsync.log

# 拍不lost found等没有用的文件夹
exclude = lost+found/
# 无响应超时时间
timeout = 600

# 在发生io错误的时候继续处理
ignore nonreadable = yes

# 避免无意义的压缩带来的资源浪费
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

[data]
path = /data/
# 是否公开显示
list = yes
comment = This is site data
# 这里可以配置多个,用空格空开
auth users = newnius
secrets file = /etc/rsyncd.secrets
exclude = lost+found/

保存为/data/rsync/config/rsyncd.conf文件。

再创建一个/data/rsync/config/rsyncd.secrets文件,文件内容是用户和秘钥,建议设置的复杂一点,文件格式如下:

user1:password1
user2:password2
newnius:123456

你可以在这里找到完整的配置项和含义

启动服务端

 服务端需要暴露873端口用于请求处理和数据传输。

如果自己在宿主机上配置的话,需要主要秘钥文件的权限一定要是600,否则会被忽略,你也可以在日志文件里看到提示。

chmod 600 /etc/rsyncd.user1.secret

chmod 600 /etc/rsyncd.secrets

安全性

rsync提供了急于账号/秘钥的验证方式,同时也可以配置允许的客户端ip,在数据链路安全上,rsync可以采用基于ssh协议的传输方式(本文没有涉及),基本可以保证安全性。

不过ssh协议容易被检测,直接将rsync服务暴露在公网也有一定的隐患,我的方案是利用已有的内网代理v2ray,然后让rsync走代理,这样即便是rsync的验证存在问题,也可以保证安全。要让rsync走代理,只需要在客户端命令前面加上 RSYNC_PROXY=localhost:8118即可,http协议,不用写

参考

rsync同步

CentOS 7.3 Rsync服务的安装与配置

Rsync 配置和使用


-----------------

相关帖子:
https://briteming.blogspot.com/2011/11/rsync.html
http://briteming.blogspot.com/2012/11/rsync_2.html