李守中

Rsync 工具笔记

Table of Contents

1 简介

rsync 意为远程同步 remote sync ,是一个用于文件同步的 Linux 应用程序。

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。也可以当作文件复制工具,替代 cp 和 mv 命令。

不能控制两台远程计算机之间的同步。 SCP 可以。

与其他文件传输工具 ( 如 FTP 或 scp ) 不同,rsync 的最大特点是会检查发送方和接收方已有的文件, 传输有变动的部分 ( 默认规则是 文件大小修改时间 有变动 )。

2 本地同步

rsync 几个主要参数的用法:

  • -r 本机使用时,可作为 cp 和 mv 命令的替代方法,将源目录拷贝到目标目录:
    • rsync -r <source> <destination> 中的 -r 是必须的,否则 rsync 运行不会成功。
    • rsync -r <source1> <source2> <destination> 中的 <source1> <source2> 都会被同步到 <destination> 目录。
  • -a 可以替代 -r ,除了可以递归同步以外,还可以同步元信息 ( 比如修改时间、权限等 ):
    • rsync 默认使用 文件大小修改时间 决定文件是否需要更新,多数时候 -a-r 更有用。
    • rsync -a <source> <destination><destination> 下创建 <source> 并同步其中的文件。
    • rsync -a <source>/ <destination> 只同步 <source> 里的文件到 <destination> 不创建文件夹。
  • -n = --dry-run 模拟执行结果,并不真的执行命令:
    • rsync -anv <source>/ <destination>-n 参数模拟命令执行的结果, -v 参数将结果输出到终端,这样就可以看到哪些内容会被同步。
  • --delete 使得目标目录成为源目录的镜像副本:
    • 即删除只存在于目标目录、不存在于源目录的文件。
    • 默认情况下,rsync 只确保源目录的所有内容 ( 明确排除的文件除外 ) 都复制到目标目录。 它不会使两个目录保持相同,也不会删除目标目录的文件。
    • rsync -av --delete <source>/ <destination> 上面命令中, --delet 参数使得 <destination> 成为 <source> 的镜像。
  • --exclude 同步时排除文件或目录
  • --include 指定必须同步的文件 ,优先级高于 --exclude ,往往与 --exclude 结合使用。
排除所有 .txt 文件
rsync -av --exclude='*.txt' source/ destination
rsync -av --exclude '*.txt' source/ destination

排除隐藏文件。rsync 默认会同步以 . 开头的隐藏文件。
--exclude=".*"

排除某个目录里面的所有文件,但不希望排除目录本身。
--exclude 'dir1/*'

多个排除模式,可以用多个 --exclude 参数。
--exclude 'file1.txt' --exclude 'dir1/*'

多个排除模式也可以利用 Bash 的大扩号的扩展功能。
--exclude={'file1.txt','dir1/*'} 

多个排除模式被写入一个文件,每个模式一行。
--exclude-from='exclude-file.txt'

排除所有文件,但是会同步 *.txt 文件。
--include="*.txt" --exclude='*'

3 远程同步

传输的双方都必须安装 rsync。

如果使用 SSH 协议传输文件,那么传输过程会被 SSH 加密,还可以配置 Nginx 作为反向代理,通过 Strem 进行转发过程中可以对连接再进行 TLS 加密。

如果使用 rsync 后台进程 ( 使用 rsync 自有协议 ),那么传输过程无法加密。**不建议使用 rsync 协议进行公网环境的数据传输。**

3.1 SSH 协议

rsync 除了支持本地两个目录之间的同步,也支持远程同步:

  • rsync -av <source> <username>@<remote_host>:<destination> 将本地内容同步到远程机器。
  • rsync -av <username>@<remote_host>:<source> <destination> 将远程内容同步到本地机器。

rsync 默认使用 SSH 进行远程登录和数据传输。

早期 rsync 不默认使用 SSH 协议,需要用 -e 参数指定协议,后来才将 SSH 设为默认协议。

所以 rsync -av -e ssh <source> <user>@<remote_host>:<destination> 中的 -e ssh 可以省略。

但如果 ssh 命令有附加参数,则必须使用 -e 参数指定所要执行的 SSH 命令: rsync -av -e 'ssh -p 2234' <source> <user>@<remote_host>:<destination>-e 参数指定 SSH 使用 2234 端口。

3.2 rsync 后台进程

在使用 initd 的系统中,编辑配置文件 sudo vim /etc/default/rsyncRSYNC_ENABLE=false 改为 RSYNC_ENABLE=true 可以让 rsync 守护程序开机启动。

在使用 systemd 的系统中,执行 sudo systemctl enable rsync 可以让 rsync 守护程序开机启动。

