Linux rsync 命令完全指南:从入门到精通

Linux rsync 命令完全指南:从入门到精通

Someone Lv5

一、什么是 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
# Debian/Ubuntu
sudo apt install rsync -y

# CentOS/RHEL/Rocky Linux
sudo yum install rsync -y

# Fedora
sudo dnf install rsync -y

# Arch Linux
sudo pacman -S rsync

# macOS(自带旧版,建议升级)
brew install rsync

验证安装:

1
rsync --version

三、基本语法与模式

命令格式

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/ # 把 docs/ 内容放入目标
rsync -av /home/user/docs /backup/ # 把 docs 目录整体放入目标
# 结果:/backup/docs/... 与 /backup/docs/... 内容相同

四、常用选项详解

选项完整写法说明
-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
# 使用默认 SSH 端口
rsync -avz /www/data/ root@192.168.1.100:/backup/data/

# 使用非标准 SSH 端口
rsync -avz -e "ssh -p 2222" /www/data/ root@192.168.1.100:/backup/data/

# 限制带宽为 1MB/s,避免影响线上服务
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
# 排除 node_modules 和 .git 目录
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
# 只同步 .conf 文件,排除其他所有文件
rsync -av --include='*.conf' --exclude='*' /etc/ /backup/etc-conf/

5.6 试运行(安全演练)

1
2
# 使用 -n(dry-run)查看将要执行的操作,而不实际传输
rsync -avn --delete /data/ /backup/data/

安全第一:在执行任何可能造成数据损失的 --delete 操作前,务必先 dry-run 确认

5.7 断点续传

1
2
# --partial 保留部分传输的文件,--append-verify 追加校验
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)

# 使用 SSH 密钥认证,排除缓存目录
rsync -avz --delete \
--exclude='cache/' \
--exclude='tmp/' \
--exclude='.git/' \
-e "ssh -p $REMOTE_PORT" \
$SOURCE_DIR/ \
$REMOTE_USER@$REMOTE_HOST:$BACKUP_DIR/$DATE/

# 保留最新 7 天备份,删除更早的(在远程执行)
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
# 按 MD5 校验和判断,而非文件大小+时间戳
rsync -avc --delete /data/ /backup/data/

注意--checksum 需要在两端都读取文件并计算哈希,速度比默认方式慢。

6.2 保留硬链接

1
2
# -H 保留硬链接关系
rsync -avH /data/ /backup/data/

6.3 稀疏文件处理

1
2
# 虚拟磁盘文件等稀疏文件使用 --sparse 节省空间
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
# 启动 rsync 守护进程
sudo systemctl enable rsync --now

# 或直接启动
sudo rsync --daemon --config=/etc/rsyncd.conf

客户端同步

1
2
# 不需要 SSH,直接使用 rsync 协议
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 安全最佳实践

  1. 优先使用 SSH 隧道:避免暴露 rsync 守护进程端口
  2. 配置 SSH 密钥认证:结合 ssh-agent 实现免密自动化
  3. 路径注入防护:不要在 rsync 参数中使用未经过滤的用户输入
  4. 权限最小化:远程同步使用专用用户(非 root),仅授权必要的目录
  5. 敏感文件隔离:使用 --exclude 排除 .env*.keyconfig/database.yml 等文件
  6. 日志审计:记录 rsync 操作日志用于故障排查
  7. 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 源 目标 # 限制 1MB/s

# 断点续传
rsync -av --partial --append-verify 源 目标

# 删除源文件(迁移用)
rsync -av --remove-source-files 源 目标

十、总结

rsync 是 Linux 运维中不可或缺的工具,掌握它可以大幅提升文件同步和备份的效率。关键要点:

  1. -a(归档)是核心选项,几乎每次都用
  2. 路径斜杠决定语义,带 / 拷贝内容,不带拷贝目录本身
  3. -n(dry-run)是安全网,尤其在使用 --delete
  4. 结合 SSH 和 crontab 可实现全自动备份方案
  5. --progress 加上 -v 让操作透明可追踪

将 rsync 与 cron 定时任务结合,配合 SSH 密钥认证,就能构建一套零维护、安全可靠的自动备份系统。


本文由AI辅助生成,内容仅供参考

  • 标题: Linux rsync 命令完全指南:从入门到精通
  • 作者: Someone
  • 创建于 : 2026-06-09 07:23:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-09-rsync-command-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。