在文件传输和备份过程中,rsync 是一个非常强大的工具。它不仅能够高效地同步文件,还支持增量传输和远程拷贝等多种功能。本文将详细介绍 rsync 的用法,包括常用参数、远程同步、增量备份等内容,帮助用户更好地理解和使用这一重要工具。

rsync 是什么?

rsync(Remote Sync)是一个在 Linux/Unix 系统下用于数据镜像和备份的工具。它的主要特点是能够在本地和远程之间同步更新数据,并实现增量传输。与传统的 cpscp 相比,rsync 在文件传输的速度和效率上都有显著优势。

rsync、scp、cp 与 rcp 的区别

以下是 rsyncscpcprcp 之间的主要区别:

特性rsyncscpcprcp
增量传输仅传输变更部分全量复制所有数据完整复制所有数据全量复制所有数据
断点续传支持不支持,需重新开始不支持不支持
远程传输支持本地和远程传输仅支持远程传输仅支持本地复制仅支持远程传输
数据压缩支持压缩传输不支持不支持不支持
文件权限保留文件权限和时间戳保留部分权限,但不如 rsync 完整保留文件权限保留文件权限
可用协议支持 rsync 协议和 SSH仅使用 SSH仅本地操作使用 rcp 协议
使用方便性可以通过丰富的参数灵活控制语法简单,使用方便语法简单,使用方便语法简单,使用方便
适用场景适合增量备份和大规模同步适合快速复制小文件或文件夹适合简单的本地文件复制适合远程文件复制

区别总结:

  • rsync 是一个功能强大的文件同步工具,特别适合于增量备份和大文件传输,支持多种高级功能(如压缩、权限保留等),非常灵活。
  • scp 是一个简单的安全复制工具,适用于快速传输文件,但缺乏 rsync 的增量和断点续传能力,主要用于安全远程复制。
  • cp 是一个基本的本地复制工具,功能相对简单,适合快速复制文件和目录,但不支持远程传输、增量复制或压缩等高级功能。
  • rcp(远程复制)是一个较早的远程文件复制工具,虽然支持远程传输,但由于安全性差和功能有限,现已逐渐被 scprsync 取代。

rsync 的主要特点和核心优势

  • 增量备份: rsync 采用“快速检查”算法来识别已更改的文件,默认情况下,它会查找大小或最后修改时间已更改的文件。它只传输更改的部分,而不是整个文件,从而节省时间和带宽。
  • 保留文件属性: rsync 可以保留符号链接、设备、所有者、组和权限等文件属性。
  • 灵活的文件选择: 类似于 GNU tar,rsync 提供了 exclude 和 exclude-from 选项来排除文件和目录。它还支持 CVS 排除模式,用于忽略 CVS 会忽略的相同文件。
  • 安全的远程传输: rsync 可以使用任何透明的远程 shell 程序,包括 ssh 或 rsh,以安全地传输文件。
  • 无需超级用户权限: rsync 不需要超级用户权限即可运行,使其适用于各种用户和场景。
  • 高效的传输: rsync 支持文件传输流水线化,以最大程度地减少延迟成本,并支持匿名或经过身份验证的 rsync 守护程序(非常适合镜像)。

rsync 的工作原理

rsync 的工作原理主要包括以下几个步骤:

  1. 扫描:扫描需要传输的文件列表。
  2. 检查:对比源和目标文件的时间戳和大小。
  3. 分块:将文件分割成固定大小的数据块。
  4. 校验:通过滚动校验算法计算数据块的特征值。
  5. 传输:仅传输变化的数据块。
  6. 重组:在目标端重组完整文件。

如何安装 rsync

在 Linux 系统中安装 rsync

对于不同的 Linux 发行版,rsync 的安装命令如下:

# Debian/Ubuntu
sudo apt-get install rsync

# CentOS/RHEL
sudo yum install rsync

在 Mac 系统中安装 rsync

在 Mac 系统中,rsync 通常预装。若需更新或重新安装,可以通过 Homebrew 安装:

brew install rsync

在 Windows 中使用 rsync

Windows 用户可以通过以下方式使用 rsync:

  1. Cygwin:安装 Cygwin 并选择 rsync 包。
  2. WSL:使用 Windows Subsystem for Linux。
  3. cwRsync:安装 cwRsync 客户端。

