Linux 常用命令 rsync 介绍

2018-10-01 linux

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/ 目录中的所有内容复制到目标目录。

传输方式

这三种传输方式的主要差异是,是否有冒号 :,本地传送不需要冒号,通过 sshrsh 时,需要一个冒号,通过 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/ 的方式同步文件。

如果有多个不同的目录需要同步,那么可以将公共的配置放置到开始,然后每个目录配置仅保留特有的配置项。另外,每次修改完之后是无需重启服务器的。