scp 断了要重传 rsync 可以续传
文件传输的断点续传问题
在网络不稳定的环境下,传输大文件时经常会遇到中断。传统的 scp 命令一旦中断,再次执行只会从头开始,所有进度都会被浪费。而 rsync 则天然支持“续传”,它只会同步源和目标之间的差异部分,即使之前传输已经中断,也能从断点处继续,极大节省时间和带宽。
本教程将对比两者差异,并详细讲解如何使用 rsync 实现可靠的文件续传。
为什么 scp 无法续传
scp 基于 SSH 协议,设计目标是进行简单的、一次性的安全拷贝。它不具备:
- 状态记录:不记录已传输的数据块,也没有清单文件。
- 差异算法:不对比源和目标,只进行整体顺序传输。
- 续传机制:传输中断后,临时文件会被丢弃,重新执行就是全新拷贝。
所以当你用 scp 传输一个 10GB 的文件,在 90% 时断开,只能重头再来一遍。
rsync 的续传能力从何而来
rsync 的核心是一个高效的增量传输算法,它可以:
- 分块校验:把文件切分成多个数据块,并对每个块计算弱校验和强校验。
- 差异比对:向远端发送这些校验信息,远端计算出自己已有文件和源文件的差异部分,只发送对方缺失或不一致的数据块。
- 部分传输保留:传输中断后,
rsync默认会在目标路径留下一个后缀为.XXXXXX的临时隐藏文件(或通过--partial显式保留部分传输文件),下次运行时会自动识别并从断点继续。 - 全量匹配复用:即使目标文件不存在,只要之前保留的部分文件还在,它就可以只传输剩余部分。
这种机制使 rsync 非常适合在弱网环境或大文件远程同步场景下使用。
使用 rsync 实现断点续传
基础命令形式
rsync [选项] 源路径 目标路径
- 源或目标可以是本地路径,也可以是远程地址,格式为
user@host:path。 - 续传的关键选项是
--partial(或-P)。
必备选项解释
| 选项 | 全写 | 作用 |
|---|---|---|
-P |
--partial --progress |
保留部分传输的文件并显示进度。续传的核心参数。 |
-a |
--archive |
归档模式,相当于 -rlptgoD,保留权限、时间戳等,常用作基础同步设置。 |
-v |
--verbose |
输出详细信息,便于了解传输过程。 |
-z |
--compress |
传输时压缩数据,适合低带宽网络,但会增加 CPU 消耗。 |
--append |
假设目标文件可能比源短,仅追加缺失数据,不做校验。一般用于日志、文本等可追加的场景,断点续传时慎用(与 --partial 不同)。 |
|
--append-verify |
在 --append 的基础上还会校验已存在的内容,更安全。 |
|
--inplace |
直接在目标文件上更新(不先新建临时文件),必须和 --partial 搭配使用才能续传大文件,但有一定风险,传输中断可能导致目标文件不完整。普通续传无需该选项。 |
最常见、最安全的续传命令组合是:
rsync -avP 源路径 目标路径
实战:远程大文件续传
假设要将本地的 bigfile.iso 传送到远程服务器 192.168.1.100 的 /data/ 目录,账号为 user。
第一次传输(可能中断):
rsync -avP bigfile.iso user@192.168.1.100:/data/
执行过程中会显示进度条和传输速度。如果网络断开,进程终止,/data/ 下会留下一个名为 .bigfile.iso.XXXXXX 的临时文件(取决于系统 rsync 版本,也可能是直接保留 bigfile.iso 本身但带不完整标识)。
再次执行相同命令即可续传:
rsync -avP bigfile.iso user@192.168.1.100:/data/
rsync 会自动检测到已存在的部分文件,比对数据块后只传输缺失部分。你会看到进度条从某个非零百分比开始增长。
如果部分文件被意外删除或重命名
有时候临时文件可能被系统清理或误删,此时续传就无从谈起了。为防止这种情况,可以显式指定一个部分传输目录:
rsync -avP --partial-dir=.rsync-tmp bigfile.iso user@host:/data/
这样,中断时的部分数据会保存在远程目标目录下的 .rsync-tmp 子目录中,不会与正常文件混淆,也更容易保持续传状态。
校验式续传(确保数据完整性)
如果担心之前传输中断时损坏了已接收数据的部分块,可以增加校验:
rsync -avP --checksum bigfile.iso user@host:/data/
--checksum 会让 rsync 在比对时对整个文件进行强校验和计算,而不仅依赖时间和大小。这会增加 CPU 和初始延迟,但能确保数据绝对正确。
性能与使用建议
- 优先使用
-avP:大多数场景下已足够,兼具归档属性、进度显示和续传。 - 大文件 + 不可靠网络:添加
--partial-dir,并考虑使用--checksum定期验证。 - 不要盲目使用
--append:除非你能确定目标文件仅是源文件的未完成拷贝(如上次就是同一个rsync命令中断保留的),否则可能造成内容不匹配。 - ssh 复用连接:在 SSH 环境下多次调用
rsync时,可以通过-e "ssh -o ControlMaster=auto -o ControlPersist=60s"来复用连接,减少认证开销。
对比总结
| 特性 | scp | rsync |
|---|---|---|
| 续传支持 | 不支持,中断后重传整个文件 | 原生支持,通过块差异仅传缺失部分 |
| 差异传输 | 无 | 有,节省带宽 |
| 进度显示 | -v 只显示文件名,无百分比 |
-P 显示实时进度条 |
| 文件属性保持 | 需要 -p 手动保留时间 |
-a 默认保留全套元数据 |
| 部分传输保护 | 中断后临时文件被删 | 通过 --partial 保护中间文件 |
常见问题
Q:rsync 续传需要服务端也安装 rsync 吗?
A:是的。当使用远程传输时,源和目标两端都需要安装 rsync。对于本地拷贝则不需要。通常通过 SSH 通道时,rsync 会自动在远端调用对应的 rsync 进程。
Q:Windows 上能用吗?
A:可以通过 WSL、Cygwin 或使用 cwRsync 等工具实现类似功能。原生 Windows 环境不支持完整的 rsync,但可用 robocopy 替代,robocopy 也具备续传功能(/Z 参数)。
Q:rsync 的续传和 --partial 有什么区别?
A:--partial 是显式告诉 rsync “务必保留传输中断时的部分文件”,而 rsync 的默认行为有时也会保留临时文件,但不够可靠。为保险起见,总是加上 -P(内含 --partial)。
Q:传输中断后,重启 rsync 会重新比对整个文件吗?
A:是的,它会重新计算源文件和目标部分文件的块校验和,这个过程会消耗一些时间,但网络传输量只限于差异部分,总体依然比完整重传高效得多。