Linux rsync 命令完全指南:从入门到精通
一、什么是 rsync
rsync(remote sync)是 Linux/Unix 系统下最强大的文件同步和备份工具之一。它由 Andrew Tridgell 和 Paul Mackerras 于 1996 年开发,以其高效的增量传输算法而闻名——只传输文件中发生变化的部分,而非整个文件,从而大幅节省带宽和时间。
核心特性
- 增量传输:使用「滚动校验」算法,仅同步文件变更的块
- 支持本地和远程同步:可通过 SSH 或 rsync 守护进程传输
- 保留文件属性:权限、时间戳、属主、软链接、设备文件等
- 断点续传:传输中断后可继续
- 压缩传输:使用
-z 参数压缩数据,节省带宽
- 排除模式:灵活的文件过滤规则
- 安全可靠:基于 SSH 的加密传输
二、安装 rsync
大多数 Linux 发行版默认已安装 rsync,如果没有,可通过包管理器安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| sudo apt install rsync -y
sudo yum install rsync -y
sudo dnf install rsync -y
sudo pacman -S rsync
brew install rsync
|
验证安装:
三、基本语法与模式
命令格式
1 2 3
| rsync [选项] 源路径 目标路径 rsync [选项] 源路径 用户@主机:目标路径 rsync [选项] 用户@主机:源路径 目标路径
|
三种工作模式
| 模式 |
命令示例 |
适用场景 |
| 本地同步 |
rsync -av /data/ /backup/ |
本地磁盘备份 |
| 远程推送 |
rsync -av /data/ user@server:/backup/ |
本地到远程备份 |
| 远程拉取 |
rsync -av user@server:/data/ /backup/ |
远程到本地备份 |
路径结尾斜杠的重要性
- 带斜杠
src/:同步目录内容到目标
- 不带斜杠
src:将目录本身(连同目录名)同步到目标
1 2 3 4
| rsync -av /home/user/docs/ /backup/docs/ rsync -av /home/user/docs /backup/
|
四、常用选项详解
| 选项 | 完整写法 | 说明 |
-v | --verbose | 显示详细输出 |
-q | --quiet | 静默模式,减少输出 |
-a | --archive | 归档模式,等价于 -rlptgoD(递归+保留权限/时间/属主/组/设备/特殊文件) |
-r | --recursive | 递归同步子目录 |
-l | --links | 保留符号链接 |
-p | --perms | 保留文件权限 |
-t | --times | 保留修改时间 |
-o | --owner | 保留属主(需要 root) |
-g | --group | 保留属组 |
-D | --devices --specials | 保留设备文件和特殊文件 |
-z | --compress | 传输时压缩数据 |
-h | --human-readable | 数字以人类可读格式显示 |
-n | --dry-run | 试运行,不实际传输 |
--delete | — | 删除目标端多余文件(使目标与源完全一致) |
--exclude | — | 排除匹配模式的文件 |
--include | — | 包含匹配模式的文件 |
--progress | — | 显示传输进度 |
--bwlimit | — | 限制带宽,单位 KB/s |
--partial | — | 保留部分传输的文件(断点续传) |
-e | --rsh | 指定远程 shell,如 -e "ssh -p 2222" |
--checksum | — | 基于校验和(而非时间戳+大小)判断文件变化 |
--remove-source-files | — | 传输成功后删除源文件(类似 mv) |
黄金搭档:rsync -avz 是最常用的组合,适用于大多数场景。
五、实战场景
5.1 本地目录备份
1 2 3 4 5 6 7 8
| rsync -av /home/user/documents/ /backup/documents/
rsync -avh --progress /home/user/documents/ /backup/documents/
rsync -avh --delete /home/user/documents/ /backup/documents/
|
5.2 远程服务器备份(推送到远程)
1 2 3 4 5 6 7 8
| rsync -avz /www/data/ root@192.168.1.100:/backup/data/
rsync -avz -e "ssh -p 2222" /www/data/ root@192.168.1.100:/backup/data/
rsync -avz --bwlimit=1024 /www/data/ root@192.168.1.100:/backup/data/
|
远程同步前,建议先配置 SSH 密钥认证,避免每次输入密码。
5.3 从远程拉取数据
1 2 3 4 5
| rsync -avz user@server:/var/log/nginx/ /local/logs/nginx/
rsync -avz --partial user@server:/backup/mysql/ /local/db-backup/
|
5.4 文件排除
1 2 3 4 5
| rsync -av --exclude='node_modules' --exclude='.git' /project/ /backup/project/
rsync -av --exclude-from='/path/to/exclude.txt' /project/ /backup/project/
|
exclude.txt 示例内容:
1 2 3 4 5 6
| *.log *.tmp node_modules/ .git/ cache/ .DS_Store
|
5.5 文件包含 + 排除
1 2
| rsync -av --include='*.conf' --exclude='*' /etc/ /backup/etc-conf/
|
5.6 试运行(安全演练)
1 2
| rsync -avn --delete /data/ /backup/data/
|
安全第一:在执行任何可能造成数据损失的 --delete 操作前,务必先 dry-run 确认。
5.7 断点续传
1 2
| rsync -avz --partial --append-verify bigfile.iso root@server:/downloads/
|
5.8 备份网站数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #!/bin/bash
BACKUP_DIR="/backup/web" SOURCE_DIR="/var/www/html" REMOTE_USER="root" REMOTE_HOST="backup-server.example.com" REMOTE_PORT="22" DATE=$(date +%Y%m%d)
rsync -avz --delete \ --exclude='cache/' \ --exclude='tmp/' \ --exclude='.git/' \ -e "ssh -p $REMOTE_PORT" \ $SOURCE_DIR/ \ $REMOTE_USER@$REMOTE_HOST:$BACKUP_DIR/$DATE/
ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST \ "find $BACKUP_DIR -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;"
|
5.9 实时文件同步(结合 inotify)
使用 inotifywait(需安装 inotify-tools)实现近乎实时的文件同步:
1 2 3 4 5 6 7 8 9
| #!/bin/bash
WATCH_DIR="/www/project" REMOTE="root@server:/backup/project"
inotifywait -mrq -e modify,create,delete,move $WATCH_DIR --format '%w%f' | while read FILE do rsync -avz --delete $WATCH_DIR/ $REMOTE/ done
|
六、高级用法
6.1 使用校验和代替时间戳
当文件的修改时间可能被改变但内容未变时,使用 --checksum 确保按内容判断:
1 2
| rsync -avc --delete /data/ /backup/data/
|
注意:--checksum 需要在两端都读取文件并计算哈希,速度比默认方式慢。
6.2 保留硬链接
1 2
| rsync -avH /data/ /backup/data/
|
6.3 稀疏文件处理
1 2
| rsync -avS /vm-images/ /backup/vm-images/
|
6.4 使用 rsync 守护进程模式
rsync 也可以作为守护进程运行(默认端口 873),适合更高效的批量同步:
服务端配置 /etc/rsyncd.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| uid = nobody gid = nogroup use chroot = yes max connections = 10 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsync.log
[backup] path = /backup/data comment = Data Backup read only = yes list = yes auth users = backupuser secrets file = /etc/rsyncd.secrets
|
启动服务:
1 2 3 4 5
| sudo systemctl enable rsync --now
sudo rsync --daemon --config=/etc/rsyncd.conf
|
客户端同步:
1 2
| rsync -av backupuser@server::backup/ /local/backup/
|
6.5 多级排除与包含
1 2 3 4 5 6 7 8 9 10 11
| rsync -av \ --exclude='node_modules/' \ --exclude='dist/' \ --exclude='.git/' \ --exclude='*.swp' \ --exclude='*.log' \ --include='/config/' \ --include='/config/*.yml' \ --exclude='*' \ /project/ /backup/project/
|
七、性能调优与最佳实践
7.1 传输加速技巧
| 场景 | 推荐参数 | 说明 |
| 局域网大批量小文件 | -avz | 压缩可减少 I/O 次数 |
| 广域网大文件 | -avP --partial | 带进度显示和断点续传 |
| 海量文件(千万级) | -av --delete-delay | 延迟删除减少 I/O 风暴 |
| 首次全量同步 | -av --whole-file | 不比较差异直接传输整个文件(首次更快) |
| 高延迟网络 | -avz --bwlimit=0 | 不限制带宽 + 压缩 |
7.2 安全最佳实践
- 优先使用 SSH 隧道:避免暴露 rsync 守护进程端口
- 配置 SSH 密钥认证:结合
ssh-agent 实现免密自动化
- 路径注入防护:不要在 rsync 参数中使用未经过滤的用户输入
- 权限最小化:远程同步使用专用用户(非 root),仅授权必要的目录
- 敏感文件隔离:使用
--exclude 排除 .env、*.key、config/database.yml 等文件
- 日志审计:记录 rsync 操作日志用于故障排查
- dry-run 先行:任何
--delete 操作前先 dry-run
八、常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
| 权限被拒绝 | 目标目录无写入权限 | 检查目录权限,或使用 sudo rsync;远程端检查 SSH 密钥权限(chmod 600 ~/.ssh/id_rsa) |
| 符号链接被作为普通文件复制 | 未使用 -l 或 -a | 添加 -l 或直接使用 -a |
| 文件被重复传输 | 时间戳或时区不一致 | 使用 -t 保留时间戳;使用 --checksum 按内容判断 |
| 传输速度很慢 | 未启用压缩或带宽受限 | 添加 -z 压缩;检查 --bwlimit 是否设置过低 |
| SSH 连接失败 | 端口不对或密钥无效 | 使用 -e "ssh -p 2222 -v" 调试连接 |
| 目标文件意外被删除 | --delete 与路径斜杠组合不当 | 务必先 dry-run,确认路径匹配无误 |
| 中文字符乱码 | 文件系统编码不一致 | 使用 --iconv=UTF-8,GBK 进行字符集转换 |
九、rsync 速查表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| rsync -avzh --progress 源 目标
rsync -avz --delete -e "ssh -p 2222" /local/ user@host:/remote/
rsync -avz user@host:/remote/ /local/
rsync -avn --delete 源 目标
rsync -av --exclude='*.tmp' --exclude='cache/' 源 目标
rsync -avn --checksum 源 目标
rsync -av --bwlimit=1024 源 目标
rsync -av --partial --append-verify 源 目标
rsync -av --remove-source-files 源 目标
|
十、总结
rsync 是 Linux 运维中不可或缺的工具,掌握它可以大幅提升文件同步和备份的效率。关键要点:
-a(归档)是核心选项,几乎每次都用
- 路径斜杠决定语义,带
/ 拷贝内容,不带拷贝目录本身
-n(dry-run)是安全网,尤其在使用 --delete 时
- 结合 SSH 和 crontab 可实现全自动备份方案
--progress 加上 -v 让操作透明可追踪
将 rsync 与 cron 定时任务结合,配合 SSH 密钥认证,就能构建一套零维护、安全可靠的自动备份系统。
本文由AI辅助生成,内容仅供参考