rsync 命令的基本用法

rsync 命令的基本语法如下:

rsync [OPTION]... SRC [SRC]... DEST
  • SRC:源文件或目录。
  • DEST:目标文件或目录。

示例命令

以下命令将本地目录 /home/user/data/ 中的文件同步到远程服务器 user@remote_host:/remote/backup/

rsync -avz /home/user/data/ user@remote_host:/remote/backup/

rsync 命令参数详解

rsync 提供了丰富的参数选项,下面是一些常用参数的说明:

常用参数

rsync 拥有大量的选项,以下列举一些常用选项:

  • -a, –archive: 归档模式,相当于 -rlptgoD。
  • -v, –verbose: 增加输出信息。
  • -r, –recursive: 递归复制目录。
  • -u, –update: 仅更新目标端较旧的文件。
  • -z, –compress: 在传输过程中压缩文件数据。
  • -n, –dry-run: 执行试运行,不进行实际更改。
  • -P:显示进度并支持断点续传。
  • –delete: 删除目标端存在而源端不存在的文件。
  • –exclude=PATTERN: 排除匹配 PATTERN 的文件。
  • –include=PATTERN: 包含匹配 PATTERN 的文件。

使用 –delete 选项时要格外小心,因为它可能会意外删除文件。建议先使用 –dry-run 选项进行测试。

如果遇到 “protocol version mismatch” 错误信息,通常是由于启动脚本或远程 shell 工具在 rsync 使用的传输流上产生了垃圾数据。

参数使用示例

# 基本用法
rsync -avz source/ destination/

# 显示进度
rsync -avP source/ destination/

# 删除目标目录中多余的文件
rsync -avz --delete source/ destination/

rsync 全部参数解释