如果服务器安装并运行了 rsync 守护程序,也可以用 rsync:// 协议进行传输,默认端口 873:

  • 将本地内容同步到远程机器:
    • rsync -av <source> <ip>::<module>/<destination>
    • rsync -av <source> rsync://<ip>/<module>/<destination>
  • 将远程内容同步到本地机器:
    • rsync -av <ip>::<module>/<source> <destination>
    • rsync -av rsync://<ip>/<module>/<source> <destination>

注意,地址中的 <module> 不是实际路径名,而是 rsync 守护程序指定的资源名,在配置文件中指定。

rsync rsync://<ip> 可以列出 rsync 守护程序分配的所有 module 列表。

4 增量备份

rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。

除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。

具体做法是:

  • 第一次同步是全量备份,所有文件在基准目录里面同步一份。
  • 从第二次开始,每次同步只同步源目录与基准目录之间有变动的部分,将这部分保存在新的目录中。
  • 这个新的目录之中,只有那些变动过的文件真正存在于该目录,没有变动的文件都是指向基准目录文件的硬链接。

--link-dest 参数用来指定同步时的基准目录。

rsync -a --delete --link-dest <base-path> <source-path> <target-path>--link-dest 参数指定基准目录 <base-path> ,源目录 <source-path> 跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录 <target-path> 。没变动的文件则会被替换成硬链接。

下面是一个脚本示例,备份用户的主目录。

#!/bin/bash

# A script to perform incremental backups using rsync

set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"

mkdir -p "${BACKUP_DIR}"

rsync -av --delete \
  "${SOURCE_DIR}/" \
  --link-dest "${LATEST_LINK}" \
  --exclude=".cache" \
  "${BACKUP_PATH}"

rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"

上面脚本中,每一次同步都生成一个新目录 ${BACKUP_DIR}/${DATETIME} ,并将软链接 ${BACKUP_DIR}/latest 指向该目录。下一次备份将 ${BACKUP_DIR}/latest 作为基准目录,生成新的备份目录。最后,再将软链接 ${BACKUP_DIR}/latest 指向新的备份目录。

5 配置项

  • -r 参数表示递归,即包含子目录。
  • -a --archive 表示存档模式,保存所有的元数据,比如修改时间 ( modification time )、权限、所有者等,并且软链接要被同步。可以替代 -r
  • -z 参数指定同步时压缩数据。
  • -m 指定不同步空目录。
  • --progress 显示进度。
  • --append 参数指定文件接着上次中断的地方,继续传输。
  • --append-verify--append 参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。
  • -P 参数是 --progress--partial 这两个参数的结合。
    • --partial 允许恢复中断的传输。不使用该参数时,rsync 会删除被打断传输过程的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与 --append--append-verify 配合使用。
    • --partial-dir 参数指定将传输到一半的文件保存到一个临时目录。一般需要与 --append--append-verify 配合使用。
  • -c --checksum 改变 rsync 的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化。使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。
  • -b --backup 指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份 ( 默认行为是删除 )。更名规则是,添加由 --suffix 参数指定的文件后缀名,默认是 ~
  • --backup-dir 指定文件备份时存放的目录,比如 --backup-dir=/path/to/backups
  • --bwlimit 参数指定带宽限制,默认单位是 KB/s=,比如 =--bwlimit=100
  • --delete 删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。
  • -e 指定使用 SSH 协议传输数据。
  • --exclude 指定排除不进行同步的文件。
  • --exclude-from 指定一个本地文件,里面是需要排除的文件模式,每个模式一行。
  • --existing --ignore-non-existing 表示不同步目标目录中不存在的文件和目录。
  • -h 参数表示以人类可读的格式输出。
  • -h --help 返回帮助信息。
  • -i 表示输出源目录与目标目录之间文件差异的详细情况。
  • --ignore-existing 表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。
  • --include 指定同步时要包括的文件,一般与 --exclude 结合使用。
  • --link-dest 参数指定增量备份的基准目录。
  • --max-size 设置传输的最大文件的大小限制,比如 --max-size='200k' 不超过 200KB。
  • --min-size 设置传输的最小文件的大小限制,比如 --min-size=10k 不小于 10KB。
  • -n--dry-run 参数模拟将要执行的操作,而并不真的执行。配合 -v 参数使用,可以看到哪些内容会被影响。
  • --remove-source-files 表示传输成功后,删除发送方的文件。
  • --size-only 表示只同步大小有变化的文件,不考虑文件修改时间的差异。
  • --suffix 指定文件名备份时,对文件名添加的后缀,默认是 ~
  • -u --update 同步时跳过目标目录中修改时间变化的文件,即不同步这些有更新的时间戳的文件。
  • -v 表示输出细节。 -vv 表示输出更详细的信息, -vvv 表示输出最详细的信息。
  • --version 返回 rsync 的版本。


Last Update: 2023-05-18 Thu 08:54

Contact: [email protected]     Generated by: Emacs 27.1 (Org mode 9.3)

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议