迁移网站、传输备份压缩包或同步服务器文件时,最让人头疼的情况之一,就是文件传到一半,网络突然中断。
对于较大的文件,重新完整上传可能需要很长时间。使用 rsync 时,可以提前保留未传完的数据,连接恢复后重新执行命令,利用已有内容继续完成传输。
本文以两台 Linux 服务器之间通过 SSH 传输文件为例,介绍 rsync 的安装、路径填写、断点续传和文件校验方法。
1. rsync如何继续传输未完成的文件?
rsync 会比较源文件与目标端已有的数据,通过差异传输减少重复发送的内容。
本次使用以下参数保留中断时的部分文件:
--partial-dir=.rsync-partial
它会将未传完的内容保存在目标端对应的临时子目录中。下次执行传输时,rsync 可以利用这些数据继续完成文件传输。
这个参数应在第一次开始传输时就加上。 如果上一次没有保留部分文件,之后补加参数也无法找回已经被清除的数据。
本教程适合传输普通文件、网站静态资源,以及已经生成完成的备份压缩包。正在运行的数据库,应先通过数据库自身支持的方式生成一致性备份,再传输备份文件。
2. 安装工具并确认连接
本次示例约定如下:
| 项目 | 示例内容 |
|---|---|
| 源服务器目录 | /data/project/ |
| 目标服务器IP | 203.0.113.10 |
| 目标服务器SSH用户 | root |
| SSH端口 | 22 |
| 目标接收目录 | /backup/ |
203.0.113.10 是文档示例地址,必须替换为实际服务器IP。用户名、端口和目录也需要按实际情况修改。
目标目录建议使用专门的接收目录,已有同名文件时,应确认这些文件允许被更新。
迁移到莱卡云 Linux 云服务器时,可以先完成文件传输与校验,再安排业务切换。
查看官网购买链接: https://www.lcayun.com
9折优惠码:bloglcayun
2.1 两台服务器都安装rsync
在 Debian 或 Ubuntu 上,分别执行:
sudo apt-get update
sudo apt-get install -y rsync openssh-client
如果已经使用 root 登录,可以省略 sudo。
然后检查版本:
rsync --version
源服务器和目标服务器都需要安装 rsync。 通过 SSH 传输时,目标服务器也会运行 rsync 进程。
2.2 从源服务器检查目标连接
从这一步开始,后续命令均在源服务器终端执行。
先检查能否通过 SSH 调用目标服务器上的 rsync:
ssh -p 22 root@203.0.113.10 'rsync --version'
将示例信息替换后,如果能够正常显示远端版本,再创建目标接收目录:
ssh -p 22 root@203.0.113.10 'mkdir -p /backup'
这里的目录创建操作实际发生在目标服务器上。
如果 SSH 使用其他端口,后续所有命令中的 22 都要同步修改。使用普通账户时,目标目录需要是该账户有权限写入的位置。
3. 源目录末尾的斜杠有什么区别?
rsync 命令中,源目录末尾是否带 /,会影响目标目录层级。
假设源文件为:
/data/project/readme.txt
并且目标目录 /backup/ 已经存在:
| 源目录写法 | 复制内容 | 目标文件位置 |
|---|---|---|
/data/project/ | project目录里面的内容 | /backup/readme.txt |
/data/project | project目录本身 | /backup/project/readme.txt |
本教程使用:
/data/project/
因此,文件会直接进入目标 /backup/ 目录,不会额外增加一层 project。这一行为也与 rsync 官方文档对源目录末尾斜杠的说明一致。
正式传输前,应先确认自己需要哪一种目录结构。

