你有没有遇到过这种情况:手上有几台服务器,每天要备份数据,或者要把本地的代码同步到线上,一开始用 scp 拷来拷去,后来文件多了,每次全量传一遍实在太慢,而且传着传着还容易断,断了又得重头来。这时候就需要 Rsync 出场了。
Rsync 是个老牌工具,名字里的“sync”就是同步的意思。它最厉害的地方在于“增量”——第一次全量传完后,后面只传变化的部分,又快又省带宽。而且它能在本地同步,也能通过 SSH 远程同步,还能保留文件的权限、时间戳、软链接这些属性,简直是服务器维护的必备神器。
今天咱们就通过几个实际例子,看看 Rsync 到底怎么用,以及那些最常用的选项到底是什么意思。
先看最基本的语法:
rsync [选项] 源 目标
源和目标可以是本地路径,也可以是远程路径,远程的写法跟 scp 一样,用 `user@host:path` 的形式。比如把本地的 `/home/user/project` 同步到远程服务器的 `/backup/project`:
rsync -av /home/user/project user@192.168.1.100:/backup/project
这里用了 `-a` 和 `-v` 两个选项。`-a` 是 archive 模式,相当于组合了几个常用参数:递归同步、保留权限、保留时间戳、保留属主组等等,基本上就是想完整地复制文件结构时用的。`-v` 是 verbose,让你看到正在传输的文件列表。
那如果只想看看会传哪些文件,但先不动手呢?加个 `--dry-run` 或者 `-n` 就行,模拟运行,不实际传:
rsync -av --dry-run /home/user/project user@192.168.1.100:/backup/project
这很实用,特别是刚写命令怕弄错的时候,先预览一下要做什么。
还有一个经常用的选项是 `-z`,传输时压缩,对带宽紧张的情况很有帮助。比如:
rsync -avz /home/user/project user@192.168.1.100:/backup/project
要是文件特别大,网络又不稳定,传一半断了怎么办?Rsync 支持断点续传,加个 `-P` 参数就搞定。`-P` 其实是 `--partial --progress` 的组合,一是保留部分传输的文件(不删),二是显示传输进度。这样下次再运行同样的命令,它会接着上次的进度继续传:
rsync -avP /home/user/project user@192.168.1.100:/backup/project
还有一种场景:你想让目标目录跟源目录保持完全一致,源目录删了某个文件,目标那边也删掉。这就要用到 `--delete` 选项。比如把本地数据同步到备份盘,本地删了个旧日志,备份那边也要清理掉,不然越积越多:
rsync -av --delete /home/user/data /mnt/backup/
注意 `--delete` 要小心用,特别是远程同步时,万一源路径写错了,目标那边可能就被清空了。所以最好先 dry-run 确认一下。
有时候有些文件不想同步,比如缓存目录 `.cache`、日志文件 `*.log`,可以用 `--exclude` 排除:
rsync -av --exclude='.cache' --exclude='*.log' /home/user /mnt/backup/
也可以把要排除的规则写进文件里,用 `--exclude-from` 指定。
远程同步时,Rsync 默认走 SSH,所以只要你能 SSH 登录服务器,就能用 Rsync 传文件。为了免输密码,建议配好 SSH 密钥认证。如果你想指定 SSH 端口,比如远程的 SSH 端口是 2222,可以这样:
rsync -av -e 'ssh -p 2222' /home/user/project user@192.168.1.100:/backup/project
反过来,从远程拉取文件到本地也一样,把源和目标调换位置:
rsync -av user@192.168.1.100:/backup/project /home/user/restore/
Rsync 还有一个常见的用途是做定时增量备份。配合 cron,比如每天凌晨 2 点执行一次备份,只备份当天变动的文件。可以写个脚本,里面用 Rsync 带 `--link-dest` 做硬链接备份,这样每天看起来是一个完整备份,实际占用的磁盘空间只是增量。不过这个稍微进阶,这里就不展开了。
日常维护服务器,掌握上面这些选项基本就够用了。总结一下最常用的几个:
- `-a`:归档模式,保留文件属性
- `-v`:显示详情
- `-z`:传输时压缩
- `-P`:显示进度并支持断点续传
- `--delete`:删除目标端多余文件
- `--exclude`:排除指定文件
- `-n` 或 `--dry-run`:模拟运行,不实际传输
最后说个安全提醒:如果用 Rsync 同步系统敏感目录(比如 `/etc`),注意权限问题,确保目标路径的权限设置正确,避免把密钥文件之类的东西暴露出去。还有就是最好用普通用户运行,需要 sudo 权限的操作再用 sudo,不要一直 root 跑。
Rsync 就是这么个低调但好用的工具。不管是备份数据、同步代码,还是迁移服务器,学会了它,能省下不少手动拷贝的功夫。毕竟我们的时间,应该花在更有价值的事情上,而不是一遍遍复制粘贴。
推荐文章
