介绍
Rsync,代表remote sync,是一个远程和本地文件同步工具。 它使用一种算法,通过仅移动已更改的文件部分来最小化复制的数据量。
在本教程中,我们将定义 Rsync,回顾使用 rsync
时的语法,解释如何使用 Rsync 与远程系统同步,以及其他可用的选项。
先决条件
为了练习使用 rsync
在本地和远程系统之间同步文件,您需要两台机器分别充当本地计算机和远程计算机。 这两台机器可以是虚拟专用服务器、虚拟机、容器或个人计算机,只要它们已正确配置即可。
如果您打算使用服务器来遵循本指南,那么谨慎的做法是使用管理用户设置它们并在每个用户上配置防火墙。 要设置这些服务器,请按照我们的 初始服务器设置指南 。
无论您使用什么类型的机器来学习本教程,您都需要在这两台机器上创建 SSH 密钥。 然后,将每个服务器的公钥复制到其他服务器的 authorized_keys
文件中,如该指南 的 步骤 2 中所述。
本指南已在运行 Ubuntu 20.04 的计算机上进行了验证,尽管它通常应该适用于运行基于 Linux 的操作系统且安装了 rsync
的任何计算机。
定义 Rsync
Rsync 是一个非常灵活的网络同步工具。 由于它在 Linux 和类 Unix 系统上无处不在,并且作为系统脚本工具很受欢迎,因此默认情况下它包含在大多数 Linux 发行版中。
了解 Rsync 语法
rsync
的语法与其他工具类似,例如 ssh
、scp
和 cp
。
首先,通过运行以下命令切换到您的主目录:
cd ~
然后创建一个测试目录:
mkdir dir1
创建另一个测试目录:
mkdir dir2
现在添加一些测试文件:
touch dir1/file{1..100}
现在有一个名为 dir1
的目录,其中包含 100 个空文件。 通过列出文件进行确认:
ls dir1
Outputfile1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
您还有一个名为 dir2
的空目录。 要在同一系统上同步 dir1
到 dir2
的内容,您将运行 rsync
并使用 -r
标志,它代表“递归”和目录同步是必需的:
rsync -r dir1/ dir2
另一种选择是使用 -a
标志,它是一个组合标志,代表“归档”。 此标志以递归方式同步并保留符号链接、特殊和设备文件、修改时间、组、所有者和权限。 它比 -r
更常用,是推荐使用的标志。 运行与上一个示例相同的命令,这次使用 -a
标志:
rsync -a dir1/ dir2
请注意,在前两个命令的语法中,第一个参数的末尾有一个斜杠 (/
),并在此处突出显示:
rsync -a dir1/ dir2
这个尾部斜杠表示 dir1
的内容。 如果没有尾部斜杠,dir1
,包括目录,将被放置在 dir2
中。 结果将创建一个如下所示的层次结构:
~/dir2/dir1/[files]
另一个提示是在执行 rsync
命令之前仔细检查您的参数。 Rsync 提供了一种通过传递 -n
或 --dry-run
选项来执行此操作的方法。 -v
标志,意思是“详细”,也是获得适当输出所必需的。 您将在以下命令中组合 a
、n
和 v
标志:
rsync -anv dir1/ dir2
Outputsending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . .
现在将该输出与删除尾部斜杠时收到的输出进行比较,如下所示:
rsync -anv dir1 dir2
Outputsending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . .
此输出现在表明目录本身已被传输,而不仅仅是目录中的文件。
使用 Rsync 与远程系统同步
要使用 rsync
与远程系统同步,您只需要在本地和远程计算机之间配置 SSH 访问权限,以及在两个系统上安装 rsync
。 在两台机器之间验证 SSH 访问后,您可以使用以下语法将上一节中的 dir1
文件夹同步到远程机器。 请注意,在这种情况下,您要传输实际目录,因此您将省略尾部斜杠:
rsync -a ~/dir1 username@remote_host:destination_directory
此过程称为 push 操作,因为它将目录从本地系统“推送”到远程系统。 相反的操作是pull,用于将远程目录同步到本地系统。 如果 dir1
目录位于远程系统而不是本地系统上,则语法如下:
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
与 cp
和类似工具一样,源始终是第一个参数,目标始终是第二个。
- 使用其他 Rsync 选项
Rsync 提供了许多用于更改实用程序默认行为的选项,例如您在上一节中了解的标志选项。
如果您正在传输尚未压缩的文件,例如文本文件,您可以通过使用 -z
选项添加压缩来减少网络传输:
rsync -az source destination
-P
标志也很有帮助。 它结合了标志 --progress
和 --partial
。 第一个标志为传输提供进度条,第二个标志允许您恢复中断的传输:
rsync -azP source destination
Outputsending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .
如果您再次运行该命令,您将收到一个缩短的输出,因为没有进行任何更改。 这说明了 Rsync 使用修改时间来确定是否进行了更改的能力:
rsync -azP source destination
Outputsending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00
假设您要使用如下命令更新某些文件的修改时间:
touch dir1/file{1..10}
然后,如果您要再次运行 rsync
和 -azP
,您会在输出中注意到 Rsync 如何智能地仅重新复制更改的文件:
rsync -azP source destination
Outputsending incremental file list file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101) file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101) . . .
为了使两个目录真正保持同步,如果从源目录中删除了文件,则必须从目标目录中删除它们。 默认情况下,rsync
不会从目标目录中删除任何内容。
您可以使用 --delete
选项更改此行为。 在使用此选项之前,您可以使用 -n
、--dry-run
选项进行测试,以防止不必要的数据丢失:
rsync -an --delete source destination
如果您希望排除位于您正在同步的目录中的某些文件或目录,您可以通过在 --exclude=
选项后面的逗号分隔列表中指定它们来执行此操作:
rsync -a --exclude=pattern_to_exclude source destination
如果您有要排除的指定模式,您可以使用 --include=
选项为匹配不同模式的文件覆盖该排除:
rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
最后,Rsync 的 --backup
选项可用于存储重要文件的备份。 它与 --backup-dir
选项一起使用,该选项指定应存储备份文件的目录:
rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
结论
Rsync 可以简化通过网络连接的文件传输,并增加本地目录同步的稳健性。 Rsync 的灵活性使其成为许多不同文件级操作的理想选择。
掌握 Rsync 可以让您设计复杂的备份操作,并获得对传输方式和传输内容的细粒度控制。