4. 先预演,再开始正式传输
4.1 预演需要同步的内容
在源服务器执行:
rsync -avhn --itemize-changes \
--partial-dir=.rsync-partial \
-e 'ssh -p 22' \
/data/project/ \
root@203.0.113.10:/backup/
这里的 -n 表示预演,用于查看计划执行的同步操作,不会实际复制文件。
重点检查:
- 源目录是否正确。
- 目标服务器IP是否正确。
- 目标目录是否正确。
- 列出的文件是否属于本次传输范围。
预演可以帮助发现路径错误,但不能代替实际写入和传输验证。
4.2 开始正式传输
确认无误后,执行:
rsync -avh \
--partial-dir=.rsync-partial \
--info=progress2 \
-e 'ssh -p 22' \
/data/project/ \
root@203.0.113.10:/backup/
主要参数说明:
| 参数 | 作用 |
|---|---|
-a | 归档模式,递归复制并尽可能保留常见文件属性 |
-v | 显示详细信息 |
-h | 使用更易读的数字单位 |
--partial-dir=.rsync-partial | 保留未传完的部分文件 |
--info=progress2 | 显示整体传输进度 |
-e 'ssh -p 22' | 使用SSH,并指定连接端口 |
-a 并不代表完整复制所有文件系统属性。实际保留效果还取决于账户权限和文件系统;完整系统迁移需要另行考虑 ACL、扩展属性及硬链接等内容。
5. 传输中断后怎么继续?
如果传输过程中网络中断,先恢复源服务器到目标服务器的 SSH 连接。
然后在源服务器重新执行同一条命令:
rsync -avh \
--partial-dir=.rsync-partial \
--info=progress2 \
-e 'ssh -p 22' \
/data/project/ \
root@203.0.113.10:/backup/
保持源目录、目标目录和相关参数一致,并保留目标端的 .rsync-partial 数据。
对于需要更新的文件,rsync 会重新比较已有数据。进度显示可能重新计算,因此不能只看百分比是否从上次的位置开始。
保留部分文件不等于自动重连。 本文命令在连接失败退出后,需要再次执行。
任务结束后,紧接着运行:
echo $?
这是查看上一条命令的退出状态:
0:本次 rsync 任务成功结束。- 非
0:查看上方错误信息,确认原因后再处理。
不要先执行其他命令再查看 $?,否则得到的是其他命令的结果。
如果传输期间源文件仍在变化,可能需要再次同步。对于网站迁移,应根据业务情况安排最后一次同步和切换时间。
6. 传完后如何校验文件?

传输结束后,建议对重要压缩包、数据库导出文件等进行额外校验。
例如,本次传输的关键文件是:
/data/project/backup.tar.gz
先在源服务器计算 SHA256:
sha256sum /data/project/backup.tar.gz
再从源服务器调用目标服务器,计算接收文件的 SHA256:
ssh -p 22 root@203.0.113.10 \
'sha256sum /backup/backup.tar.gz'
将文件路径替换为真实路径。
比较两条命令输出前面的完整哈希值。对于同一个、内容已经固定的文件,两端 SHA256 一致,可以作为传输后内容一致的校验依据。sha256sum 是 GNU Coreutils 提供的 SHA-2 校验工具之一。
注意以下几点:
- 比较的是完整哈希值,文件路径可以不同。
- 校验期间不要继续修改源文件。
- 校验一个文件,只能说明该文件的结果。
- 校验大文件需要读取完整内容,耗时与文件大小和磁盘速度有关。
如果传输的是网站文件,还应检查网站能否正常访问、上传目录权限是否正确,以及程序能否连接数据库。
可以继续参考本站的 网站迁移前如何测试新服务器,在修改公共 DNS 前先验证新服务器。
7. 常见问题排查
7.1 提示rsync找不到
如果出现:
rsync: command not found
检查本机和远端是否都已经安装 rsync。
可以在源服务器分别执行:
rsync --version
ssh -p 22 root@203.0.113.10 'rsync --version'
这样能够区分是本机缺少命令,还是远端缺少命令。
7.2 提示Permission denied
先确认错误发生在哪个阶段:
| 现象 | 检查方向 |
|---|---|
| SSH登录时被拒绝 | 登录用户、密码或密钥、SSH登录配置 |
| 无法读取源文件 | 当前账户对源文件的读取权限 |
| 无法创建目标文件 | 目标目录的所有者及写入权限 |
| 无法设置文件属性 | 接收账户权限与目标文件系统能力 |
根据具体路径调整权限,避免直接对整个目录执行 chmod 777。
7.3 出现退出码23或24
- 退出码23: 部分传输因错误未完成,应查看具体报错文件和原因。
- 退出码24: 传输期间部分源文件消失,常见于源目录仍在变化的场景。
重要文件传输不能只看到部分文件已经出现,就忽略错误码。
7.4 为什么没有看到.rsync-partial目录?
它主要用于保存未完成文件,正常完成后相关临时数据会被清理。另外,以英文句点开头的目录属于隐藏目录。
检查时可以通过 SSH 查看目标目录:
ssh -p 22 root@203.0.113.10 'ls -la /backup'
子目录里的文件中断时,部分文件目录也可能出现在对应子目录下。
7.5 能不能直接加上–append?
普通目录同步继续使用本文命令即可。
--append 和 --append-verify 有特定使用条件,主要针对已知只会继续增长的文件,不适合作为所有文件的通用续传选项。
8. 写在最后
使用 rsync 传输大文件时,提前保留部分文件,可以减少网络中断后重复传输的成本。操作时应先确认目录层级,通过预演核对范围,再开始正式传输。
中断后保留已有数据,重新执行相同命令;完成后检查退出状态,并对关键文件进行 SHA256 校验。
如果后续要把文件同步安排成定时任务,可以参考本站的 Linux定时任务不执行怎么办?Cron常见问题排查。用于备份时,还应保留多个历史版本,避免只剩一份不断被更新的副本。








