rsync 是 Unix 下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输量。rsync 中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。rsync 可以拷贝/显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。
安装
有的版本的 Linux 可能已经预装了 rsync,可以输入 rsync 测试,如果出现 rsync 相关的使用说明就可以不用再安装。如果出现 -bash: /usr/bin/rsync: No such file or directory 之类的提示,说明没有安装 rsync。
CentOS / Fedora 安装 rsync:
yum install -y rsync
Ubuntu / Debian 安装 rsync:
apt install -y rsync
安装完成后输入 rsync 可以查看选项说明。
使用
rsync 可以用于多台服务器之间同步文件,也可以在本机的不同目录之间同步文件。
下面把本机的一个文件拷贝到本机的另一个目录中:
rsync /home/hello.txt /root/hello.txt
上面把 home 目录中的 hello.txt 拷贝到了 root 目录中。rsync 的使用和 cp 命令差不多。
下面把本机 home 目录中的 hello.txt 拷贝到另一台服务器的 home 目录中:
rsync /home/hello.txt 172.93.47.76:/home/hello.txt
不同设备之间同步文件 文件路径前需要加 IP,IP 和路径之间用 : 分隔。不同设备之间同步文件需要输入密码才能同步。
下面把另一台服务器中的 home 目录下的 MWordStar.zip 拷贝到当前服务器的 home 目录下:
rsync 172.93.47.76:/home/MWordStar.zip /home/MWordStar.zip
选项说明
下面是 rsync 的一些常用选项:
| 选项 | 说明 |
|---|---|
-v |
显示详细信息 |
-r |
:递归目录 |
-l |
同步软链接 |
-p |
保持文件权限 |
-t |
同步文件的修改时间 |
-g |
保持文件的所属组 |
-o |
保持文件的所属用户 |
-D |
保持设备文件的信息 |
-a |
多个选项集,包含了上面的 -rlptgoD |
-z |
传输之前对文件进行压缩处理 |
--partial |
允许断点续传 |
--progress |
显示传输进度 |
-P |
允许断点续传和显示传输进度,相当于同时包含了上面的 -partial 和 -progress |
--delete |
在同步文件的时候删除多余的文件 |
--delete-after |
同步完成后删除多余的文件 |
--bwlimit |
限制传输速度 |
--include |
在同步多个文件或目录时可以指定需要同步的文件 |
--exclude |
在同步多个文件或目录时可以指定不需要同步的文件 |
下面是一些选项的详细说明:
-v
-v 选项主要就是显示详细的统计信息,如下:
rsync -v MWordStar.zip 172.93.47.76:/home/MWordStar.zip
信息统计如下:
MWordStar.zip
sent 1,198 bytes received 1,703 bytes 341.29 bytes/sec
total size is 194,160 speedup is 66.93
-r
-r 的功能就是拷贝整个目录,包括目录下的所有文件和目录。如果不加 -r 在拷贝目录的时候会提示 skipping directory dir,也无法拷贝成功。
-l
在拷贝软链接的时候需要加 -l 选项,否则就会跳过软链接,还会提示:
skipping non-regular file xxx
其中的 xxx 就是跳过的文件名。
-P
-P 的功能就是显示传输进度和允许断点续传。下面是一个包含 -P 选项被强制中断传输的文件:
BaiduNetdisk_6.8.9.1.exe
3,440,640 9% 1.23MB/s 0:00:25 ^CKilled by signal 2.
rsync error: unexplained error (code 255) at rsync.c(638) [sender=3.1.2]
rsync: [sender] write error: Broken pipe (32)
中断前的进度是 9%,如果接收方未完成的文件没有删除的话,下次再传这个文件还能从 9% 的地方开始传输。
--delete
--delete 的功能是在同步的时候删除多余文件,需要和 -r 选项一起使用。
下面让 home 目录和 downloads 目录同步,home 包含的文件如下:
.
|-- BaiduNetdisk_6.8.9.1.exe
`-- hello.txt
downloads 目录包含的文件如下:
.
└── GoogleDriveLogo.jpeg
使用 --delete 选项同步:
rsync -r --delete --progress /home/ 172.93.47.76:/downloads/
同步后 downloads 目录包含的文件如下:
.
├── BaiduNetdisk_6.8.9.1.exe
└── hello.txt
downloads 中包含的文件已经和 home 一样,多余的 GoogleDriveLogo.jpeg 已经被删除。
--delete-after
--delete-after 选项有点类似于 --delete ,都是删除多余的文件,不过 --delete-after 是在传输完成后才会删除多余文件,--delete 在传输之前就会删除多余文件。
使用 --delete-after 选项 如果中途传输中断了文件也不会被删除。
--bwlimit
--bwlimit 选项的功能是限制传输速度。对于服务器来说,限制传输速度可以降低传输文件时对网络的影响。
用法如下:
rsync --bwlimit=100 --progress /home/video.mp4 172.93.47.76:/downloads/video.mp4
上面的传输速度会被限制到 100k 每秒。
--include 和 --exclude
--include 的功能是指定需要同步的文件,--exclude 的功能是指定不需要同步的文件。这两个选项可以一起使用。
用法如下:
rsync -r --include 'h*' --exclude '*' /home/ 172.93.47.76:/downloads/
上面只会同步以 h 开头的文件。
rsync 的工作原理
rsync 的核心优势在于其增量同步技术。在同步文件时,rsync 不会每次都全量复制,而是比较源文件与目标文件的差异,只传输发生变化的部分。这一过程分为以下几个步骤:
- 1、建立连接
rsync通过指定的协议(如SSH)与远程服务器建立连接。 - 2、文件差异比较
rsync会计算源和目标文件的时间戳、大小等信息,进一步使用校验和( checksum )确认文件的实际差异。 - 3、传输差异数据
rsync通过数据块传输的方式,仅将不同部分的数据传输到目标服务器,从而提高效率。 - 4、目标端更新 文件传输完成后,目标目录的内容会根据源目录的变化进行更新。
常见同步方案
根据不同的需求,rsync支持多种同步方式。以下是几种常见的同步方案及其优缺点分析。
1、本地目录同步
本地目录同步常用于文件备份或目录复制。此方案只适用于在本地系统中进行同步。
命令示例:
rsync -av /source/dir/ /destination/dir/
优点:
- 操作简单,速度快,且不涉及网络传输。
- 完整保留文件的属性。
缺点:
- 仅适用于本地同步,无法进行远程备份。
2、远程同步( 通过 SSH )
通过 SSH,rsync 可以将本地目录与远程服务器上的目录同步,常用于远程备份和远程数据迁移。
命令示例:
rsync -avz -e ssh /source/dir/ user@remote:/destination/dir/
优点:
- 支持加密传输,数据安全性高。
- 通过增量同步,减少带宽占用,节省时间。
缺点:
- 需要确保远程服务器支持SSH并配置好相应权限。
3、双向同步
双向同步常用于两个目录之间需要保持一致性时,确保两个目录都能及时更新。
命令示例:
rsync -avz --update /source/dir/ user@remote:/destination/dir/
rsync -avz --update user@remote:/destination/dir/ /source/dir/
优点:
- 双向保持数据一致,适用于多人协作环境。
缺点:
- 需要进行两次同步,增加操作复杂度。
- 可能发生冲突,需要额外小心处理。
如何结合 SSH 进行远程同步
使用 rsync 时,通常需要通过 SSH 协议进行远程同步。SSH 不仅能够提供加密的传输通道,还能确保数据安全。
1、配置 SSH 密钥( 免密码登录 )
为了避免每次都输入密码,可以配置 SSH 密钥对进行免密码登录:
ssh-keygen -t rsa
ssh-copy-id user@remote
2、使用 rsync 通过 SSH 同步文件
命令格式如下:
rsync -avz -e ssh /source/dir/ user@remote:/destination/dir/
特殊同步需求的处理
在实际使用rsync时,有时需要根据具体需求对同步行为进行特殊配置。以下是几种常见的需求及其解决方案。
1、仅同步目标目录中不存在的文件
如果目标目录中已存在文件,且不希望覆盖它们,可以使用--ignore-existing选项,只同步源目录中目标目录中不存在的文件。
命令示例:
rsync -av --ignore-existing /source/dir/ /destination/dir/
2、不覆盖目标目录中新于源文件的文件
为了避免覆盖目标目录中较新的文件,可以使用--update选项,只同步那些源文件较新的文件。
命令示例:
rsync -av --update /source/dir/ /destination/dir/
3、同步文件的差异部分
rsync默认会进行增量同步,只传输发生变化的数据块,而不是整个文件,从而减少带宽和时间消耗。
命令示例:
rsync -avz /source/dir/ /destination/dir/
总结
rsync 是一款高效、灵活的文件同步工具,凭借其增量同步、压缩传输、支持远程协议等特性,成为文件备份、远程同步以及大规模数据迁移的理想选择。通过合理使用其各类选项,用户可以根据实际需求高效、准确地完成各种同步任务。在配置远程同步时,结合 SSH 协议不仅能提高安全性,还能确保数据传输的完整性。掌握 rsync 的使用,将使您在处理数据备份与同步时事半功倍。