在不同的机器和服务器之间进行数据同步是一个常见的场景,也有不同的命令工具(如 scp、FTP 等),甚至是不同的图形界面软件(如 Termius 等)可供我们选择操作。本文记录的 rsync (remote sync)也是用于文件同步的工具之一,其最大的特点是会检查发送方和接收已有的文件,并仅传输有变动的部分rsync 不仅可以在本地不同的目录之间使用,同时也支持本地主机与远程服务器之间进行数据同步。由于其具有仅传输变动增量备份断点续传等特点,在一些场景下非常实用。本文记录了其一些常见的用法,主要关注其在本地主机与远程主机之间同步的操作。

在使用 rysnc 之前需要确保本地和远程主机都安装了 rsync,可通过 rsync --version 检查是否安装,如果没有,可使用下面的命令进行安装:

sudo apt-get install rsync  # ubuntu
brew install rsync          # macOS

rsync 的基本使用如下:

rsync -av [source] [destination]

-a: 表示递归同步,并同步元信息
-v: 输出到终端

如果目标位置不存在,执行上诉命令之后将会自动创建。

常用参数

-n

如果不确定执行 rsync 会有什么结果,可以使用该参数查看执行后的结果,并不真正执行命令。

yandaojiang@Daojiang-macbook-pro
  • [ydj-macbook-pro ~ % rsync -anv ./Desktop ubuntu@110.42.182.66:~/
  • sending incremental file list
  • Desktop/
  • Desktop/.DS_Store
  • Desktop/.localized
  • Desktop/截屏2023-03-06 14.40.26.png
  • sent 179 bytes  received 29 bytes  83.20 bytes/sec
  • total size is 600,104  speedup is 2,885.12 (DRY RUN)
  • [ydj-macbook-pro ~ %

--delete

默认情况下,rsync 只是将源目录的所有内容都复制到目标目录,并不会保证两个目录相同,也不会删除文件。因此,如果是想要构建源目录的镜像就需要使用 --delete 参数,这样保证目标目录和源目录相同。

--exclude

--exclude参数用于排除文件或者目录,利用该参数指定排除模式。排除多个模式的文件时,可以使用 Bash 的扩展功能。如果需要排除的文件数量比较多,那么可以将其需要排除的文件所对应的模式写入文件,每个模式负责一行,然后利用 --exclude-from 参数指定文件。

--exclude 参数所类似的有 --include 参数,用于指定必须同步的文件,二者一般联合使用。

增量备份

rsync 的最大特点就是它可以完成增量备份。除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。

具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。

--link-dest参数用来指定同步时的基准目录。该 Bash 脚本记录了一个在远程目录之间利用基准目录增量备份的例子。

参考

[1] rsync 用法教程. https://www.ruanyifeng.com/blog/2020/08/rsync.html.