Rsync是一款通过网络备份重要数据的工具/软件。它同样是一个在类Unix和Window系统上通过网络在系统间同步文件夹和文件的网络协议。Rsync可以复制或者显示目录并复制文件。Rsync默认监听TCP 873端口,通过远程shell如rsh和ssh复制文件。Rsync必须在远程和本地系统上都安装。

rsync的主要好处是:

速度:最初会在本地和远程之间拷贝所有内容。下次,只会传输发生改变的块或者字节。(增量同步)

安全:传输可以通过ssh协议加密数据。

低带宽:rsync可以在两端压缩和解压数据块。

rsync有两种工作方式:SSH和daemon。

说明:

rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。

当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。

 rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。

SSH方式是使用系统上的用户通过SSH进行同步操作。
daemon方式是rsync服务器会开一个873端口,等待客户端去连接,连接是进行验证,通过后进行同步。

下面讲解 ssh方式的使用:

语法:

rsysnc [options] source path destination path

常用options说明:

-v  可视化,显示同步过程
-r  递归
-z  启用压缩
-a  保留了所有人和所属组、时间戳、软链接、权限,并以递归模式运行
-d  仅传输文件而非递归



-v, –verbose 增强可读性
-q, –quiet 忽略非错误信息
–no-motd 忽略daemon模式的MOTD信息 (see manpage caveat)
-c, –checksum 基于checksum校验,而非mod-time和size
-a, –archive 归档模式,和-rlptgoD (不要使用 -H,-A,-X)参数相同
–no-OPTION 关闭一些显式的OPTION (比如 –no-D)
-r, –recursive 递归目录
-R, –relative 使用相对路径
–no-implied-dirs 不发送制定目录的属性,避免在目标使用–relative删除连接重新传输文件
-b, –backup 备份 (查看 –suffix & –backup-dir)
–backup-dir=DIR 基于DIR来创建备份的目录结构
–suffix=SUFFIX 制定备份的后最 (default ~ w/o –backup-dir)
-u, –update 跳过接受端较新的文件
–inplace 直接在文件上更新(SEE MAN PAGE)
–append 直接追加文件
–append-verify 和–append很像, 只是用文件的较旧的那部份做checksum
-d, –dirs 仅传输文件而非递归
-l, –links 将软链接当作软链接来拷贝
-L, –copy-links 拷贝链接对应的文件或者目录而非链接本身
–copy-unsafe-links 仅不安全的链接才被拷贝
–safe-links 忽略那些链接到目录树外的链接
-k, –copy-dirlinks 将链接翻译成其链接的目录
-K, –keep-dirlinks 将目录链接在接收端转换成目录
-H, –hard-links 保留硬链接
-p, –perms 保留权限
-E, –executability 保留文件的可执行性
–chmod=CHMOD 改变文件或者目录的权限
-A, –acls 保留ACLs (implies –perms)
-X, –xattrs 保留扩展属性
-o, –owner 保留所有者(super-user only)
-g, –group 保留组
–devices 保留设备文件 (super-user only)
–specials 保留特殊文件
-D 和 –devices –specials一样
-t, –times 保留修改时间
-O, –omit-dir-times 在–times选项里忽略目录的时间
–super 允许接受方执行那个一些超级用户的活动
–fake-super 通过xattrs来存储和回复权限
-S, –sparse 高效处理稀疏文件
-n, –dry-run 只运行,不做改变
-W, –whole-file 拷贝整个文件(without delta-xfer algorithm)
-x, –one-file-system 不跨越文件系统
-B, –block-size=SIZE 强制指定checksum的块大小
-e, –rsh=COMMAND 指定要使用的远程shell
–rsync-path=PROGRAM 指定远程要运行的rsync路径
–existing 如果接收端不存在文件就不创建
–ignore-existing 如果接收端存在就不更新文件
–remove-source-files 发送端删除已经同步的文件 (non-dirs)
–del an alias for –delete-during
–delete 删除接收端上在发送端不存在的文件
–delete-before 接收端在发送前删除,而不是发送过程中
–delete-during 接收端在发送过程中删除
–delete-delay 在发送过程中寻找文件,在发送完成后删除
–delete-after 接收端在发送完成后删除
–delete-excluded 在接收端删除排除的文件
–ignore-errors 即使有I/O错误也删除
–force 即使目录不是空的也删除
–max-delete=NUM 最多删除文件的数目
–max-size=SIZE 最大传输文件的大小
–min-size=SIZE 最小传输文件的大小
–partial 保持部分传输的文件
–partial-dir=DIR 制定部分传输文件的存放目录
–delay-updates 先传输,最后再更新,保持原子性
-m, –prune-empty-dirs 接收端删除空目录
–numeric-ids 接收端不要将uid/gid映射为用户名和组名
–timeout=SECONDS 设置I/O超时时间,s为单位
–contimeout=SECONDS 设置链接服务端的时间
-I, –ignore-times 即使mtime和size都相同也不跳过
–size-only 只要大小相同就跳过
–modify-window=NUM 比对时间时制定精确范围,范围内都认为时间相同
-T, –temp-dir=DIR 指定创建临时文件的目录
-y, –fuzzy 文件在接收端不存在的情况下,在当前目录下寻找一个基础文件,以加快传输
–compare-dest=DIR 接收端除了和发送端对比还和这里指定的目录对比,适合备份上次备份改变的文件
–copy-dest=DIR 和–compare-dest类似,只是接收端会用本地拷贝来复制那些未改变的文件
–link-dest=DIR 和–compare-dest类似,只是接收端会建立那些未改变文件的硬链接
-z, –compress 传输过程中压缩
–compress-level=NUM 指定压缩等级
–skip-compress=LIST 不压缩指定后缀的文件
-C, –cvs-exclude 以CSV的方式自动忽略文件
-f, –filter=RULE 新增一个file-filtering规则
-F same as –filter=’dir-merge /.rsync-filter’ repeated: –filter=’- .rsync-filter’
–exclude=PATTERN 排除规则PATTERN
–exclude-from=FILE 从文件中读取排除规则
–include=PATTERN 不要排除指定规则的文件
–include-from=FILE 从文件中读取包含的规则
–files-from=FILE 从文件中读取文件列表
-0, –from0 all
-from/filter files are delimited by 0s
-s, –protect-args 参数不许要空格分割; only wildcard special-chars
–address=ADDRESS 绑定监听的地址
–port=PORT 制定端口号
–sockopts=OPTIONS 制定TCP选项
–blocking-io 在远程shell中使用blocking I/O
–stats 给出文件统计信息
-8, –8-bit-output 输出时不对高位字符转义
-h, –human-readable 以易于阅读的方式打印数字
–progress 显示传输进度
-P same as –partial –progress
-i, –itemize-changes 打印更新的总结信息
–out-format=FORMAT 以特定的格式打印更新信息
–log-file=FILE 日志文件
–log-file-format=FMT 日志文件格式
–password-file=FILE 密码文件
–list-only 仅列出文件
–bwlimit=KBPS 限制带宽; KBytes per second
–write-batch=FILE 将批量更新写入文件
–only-write-batch=FILE 和 –write-batch类似 but w/o updating destination
–read-batch=FILE 从文件中读取批量更新任务
–protocol=NUM 使用旧版本的协议
–iconv=CONVERT_SPEC 要求文件名字符转义
-4, –ipv4 prefer IPv4
-6, –ipv6 prefer IPv6
–version 打印帮助信息
(-h) –help 打印这个帮组信息 (-h 仅在单独使用时与 –help 同意)

