在文件传输和备份过程中,rsync 是一个非常强大的工具。它不仅能够高效地同步文件,还支持增量传输和远程拷贝等多种功能。本文将详细介绍 rsync 的用法,包括常用参数、远程同步、增量备份等内容,帮助用户更好地理解和使用这一重要工具。
rsync 是什么?
rsync(Remote Sync)是一个在 Linux/Unix 系统下用于数据镜像和备份的工具。它的主要特点是能够在本地和远程之间同步更新数据,并实现增量传输。与传统的 cp
和 scp
相比,rsync 在文件传输的速度和效率上都有显著优势。
rsync、scp、cp 与 rcp 的区别
以下是 rsync
、scp
、cp
和 rcp
之间的主要区别:
特性 |
rsync |
scp |
cp |
rcp |
增量传输 |
仅传输变更部分 |
全量复制所有数据 |
完整复制所有数据 |
全量复制所有数据 |
断点续传 |
支持 |
不支持,需重新开始 |
不支持 |
不支持 |
远程传输 |
支持本地和远程传输 |
仅支持远程传输 |
仅支持本地复制 |
仅支持远程传输 |
数据压缩 |
支持压缩传输 |
不支持 |
不支持 |
不支持 |
文件权限 |
保留文件权限和时间戳 |
保留部分权限,但不如 rsync 完整 |
保留文件权限 |
保留文件权限 |
可用协议 |
支持 rsync 协议和 SSH |
仅使用 SSH |
仅本地操作 |
使用 rcp 协议 |
使用方便性 |
可以通过丰富的参数灵活控制 |
语法简单,使用方便 |
语法简单,使用方便 |
语法简单,使用方便 |
适用场景 |
适合增量备份和大规模同步 |
适合快速复制小文件或文件夹 |
适合简单的本地文件复制 |
适合远程文件复制 |
区别总结:
rsync
是一个功能强大的文件同步工具,特别适合于增量备份和大文件传输,支持多种高级功能(如压缩、权限保留等),非常灵活。
scp
是一个简单的安全复制工具,适用于快速传输文件,但缺乏 rsync
的增量和断点续传能力,主要用于安全远程复制。
cp
是一个基本的本地复制工具,功能相对简单,适合快速复制文件和目录,但不支持远程传输、增量复制或压缩等高级功能。
rcp
(远程复制)是一个较早的远程文件复制工具,虽然支持远程传输,但由于安全性差和功能有限,现已逐渐被 scp
和 rsync
取代。
rsync 的主要特点和核心优势
- 增量备份: rsync 采用“快速检查”算法来识别已更改的文件,默认情况下,它会查找大小或最后修改时间已更改的文件。它只传输更改的部分,而不是整个文件,从而节省时间和带宽。
- 保留文件属性: rsync 可以保留符号链接、设备、所有者、组和权限等文件属性。
- 灵活的文件选择: 类似于 GNU tar,rsync 提供了 exclude 和 exclude-from 选项来排除文件和目录。它还支持 CVS 排除模式,用于忽略 CVS 会忽略的相同文件。
- 安全的远程传输: rsync 可以使用任何透明的远程 shell 程序,包括 ssh 或 rsh,以安全地传输文件。
- 无需超级用户权限: rsync 不需要超级用户权限即可运行,使其适用于各种用户和场景。
- 高效的传输: rsync 支持文件传输流水线化,以最大程度地减少延迟成本,并支持匿名或经过身份验证的 rsync 守护程序(非常适合镜像)。
rsync 的工作原理
rsync 的工作原理主要包括以下几个步骤:
- 扫描:扫描需要传输的文件列表。
- 检查:对比源和目标文件的时间戳和大小。
- 分块:将文件分割成固定大小的数据块。
- 校验:通过滚动校验算法计算数据块的特征值。
- 传输:仅传输变化的数据块。
- 重组:在目标端重组完整文件。
如何安装 rsync
在 Linux 系统中安装 rsync
对于不同的 Linux 发行版,rsync 的安装命令如下:
# Debian/Ubuntu
sudo apt-get install rsync
# CentOS/RHEL
sudo yum install rsync
在 Mac 系统中安装 rsync
在 Mac 系统中,rsync 通常预装。若需更新或重新安装,可以通过 Homebrew 安装:
在 Windows 中使用 rsync
Windows 用户可以通过以下方式使用 rsync:
- Cygwin:安装 Cygwin 并选择 rsync 包。
- WSL:使用 Windows Subsystem for Linux。
- 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 命令时不再输入密码,提升效率。
- 生成 SSH 密钥对:
- 复制公钥到远程服务器:
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 高级用法
高级功能示例
- 排除特定文件:可以使用 –exclude 参数排除不需要同步的文件:
rsync -avz --exclude='*.txt' /source/ /destination/
- 仅包含特定文件:在 /source/ 目录中查找所有 .txt 文件,并将它们复制到 /destination/ 目录中,其他类型的文件则会被排除在外
rsync -avz --include='*.txt' --exclude='*' /source/ /destination/
- 限制带宽:在带宽有限的环境下,可以使用 –bwlimit 参数限制传输速度:
rsync -avz --bwlimit=1000 /source/ /destination/
- 删除目标目录中多余的文件: 使用 –delete 参数可以删除目标目录中源目录没有的文件:
rsync -av --delete /source/ /destination/
- 模拟运行:在执行重要的同步操作前,可以先使用 –dry-run 参数进行模拟运行:
rsync -av --dry-run /source/ /destination/
rsync 实用场景
- 服务器备份
rsync -av --delete /var/www/ /backup/www/
- 异地容灾
rsync -av --compress --delete /重要数据/ disaster_recovery:/backup/
- 定时同步
结合 crontab 可以实现定时同步:
# 每天凌晨 3 点进行同步
0 3 * * * rsync -av --delete /源目录/ /目标目录/ >> /var/log/rsync.log 2>&1
注意事项
- 使用 –delete 参数时要格外小心,建议先用 –dry-run 测试
- 在进行大量文件传输时,建议使用 screen 或 tmux 等工具在后台运行
- 传输敏感数据时,确保使用 SSH 通道进行加密传输
- 定期检查同步日志,及时发现问题
rsync 服务器配置
- 编辑配置文件:
- 配置示例:
[share]
path = /path/to/share
read only = yes
auth users = rsyncuser
secrets file = /etc/rsyncd.secrets
常见问题解答
- 如何解决权限问题?
- 使用
sudo
运行 rsync。
- 检查文件系统权限。
- 验证 SSH 密钥权限。
- 如何应对网络问题?
- 添加
--timeout
参数。
- 使用
-P
参数支持断点续传。
- 检查防火墙设置。
- 如何优化 rsync 性能?
- 使用
-z
参数进行数据压缩。
- 调整
--bwlimit
限制带宽。
- 合理设置
--block-size
。
资源与链接
总结
rsync 是一个功能强大的文件同步工具,掌握它的使用方法对于系统运维工作来说非常重要。它不仅可以提高文件传输效率,还能保证数据的完整性和安全性。通过本文介绍的这些用法和技巧,相信读者已经能够熟练运用 rsync 来解决日常工作中的文件同步需求了。
最后,建议大家在实际使用中多尝试不同的参数组合,找到最适合自己需求的使用方式。同时,也要注意备份重要数据,防止误操作造成数据丢失。