一、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. 本地文件同步
场景:将本地目录 /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. 排除/包含特定文件
场景:同步目录时排除日志文件和临时文件
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
输出详细差异):
bash
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
实现基于硬链接的版本化备份,节省存储空间。
通过掌握上述用法,可高效利用 rsync 完成本地/远程文件同步、增量备份、服务器镜像等任务,同时避免常见陷阱。实际使用中建议根据具体场景调整参数,必要时查阅官方文档(man rsync
)获取完整选项说明。
发表评论