首页 > 首页 > 基础理论 > Linux系统 > Rsync 命令详解与示例
2025
05-22

Rsync 命令详解与示例

一、rsync 命令核心功能与基本语法

1、核心功能

  • 增量同步:仅传输源文件与目标文件之间的差异部分,大幅减少数据传输量。
  • 跨平台支持:适用于本地文件系统、远程 SSH 或 rsync 协议连接的服务器。
  • 元数据保留:支持保留文件权限、时间戳、符号链接、硬链接等属性。
  • 灵活过滤:可通过正则表达式、排除/包含规则筛选同步文件。
  • 传输优化:支持压缩(-z)、带宽限制(--bwlimit)、断点续传(需配合工具)等。

2、基本语法

# 本地同步语法

rsync [选项] [源路径] [目标路径]

#远程同步语法(通过 SSH 协议)

rsync [选项] [源路径] [用户@]远程主机:[目标路径]
rsync [选项] [用户@]远程主机:[源路径] [目标路径]

#远程同步语法(通过 rsync 守护进程协议)

rsync [选项] rsync://远程主机模块名/[目标路径]

核心参数分类:

  • 模式参数:

-a(归档模式,等价于 -rlptgoD,保留所有元数据并递归同步)
-n/--dry-run(模拟同步,不实际传输文件,用于测试)
-v/-vv(显示详细/更详细的同步过程)

  • 传输控制:

-z(压缩传输数据,提升网络传输效率)
--delete(删除目标中源不存在的文件,实现镜像同步)
--ignore-errors(忽略文件删除/读取错误,继续同步)

  • 过滤规则:

--exclude="模式"(排除符合模式的文件/目录)
--include="模式"(强制包含符合模式的文件/目录)

  • 性能优化:

--bwlimit=KB/s(限制传输带宽,如 --bwlimit=1024)
-P(等价于 --partial --progress,显示进度并保留部分传输文件)
-D(保留设备文件和特殊文件)

二、常用用例与命令示例

1、本地文件同步

场景1:将本地目录 /data/source 同步到 /data/backup,保留所有属性并显示详细过程。

rsync -av /data/source/ /data/backup/

末尾斜杠 / 表示同步目录内的内容,目标目录不存在时会自动创建。

若源路径不带斜杠(如 /data/source),目标目录会创建以 source 为名的子目录。

2、远程同步(通过 SSH)

场景 1:本地文件上传到远程服务器

rsync -avz /local/file.txt user@remote.server:/remote/path/

-z 压缩文件,适合网络传输;远程路径需用户有权限写入。

场景 2:从远程服务器下载文件
rsync -avz user@remote.server:/remote/file.txt /local/path/

场景 3:跨服务器同步(无需本地中转)

rsync -avz -e "ssh -p 2222" user1@server1:/source/ user2@server2:/dest/

-e 指定使用 SSH 协议及端口(默认 22),支持加密传输。

3、增量备份与镜像同步

场景 1:增量备份(仅更新变化的文件,删除目标中多余文件)

rsync -av --delete /source/ /backup/

--delete 会使目标与源严格一致,谨慎用于重要数据!建议先用 --dry-run 模拟。

场景 2:保留历史版本的增量备份(使用硬链接节省空间)

rsync -av --link-dest=/backup/last/ /source/ /backup/current/

--link-dest 让新备份共享上一次备份的相同文件,仅存储差异部分。

4、包含特定文件

场景1:同步目录时排除日志文件和临时文件

rsync -av --exclude=".log" --exclude="tmp/" /data/ /backup/ 支持通配符(、?)和目录路径(如 tmp/ 表示排除整个目录)。

复杂过滤可使用 --exclude-from=文件,在文件中每行写一个排除模式:

rsync -av --exclude-from=exclude.list /source/ /dest/

5、性能优化与高级选项

限速传输(避免影响带宽):
rsync -avz --bwlimit=2048 /large_data/ remote:/storage/

校验和模式(跳过时间戳检查,确保文件内容一致):
rsync -av --checksum /source/ /dest/

保留符号链接(默认保留,若需跟随链接同步实际文件,加 --follow-symlinks):
rsync -av --follow-symlinks /source/ /dest/

三、常见问题与解决方案

1、权限问题:rsync: failed to open dir: Permission denied

原因:源/目标目录无读取/写入权限,或远程用户权限不足。

解决:
本地同步:使用 sudo 提升权限,或确保用户对路径有对应权限。
远程同步:检查远程用户是否为目录所有者,或使用 ssh-keygen 配置无密码登录避免权限中断。

2、误删文件:--delete 意外删除目标文件

预防:

永远先用 --dry-run 模拟同步,确认输出中无错误删除操作:

rsync -av --delete --dry-run /source/ /dest/

重要数据先备份目标目录,或使用 --delete-after(先传输新文件再删除,减少风险)。

3、传输中断:网络不稳定导致同步失败

解决:

使用 -P(--partial)保留未完成传输的临时文件,支持断点续传:
rsync -avP /large_file.iso remote:/dest/

若频繁中断,可搭配 rsync + nohup 或 screen 保持会话持续。

4、文件冲突:源与目标有同名但内容不同的文件

现象:rsync 默认以源文件覆盖目标文件,可能导致数据丢失。

解决:

使用 --compare-dest=参考目录 对比三方文件,优先保留最新版本(需 rsync >= 3.1.0):

rsync -av --compare-dest=/reference/ /source/ /dest/

手动检查冲突文件(通过 --itemize-changes 输出详细差异):

rsync -av --itemize-changes /source/ /dest/

5、符号链接异常:同步后链接失效或指向错误

原因:默认 rsync 保留符号链接本身,不跟随其指向的文件。

解决:

若需保留链接(推荐):无需额外参数,默认行为正确。

若需同步链接指向的实际文件:添加 --follow-symlinks,但可能导致循环链接错误。

6、元数据丢失:权限/时间戳未正确保留

原因:未使用归档模式 -a,或远程服务器限制权限写入。

解决:

始终使用 -a 或显式添加 -rltp(递归、保留符号链接、时间戳、权限)。

远程同步时,确保目标用户有 chmod/chown 权限(如使用 root 用户或 sudo)。

7、压缩无效:-z 未减少传输量

原因:传输的文件已是压缩格式(如 .zip、.tar.gz),压缩反而增加开销。

解决:对二进制或文本文件用 -z,对已压缩文件改用 -z0(最小压缩)或直接禁用 -z。

8、网络连接超时:远程主机不可达

原因:SSH 端口错误、防火墙阻止连接、主机名解析失败。

解决:

检查远程主机 IP/端口(ping remote.server 或 ssh user@remote.server -p 端口)。

添加 -e "ssh -o ConnectTimeout=10" 限制连接超时时间:

rsync -avz -e "ssh -o ConnectTimeout=10" /local/ remote:/dest/

四、最佳实践总结

测试优先:复杂同步任务先用 --dry-run 模拟,确认输出无误后再执行。

备份关键数据:对重要目录同步前,手动备份目标数据(尤其是含 --delete 的操作)。

日志记录:通过 --log-file=rsync.log 记录同步过程,方便后续审计或排错:

rsync -av --delete --log-file=sync.log /source/ /dest/

版本控制:结合 --link-dest 实现基于硬链接的版本化备份,节省存储空间。

最后编辑:
作者:摘星怪
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。