rsync 是一个远程数据同步工具,使用 “rsync算法” 来使本地和远程两个主机之间的文件达到同步,该算法只传送两个文件的不同部分,从而可以有效提高传输效率,而且本地复制文件也可以提高效率。
简介
也就是 Remote Synchronize,这是一个在 *nix
下的一个远程数据同步工具,可以通过网络快速同步多台主机间的文件和目录;而且并非每次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。
rsync 的传输效率要比 scp
高很多,其特点有:
- 可镜像保存整个目录树和文件系统;
- 可做到保持原文件的权限、时间、软硬连接等;
如下是使用的命令行参数。
$ rsync [OPTION]... SRC [USER@]HOST::DEST
$ rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
$ rsync -av user@hostname::/dir/path /local/path
rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]
参数:
--compress/-z, --compress-level=level
传输过程中是否进行数据压缩,以及指定的压缩级别;
--archive/-a, --times, --perms, --owner, --group
用于设置保留原来的更新时间戳、权限、所有者和组信息,注意,对于 -a 同时会设置 --recursive 和 --links,
相当于 -rlptgoD;
--recursive/-r VS. --dirs/-d
前者递归复制所有目录(含子目录);后者会跳过子目录及其内容;
--delete
默认从源复制到目的端时,不删除额外文件,通过该选项保证源和目标目录的内容完全一致,如果源是空,那么会
导致目的目录内容被删除;
--links/-l, --hard-links/-H, --copy-links/-L, --copy-unsafe-links, --safe-links
分别为保持符号链接、保持硬链接、复制符号链接指向的内容而非符号链接本身、如果符号链接指向源目录外则仍
复制、指向源目录外时为保证安全不复制;
--verbose, --progress, --stats
用于显示正在执行的状态,默认不打印任何信息;
--rsh/-e
默认使用的就是ssh,通过该参数强制使用,可以通过 --rsh "ssh -p 12345" 指定 ssh 的参数;
--exclude, --include
选择要同步的文件,可以指定多次,例如 --exclude "*bak" --exclude "*~" ;
示例:注意,指定时使用的是源地址的相对路径。
--exclude "checkout" 某个目录
--exclude "filename*" 某类文件
--exclude-from=sync-exclude.list 通过文件指定要忽略的文件
--update/-u
增量传输,也就是会跳过所有存在于目标,且时间较新的文件。注意,只检查文件名和最后修改时间,并不检查文
件大小,如果目的端有1M的A.txt文件,但是更新时间新于源端10M的A.txt那么本地文件不会更新;
--partial, -P
断点续传,会保留没有完全传输的文件,以加快随后的再次传输,其中 -P 相当于 --partial --progress;注意,
该参数与 -u 冲突,会导致传了一半的文件会被 rsync 跳过,详见上面的介绍;
注意: 在指定复制源时,路径是否有最后的 "/" 有不同的含义,例如:
/data :表示将整个 /data 目录复制到目标目录含改目录;
/data/ :表示将 /data/ 目录中的所有内容复制到目标目录。
传输方式
这三种传输方式的主要差异是,是否有冒号 :
,本地传送不需要冒号,通过 ssh
或 rsh
时,需要一个冒号,通过 rsync 传送需要两个冒号。
1. 复制本地文件
在本地直接运行,用法与 cp
几乎一模一样,而且同样可以利用算法提高效率。
$ rsync [OPTION]... SRC DEST
$ rsync -av /etc /tmp ← 将/etc/的资料备份到/tmp/etc內
2. 利用ssh
实际上就是使用远程 shell 程序,一般为 rsh 或者 ssh 实现内容的远程复制,通常路径地址包含单个冒号 :
分隔符时启动该模式。
$ rsync [OPTION]... SRC [USER@]host:DEST
----- 将remote-server的/etc备份到本地主机/tmp內
$ rsync -ave ssh user@remote-server:/etc /tmp
3. 使用rsync服务器
通过 rsyncd
提供的服务来传送,可以通过如下方式安装。
----- 安装并启动
# yum install rsync rsync-daemon
# systemctl start rsyncd
----- 如果无法使用可以查看防火墙配置
# systemctl stop firewalld
# getenforce
# setenforce 0
默认会启动 873 端口,此外,还需要 A) 编辑 /etc/rsyncd.conf
配置文件;B) 需要设置好客户端密码文件。
# echo "root:123456" > /etc/rsyncd.passwd
# chmod 600 /etc/rsyncd.passwd
# cat /etc/rsyncd.conf
port=873
log file=/var/log/rsync.log
[foobar]
path=/opt/foobar
read only=false
list=true
uid=root
gid=root
auth users=root
secrets file=/etc/rsyncd.passwd
use chroot=no
hosts allow=*
配置好之后就可以通过 rsync -avPz --port=873 --password-file=/etc/rsyncd.passwd /Your/Path root@YourIP::foobar/
的方式同步文件。
如果有多个不同的目录需要同步,那么可以将公共的配置放置到开始,然后每个目录配置仅保留特有的配置项。另外,每次修改完之后是无需重启服务器的。