rsync同步文件到服务器,一条命令就能搞定:rsync -avz 本地目录 用户名@服务器IP:目标路径,但真正用好它,你得理解它的增量机制、删除策略和断点续传逻辑。
rsync是Linux和macOS上自带的开源同步工具,Windows用户可以通过cWrsync或WSL使用它,它最大的本事不是“复制”,而是“比对”只传输有差异的部分,所以第二次同步比第一次快得多,下面我从最基础的命令讲起,一步步带你把它用熟。
rsync同步文件到服务器命令,从入门到实战
先把最常用的命令形态写出来,你直接照着改就能用:
rsync -avz /本地/目录/ 用户名@服务器IP:/远程/目录/
这条命令的含义是:把本地目录里的所有内容,通过SSH协议(默认就是它)推到服务器的指定目录下。
几个参数拆开讲:
-a:归档模式,相当于同时开启了递归传输、保留权限、时间戳、软链接等属性,日常同步基本离不开它。-v:显示传输过程,能看到哪些文件被传了,哪些被跳过了。-z:传输时压缩,适合带宽有限的场景,但会多消耗一点CPU。
目录结尾的斜杠,决定了同步的层级结构
这是新手最容易踩的坑:
rsync -avz /本地/目录 用户名@服务器IP:/远程/目录/会把“目录”本身放进远程目录里,结果是/远程/目录/目录/rsync -avz /本地/目录/ 用户名@服务器IP:/远程/目录/只把“目录”里的内容放进远程目录,结果是/远程/目录/文件1、/远程/目录/文件2
行业共识认为,大多数人想实现的是第二种效果,也就是把本地目录里的内容同步过去,而不是多套一层目录,如果你在服务器上看到多了一层同名目录,不用怀疑,就是斜杠的位置不对。
用–dry-run预览,用–delete镜像同步
直接跑同步命令前,先加一个-n参数做演练:
rsync -avzn /本地/目录/ 用户名@服务器IP:/远程/目录/
它会列出“将要传输哪些文件”,但不会真正执行,确认无误后去掉
-n再跑。
如果你希望本地删掉的文件,服务器上也同步删除,那就加上--delete:
rsync -avz --delete /本地/目录/ 用户名@服务器IP:/远程/目录/
这个参数要谨慎使用,它会让远程目录完全镜像本地目录,本地删了什么,远程就跟着删什么,适合用来做镜像站同步或测试环境对齐,但不适合做备份因为误删本地文件后,备份也会跟着清掉。
rsync增量备份和全量备份有什么区别
rsync的核心机制是增量传输,第一次同步时,它会全量传一遍;之后每次运行,它先对比文件大小和修改时间,只有变化的文件才会重新传输,所以第二次、第三次同步会快很多,这也是rsync比scp更适合做备份的原因。
如果你想让它每次都全量传输,可以加-I参数忽略时间戳对比,或者用--checksum按校验和对比,但大多数场景下,默认的增量机制已经够用。
用rsync做定时增量备份的完整方案
一个常见的生产环境备份策略是这样的:
- 先在服务器上建好备份目录,比如
/backup/web - 本地写一个脚本,内容就是一条rsync命令
- 用crontab定时执行,比如每天凌晨2点跑一次
脚本示例:
#!/bin/bash rsync -avz --delete /var/www/html/ 用户名@服务器IP:/backup/web/
把脚本存为backup.sh,然后执行crontab -e,加入:
0 2 /path/to/backup.sh
这样每天凌晨2点,服务器上的备份目录就会和本地的站点目录保持一致。
保留多版本备份:用–link-dest做快照式备份
只做镜像同步有个问题:如果服务器上的文件被误改或误删,你想回滚到昨天的版本,就没办法了,rsync提供了一个很优雅的解决方案:--link-dest。
它的原理是:先做一次完整备份,后续备份时,把没变化的文件做成硬链接,而不是重新存储,这样每个时间点都像是一个完整备份,但实际磁盘占用只增加变化的部分。
rsync -avz --delete --link-dest=/backup/web/20260101 /var/www/html/ 用户名@服务器IP:/backup/web/20260102/
这条命令的意思是:以20260101这个备份为基础,生成20260102的新备份,没变化的文件通过硬链接指向旧文件,变化了的文件重新传输,你可以在服务器上保留多个日期的备份,而磁盘开销远小于全量备份。
rsync断点续传怎么实现,中断了不用重来
同步大文件时,网络抖动导致传输中断,重新跑一遍又得从头开始,rsync解决这个问题有两个参数:
--partial:保留部分传输的文件,下次同步时从中断处继续--append-verify:在--partial基础上,对已传输的部分做校验
实战命令:
rsync -avz --partial --append-verify /本地/大文件.tar.gz 用户名@服务器IP:/远程/目录/
第一次跑断了,文件会保留在远程服务器上,下次再跑同样的命令,它会检测到文件不完整,从断点继续传,而不是重新开始。
rsync同步慢怎么解决,先排查这五个环节
如果你发现rsync传输速度远低于带宽上限,按以下顺序排查:
- 网络本身:用
iperf3测一下服务器和本地之间的实际带宽,如果带宽就只有10Mbps,那rsync再快也快不起来。 - CPU瓶颈:
-z压缩参数在高配服务器上收益明显,但在低配机器上反而拖慢速度,可以先去掉-z试试。 - 小文件过多:rsync每个文件都有握手开销,如果目录里有几十万个小文件,速度会显著下降,可以先
tar打包再传,或者用--bwlimit限速避免影响其他业务。 - 磁盘IO:本地磁盘或服务器磁盘读写慢,同样会拖慢整体传输,用
iotop看一下磁盘占用。 - SSH加密开销:如果传输速度始终上不去,可以改用rsync的daemon模式(走873端口,不用SSH加密),速度会有明显提升,但安全性下降,只建议在内网环境用。
rsync同步常见报错,你自己就能排查
实际使用中,下面几个报错出现频率最高:
Permission denied (publickey)
SSH密钥认证失败,检查三件事:
- 本地是否生成了密钥:
ssh-keygen -t rsa -b 4096 - 公钥是否已添加到服务器的
~/.ssh/authorized_keys里 - 服务器上的
~/.ssh目录权限是否为700,authorized_keys权限是否为600
rsync: connection unexpectedly closed
可能是服务器端的rsync版本过旧,或者SSH服务限制了连接数,先在服务器上执行rsync --version确认版本,再检查/etc/ssh/sshd_config里的MaxSessions和MaxStartups配置。
同步后文件权限变了
rsync默认会保留原文件的权限和属主,但如果你用非root用户同步,可能无法保留属主,导致同步后的文件属于当前用户,解决方案是给rsync加-o和-g参数保留属主和属组,但这要求你有root权限,或者用--chown指定目标属主:
rsync -avz --chown=www:www /本地/目录/ 用户名@服务器IP:/远程/目录/
关于rsync同步文件到服务器的常见问题解答
rsync和scp有什么区别,什么时候用rsync?
scp是全量复制,每次都要把整个文件传一遍;rsync是增量同步,只传输变化的部分,对一次性小文件传输,两者差别不大;对频繁同步、大文件、目录备份这类场景,rsync完胜,rsync支持断点续传和删除同步,scp都不支持。
rsync同步文件到服务器,需要服务器端安装什么?
只需要安装rsync客户端程序,绝大多数Linux发行版默认已安装,如果没有,用apt install rsync或yum install rsync装上即可,rsync走SSH协议时,不需要在服务器上启动任何额外服务,只要SSH端口(默认22)能连通就行。
rsync能同步中文文件名吗?
可以,rsync对文件名编码没有限制,UTF-8编码的中文文件名可以正常同步,如果你在服务器上看到乱码,通常是终端编码设置问题,把本地终端编码改为UTF-8即可解决。
rsync这个工具,入门只需要一条命令,精通则需要理解它的增量机制、删除策略和参数组合,把它用好了,你就能实现高效的文件备份、网站发布和日志归集,从今天起,把你手动的scp或FTP操作,换成一条rsync命令吧。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/600928.html