点击查看 rsync 全部参数解释
  • -v, –verbose: 增加输出的详细程度。
  • –info=FLAGS: 控制输出的详细信息级别。
  • –debug=FLAGS: 控制调试输出的级别。
  • –stderr: 更改 stderr 输出模式。
  • -q, –quiet: 禁止非错误消息。
  • –no-motd: 禁止守护进程模式下的 MOTD。
  • -c, –checksum: 基于校验和而不是修改时间和大小来跳过文件。
  • -a, –archive: 归档模式,相当于 -rlptgoD
  • –no-OPTION: 关闭隐含的选项。
  • -r, –recursive: 递归复制目录。
  • -R, –relative: 使用相对路径名。
  • –no-implied-dirs: 使用 --relative 时不发送隐含目录。
  • -b, –backup: 创建备份。
  • –backup-dir: 指定备份目录。
  • –suffix: 指定备份后缀。
  • -u, –update: 跳过接收端较新的文件。
  • –inplace: 就地更新目标文件。
  • –append: 将数据追加到较短的文件中。
  • –append-verify: 使用文件中旧数据的校验和进行追加。
  • -d, –dirs: 传输目录而不进行递归。
  • –old-dirs, –old-d: 与旧版 rsync 通信时,其功能类似于 --dirs
  • –mkpath: 创建目标路径中缺少的路径组件。
  • -l, –links: 将符号链接复制为符号链接。
  • -L, –copy-links: 将符号链接转换为引用文件/目录。
  • –copy-unsafe-links: 仅转换“不安全”的符号链接。
  • –safe-links: 忽略指向树外部的符号链接。
  • –munge-links: 修改符号链接以使其安全且不可用。
  • -k, –copy-dirlinks: 将指向目录的符号链接转换为引用目录。
  • -K, –keep-dirlinks: 将接收端的符号链接目录视为目录。
  • -H, –hard-links: 保留硬链接。
  • -p, –perms: 保留权限。
  • -E, –executability: 保留可执行性。
  • –chmod: 影响文件和/或目录权限。
  • -A, –acls: 保留 ACL。
  • -X, –xattrs: 保留扩展属性。
  • -o, –owner: 保留所有者(仅限超级用户)。
  • -g, –group: 保留组。
  • –devices: 保留设备文件(仅限超级用户)。
  • –copy-devices: 将设备内容复制为常规文件。
  • –write-devices: 将数据写入设备文件(意味着 --inplace)。
  • –specials: 保留特殊文件。
  • -D: 与 --devices --specials 相同。
  • -t, –times: 保留修改时间。
  • -U, –atimes: 保留访问时间。
  • –open-noatime: 避免更改已打开文件的访问时间。
  • -N, –crtimes: 保留创建时间。
  • -O, –omit-dir-times: 从 --times 中省略目录。
  • -J, –omit-link-times: 从 --times 中省略符号链接。
  • -S, –sparse: 将零序列转换为稀疏块。
  • –preallocate: 在写入数据之前分配目标文件。
  • -n, –dry-run: 执行试运行,不进行任何更改。
  • -W, –whole-file: 完整复制文件(不使用增量传输算法)。
  • –checksum-choice: 选择校验和算法。
  • -x, –one-file-system: 不跨越文件系统边界。
  • -B, –block-size: 强制使用固定的校验和块大小。
  • -e, –rsh: 指定要使用的远程 shell。
  • –rsync-path: 指定要在远程机器上运行的 rsync
  • –existing: 跳过在接收端创建新文件。
  • –ignore-existing: 跳过更新接收端已存在的文件。
  • –remove-source-files: 发送端删除已同步的文件(非目录)。
  • –del: --delete-during 的别名。
  • –delete: 从目标目录中删除无关的文件。
  • –delete-before: 接收端在传输之前删除文件,而不是在传输期间删除。
  • –delete-during: 接收端在传输期间删除文件。
  • –delete-delay: 在传输期间查找要删除的文件,并在传输之后删除它们。
  • –delete-after: 接收端在传输之后删除文件,而不是在传输期间删除。
  • –delete-excluded: 还从目标目录中删除排除的文件。
  • –ignore-missing-args: 忽略缺少的源参数,不报错。
  • –delete-missing-args: 从目标中删除缺少的源参数。
  • –ignore-errors: 即使出现 I/O 错误也删除文件。
  • –force: 即使目录不为空也强制删除它们。
  • –max-delete: 不删除超过指定数量的文件。
  • –max-size: 不传输大于指定大小的文件。
  • –min-size: 不传输小于指定大小的文件。
  • –max-alloc: 更改与内存分配相关的限制。
  • –partial: 保留部分传输的文件。
  • –partial-dir: 将部分传输的文件放入指定目录。
  • –delay-updates: 将所有更新的文件放在最后。
  • -m, –prune-empty-dirs: 从文件列表中删除空目录链。
  • –numeric-ids: 不按用户名/组名映射 uid/gid 值。
  • –usermap: 自定义用户名映射。
  • –groupmap: 自定义组名映射。
  • –chown: 简单的用户名/组名映射。
  • –timeout: 设置 I/O 超时时间(以秒为单位)。
  • –contimeout: 设置守护进程连接超时时间(以秒为单位)。
  • -I, –ignore-times: 不要跳过大小和时间匹配的文件。
  • –size-only: 跳过大小匹配的文件。
  • -@, –modify-window: 设置修改时间比较的精度。
  • -T, –temp-dir: 在指定目录中创建临时文件。
  • -y, –fuzzy: 如果没有目标文件,则查找相似的文件作为基础。
  • –compare-dest: 还比较相对于指定目录的目标文件。
  • –copy-dest: 包含未更改文件的副本。
  • –link-dest: 当文件未更改时,硬链接到指定目录中的文件。
  • -z, –compress: 在传输过程中压缩文件数据。
  • –compress-choice: 选择压缩算法。
  • –compress-level: 显式设置压缩级别。
  • –skip-compress: 跳过压缩具有指定后缀的文件。
  • -C, –cvs-exclude: 以与 CVS 相同的方式自动忽略文件。
  • -f, –filter: 添加文件过滤规则。
  • -F: 与 --filter='dir-merge /.rsync-filter' 相同,重复使用相当于 --filter='- .rsync-filter'
  • –exclude: 排除与指定模式匹配的文件。
  • –exclude-from: 从文件中读取排除模式。
  • –include: 不要排除与指定模式匹配的文件。
  • –include-from: 从文件中读取包含模式。
  • –files-from: 从文件中读取源文件名列表。
  • -0, –from0: 所有 *-from/filter 文件都以 0 分隔。
  • –old-args: 禁用现代参数保护习惯用法。
  • -s, –secluded-args: 使用协议安全地发送参数。
  • –trust-sender: 信任远程发送者的文件列表。
  • –copy-as: 指定用于复制的用户和可选组。
  • –address: 绑定到守护进程的传出套接字的地址。
  • –port: 指定双冒号备用端口号。
  • –sockopts: 指定自定义 TCP 选项。
  • –blocking-io: 为远程 shell 使用阻塞 I/O。
  • –outbuf: 设置输出缓冲为 None、Line 或 Block。
  • –stats: 提供一些文件传输统计信息。
  • -8, –8-bit-output: 在输出中保留高位字符,不进行转义。
  • -h, –human-readable: 以人类可读格式输出数字。
  • -P: 与 --partial --progress 相同。
  • -i, –itemize-changes: 为所有更新输出更改摘要。
  • -M, –remote-option: 仅将选项发送到远程端。
  • –out-format: 使用指定的格式输出更新。
  • –log-file: 将我们正在做的事情记录到指定的文件中。
  • –log-file-format: 使用指定的格式记录更新。
  • –password-file: 从文件中读取守护进程访问密码。
  • –early-input: 将文件用于守护进程的早期执行输入。
  • –list-only: 列出文件而不是复制它们。
  • –bwlimit: 限制套接字 I/O 带宽。
  • –stop-after: 在经过指定分钟数后停止 rsync
  • –stop-at: 在指定时间点停止 rsync
  • –fsync: 对每个写入的文件执行 fsync 操作。
  • –write-batch: 将批处理更新写入文件。
  • –only-write-batch: 类似于 --write-batch,但在创建批处理时不更新目标。
  • –read-batch: 从文件中读取批处理更新。
  • –protocol: 强制使用较旧的协议版本。
  • –iconv: 请求文件名字符集转换。
  • –checksum-seed: 设置块/文件校验和种子(高级)。
  • -4, –ipv4: 优先使用 IPv4。
  • -6, –ipv6: 优先使用 IPv6。
  • -V, –version: 打印版本和其他信息并退出。
  • -h, –help: 显示帮助信息。