用法实例:

1、本地文件之间同步:


# 同步 /home/aloft/ 目录下的文件到 /backuphomedir目录

rsync -zvr /home/aloft/ /backuphomedir

2、同步本地到远程主机:

rsync -avz /home/aloft/ azmath@192.168.1.4:/share/rsysnctest/

3、远程同步到本地:

rsync -avz azmath@192.168.1.4:/share/rsysnctest/ /home/aloft/

4、找出文件间的不同

rsync -avzi /backuphomedir  /home/aloft/

5、列出远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即。

rsync -avzi  wml@192.168.1.1:/logs/

注意:跨系统间的同步数据需要输入用户密码;

解决跨系统间需要输入用户密码问题方法:

实际上rsync使用的SSH来认证用户的,在没有通过SSH认证的情况下,一般需要输入相应用户名密码,比如:

rsync -avz --progress --rsh=ssh /var/lib/mysql root@192.168.1.2:/var/lib/mysql

执行完这句后会提示输入用户root的密码,这样在程序自己处理的情况就很不爽了。

这时我们可以在服务器之间添加SSH认证(以公私钥认证方式):

#ssh-keygen -t rsa
一阵回车后,会生成id_rsa  id_rsa.pub两个文件,id_rsa为私钥,id_rsa.pub为公钥
可以将公钥上传到备份的服务器上
#scp id_rsa.pub root@192.168.1.1:server_1
文件会放在用户目录下,然后将server_1文件复制到用户目录下的.ssh 目录下
#mv server_1 .ssh/
最后将密钥导入authorized_keys文件
#cat server_1 >> authorized_keys

这样就可以不输入密码了