rsync 默认基于文件大小和修改时间增量同步,用 -a --delete 保持一致;mtime 不可靠时加 --checksum;排除文件用 --exclude,慎用 --delete-excluded;断点续传需 --partial --inplace;ssh 密钥应限制命令范围确保安全。

rsync 怎么只传变化的文件,不重复拷贝整个目录
rsync 默认就是增量同步,但前提是得用对参数。核心是 --archive(或简写 -a)配合 --delete(如果要保持目标完全一致),它靠文件大小 + 修改时间(mtime)判断是否跳过。如果源文件只是内容变了但 mtime 没更新(比如某些容器内操作、NFS 挂载点),就会漏同步。
- 用
--checksum强制按内容比对:慢但准,适合 mtime 不可靠场景 - 避免单独用
--update:它只跳过「目标更新时间比源新」的文件,容易误判 - 注意时区和系统时间偏差:源和目标机器时间差超过 2 秒,mtime 判断就可能出错
示例:rsync -a --delete --checksum /data/ user@backup:/backup/data/
排除临时文件和日志,但又不误删目标端已有文件
--exclude 和 --delete-excluded 容易混淆。前者只是不同步匹配项,后者会把目标端已存在、但当前被 exclude 的文件删掉——这很危险。
- 排除但保留目标端旧文件:只用
--exclude='*.log'或--exclude='/tmp/' - 真要清理目标端的排除项:加
--delete-excluded,但务必搭配--dry-run先预览 - 排除规则路径以
/开头表示从根开始(相对于同步路径),不加则是通配匹配所有层级
常见误配:--exclude 'log/' 会匹配 /var/log/ 和 /app/logs/,而 --exclude '/log/' 只匹配同步根下的 log/ 目录
备份大文件时断网重连,怎么续传不从头开始
rsync 本身不支持断点续传大文件(比如单个 50GB 的虚拟机镜像),因为默认用的是「整体文件校验 + 整体传输」逻辑。但可以靠两个参数缓解:
-
--partial:传输中断后保留已传部分,下次接着传(关键) -
--progress:看实时进度,方便判断是否卡住 - 必须配合
--inplace才能真正覆盖原文件(否则 rsync 先写临时文件再 rename,续传时临时文件名变了就失效)
注意:--inplace 有风险——传输中文件处于损坏状态,且不支持硬链接保全;生产环境慎用,优先考虑分卷压缩或改用 rsync --append-verify(适用于追加型文件如日志)
远程备份走 SSH,怎么避免每次输密码还保证密钥安全
直接写密码在脚本里是反模式。正确做法是用 SSH 密钥 + 限制命令执行范围。
- 生成无口令密钥:
ssh-keygen -t ed25519 -f ~/.ssh/rsync_backup - 在目标服务器的
~/.ssh/authorized_keys中,给公钥加命令前缀:command="rsync --server --sender -vlogDtpre.iLs . /data",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...
- 这样即使密钥泄露,攻击者也只能执行这条 rsync 命令,不能登录 shell
别漏掉 --rsync-path:如果目标 rsync 不在 $PATH 默认位置,要用 rsync -e "ssh -i ~/.ssh/rsync_backup" --rsync-path="/usr/local/bin/rsync" ...
实际用的时候,最常被忽略的是 mtime 同步前提和 SSH 命令白名单的组合——一个影响数据一致性,一个影响安全性,两者都松动,备份就既不可信也不可控。