rsync 的远程同步功能

使用 rsync 进行远程同步是其一大优势。通过 SSH 协议,可以安全地将文件从本地机器传输到远程服务器,或从远程服务器下载文件到本地。远程传输有两种方式:通过 SSH 或者 rsync 守护进程。

通过 SSH 传输远程拷贝文件示例

# 从远程拉取文件到本地
rsync -av username@remote_host:/源目录/ /本地目录/

# 从本地推送文件到远程
rsync -av /本地目录/ username@remote_host:/远程目录/

通过 rsync 守护进程传输

# 从远程拉取文件到本地
rsync -av username@remote_host::module_name/源目录/ /本地目录/

# 从本地推送文件到远程
rsync -av /本地目录/ username@remote_host::module_name/远程目录/

配置免密传输

为简化远程同步过程,用户可以设置 SSH 的免密登录。通过生成 SSH 密钥对,并将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中,用户就可以在执行 rsync 命令时不再输入密码,提升效率。

  1. 生成 SSH 密钥对:
ssh-keygen -t rsa
  1. 复制公钥到远程服务器:
ssh-copy-id user@remote

rsync 的增量传输模式

rsync 的增量传输功能使其在备份和同步中的表现尤为突出。相较于传统的文件传输方法,rsync 只在源文件发生更改时才传输变更部分,从而显著提高效率。增量传输可以通过简单的 rsync 基本命令实现。

增量备份脚本示例

#!/bin/bash
# 增量备份脚本
rsync -avz --backup --backup-dir=/backup/$(date +%Y-%m-%d) /source/ /destination/

增量备份参数说明

  • –backup:创建备份。
  • –backup-dir:指定备份目录。
  • –link-dest:硬链接到已有备份。
  • –compare-dest:比较目标目录。

rsync 高级用法

高级功能示例

  1. 排除特定文件:可以使用 –exclude 参数排除不需要同步的文件:
rsync -avz --exclude='*.txt' /source/ /destination/
  1. 仅包含特定文件:在 /source/ 目录中查找所有 .txt 文件,并将它们复制到 /destination/ 目录中,其他类型的文件则会被排除在外
rsync -avz --include='*.txt' --exclude='*' /source/ /destination/
  1. 限制带宽:在带宽有限的环境下,可以使用 –bwlimit 参数限制传输速度:
rsync -avz --bwlimit=1000 /source/ /destination/
  1. 删除目标目录中多余的文件: 使用 –delete 参数可以删除目标目录中源目录没有的文件:
rsync -av --delete /source/ /destination/
  1. 模拟运行:在执行重要的同步操作前,可以先使用 –dry-run 参数进行模拟运行:
rsync -av --dry-run /source/ /destination/

rsync 过滤规则

rsync 的过滤规则通过 --filter 选项或 --exclude--include--exclude-from--include-from 等选项进行配置。过滤规则使用简单的模式匹配,支持通配符和一些特殊符号。

过滤规则的基本格式如下

+<PATTERN>     # 包含匹配模式的文件
-<PATTERN>     # 排除匹配模式的文件

常用的过滤规则选项

  1. --include=<PATTERN>:
    • 指定要包含的文件或目录。例如,--include='*.txt' 表示所有 .txt 文件都会被包含在传输中。
  2. --exclude=<PATTERN>:
    • 指定要排除的文件或目录。例如,--exclude='*.log' 表示所有 .log 文件都不会被传输。
  3. --include-from=<FILE>:
    • 从指定文件中读取包含的模式,文件中每一行都可以是一个模式。
  4. --exclude-from=<FILE>:
    • 从指定文件中读取排除的模式,格式同上。
  5. --filter=<RULE>:
    • 添加自定义的过滤规则,可以使用正则表达式或简单模式。
    • 规则可以通过多个 --filter 选项组合使用。

过滤模式中的通配符

  • *:匹配零个或多个字符,例如,*.txt 匹配所有以 .txt 结尾的文件。
  • ?:匹配一个字符,例如,file?.txt 匹配 file1.txtfile2.txt 等。
  • [abc]:匹配方括号内的任意字符,例如,file[1-3].txt 匹配 file1.txtfile2.txtfile3.txt
  • **:匹配任意数量的目录。例如,**/logs/ 匹配所有子目录中的 logs 目录。

过滤规则的优先级

rsync 中的过滤规则是按顺序处理的,从上到下进行匹配。可以使用 +- 指定具体的包含或排除规则。规则的执行顺序非常重要,后面的规则可以覆盖前面的规则。

rsync 实用场景

  1. 服务器备份
rsync -av --delete /var/www/ /backup/www/
  1. 异地容灾
rsync -av --compress --delete /重要数据/ disaster_recovery:/backup/
  1. 定时同步

结合 crontab 可以实现定时同步:

# 每天凌晨 3 点进行同步
0 3 * * * rsync -av --delete /源目录/ /目标目录/ >> /var/log/rsync.log 2>&1

注意事项

  • 使用 –delete 参数时要格外小心,建议先用 –dry-run 测试
  • 在进行大量文件传输时,建议使用 screen 或 tmux 等工具在后台运行
  • 传输敏感数据时,确保使用 SSH 通道进行加密传输
  • 定期检查同步日志,及时发现问题

rsync 服务器配置

  1. 编辑配置文件:
vim /etc/rsyncd.conf
  1. 配置示例:
[share]
    path = /path/to/share
    read only = yes
    auth users = rsyncuser
    secrets file = /etc/rsyncd.secrets

常见问题解答

  1. 如何解决权限问题?
    • 使用 sudo 运行 rsync。
    • 检查文件系统权限。
    • 验证 SSH 密钥权限。
  2. 如何应对网络问题?
    • 添加 --timeout 参数。
    • 使用 -P 参数支持断点续传。
    • 检查防火墙设置。
  3. 如何优化 rsync 性能?
    • 使用 -z 参数进行数据压缩。
    • 调整 --bwlimit 限制带宽。
    • 合理设置 --block-size

资源与链接

总结

rsync 是一个功能强大的文件同步工具,掌握它的使用方法对于系统运维工作来说非常重要。它不仅可以提高文件传输效率,还能保证数据的完整性和安全性。通过本文介绍的这些用法和技巧,相信读者已经能够熟练运用 rsync 来解决日常工作中的文件同步需求了。

最后,建议大家在实际使用中多尝试不同的参数组合,找到最适合自己需求的使用方式。同时,也要注意备份重要数据,防止误操作造成数据丢失。


也可以看看