Linux rsync命令详解

rsync是一个快速、多功能、安全的文件同步工具,它可以在本地或远程系统之间同步文件和目录,支持增量备份,只传输有变化的文件部分,大大提高了同步效率。

核心特点:增量同步 | 保持权限 | 支持符号链接 | SSH加密传输 | 远程同步 | 断点续传

核心特性

增量同步

只传输有变化的文件部分,大大减少数据传输量

权限保持

保留文件权限、时间戳、所有者等属性

双向同步

支持本地到远程、远程到本地、远程到远程同步

安装方法

Ubuntu/Debian
sudo apt update
sudo apt install rsync
CentOS/RHEL
sudo yum install rsync
# 或
sudo dnf install rsync
macOS
# 已经内置
# 如需最新版本
brew install rsync
Windows
# 通过WSL或Cygwin使用
# 或使用cwRsync客户端

基本语法

rsync [选项] 源文件 目标文件

常用选项

选项 描述 记忆
-a, --archive 归档模式,等同于-rlptgoD(递归+保持属性) archive
-v, --verbose 详细输出模式,显示同步过程 verbose
-z, --compress 传输时压缩数据 compress
-r, --recursive 递归同步子目录 recursive
-t, --times 保持文件修改时间 times
-p, --perms 保持文件权限 permissions
-g, --group 保持文件属组 group
-o, --owner 保持文件属主(需root权限) owner
-l, --links 保持符号链接 links
-D, --devices 保持设备文件(需root权限) devices
--delete 删除目标目录中源目录没有的文件 delete
--exclude 排除指定文件或目录 exclude
--progress 显示传输进度 progress
-h, --human-readable 以易读格式显示数字 human
-e, --rsh 指定远程shell(如ssh) remote shell
-P 等同于--partial --progress Partial+Progress
--partial 保留部分传输的文件(断点续传) partial
--bwlimit 限制传输带宽 bandwidth limit
-n, --dry-run 模拟运行,不实际传输 dry run

本地同步示例

基础同步 同步目录到备份目录

使用归档模式同步目录:

# 同步目录(保留所有属性)
rsync -av /source/directory/ /backup/directory/

# 注意:源目录结尾的/表示同步目录内容,而不是目录本身
rsync -av /source/directory /backup/    # 创建directory子目录
rsync -av /source/directory/ /backup/   # 只同步内容到backup
镜像同步 保持目标与源完全一致

使用--delete删除目标中多余的文件:

# 镜像同步(目标与源完全一致)
rsync -av --delete /source/directory/ /backup/directory/

# 先模拟运行,确认无误后再执行
rsync -av --delete --dry-run /source/ /backup/
进度显示 显示详细传输进度

使用-P显示传输进度和部分文件:

# 显示进度和断点续传
rsync -avP /large/source/ /destination/

# 限制传输速度为1MB/s
rsync -avP --bwlimit=1024 /source/ /destination/

SSH远程同步

SSH加密传输
# 本地同步到远程
rsync -avz -e ssh /local/directory/ user@remote_host:/remote/directory/

# 远程同步到本地
rsync -avz -e ssh user@remote_host:/remote/directory/ /local/directory/

# 使用特定SSH端口(如2222)
rsync -avz -e "ssh -p 2222" /local/ user@host:/remote/

# 使用SSH密钥认证(无需密码)
rsync -avz -e "ssh -i ~/.ssh/id_rsa" /local/ user@host:/remote/
远程镜像 同步远程服务器
# 备份远程服务器到本地
rsync -avz --delete user@server:/var/www/ /backup/server-www/

# 同步本地文件到多台服务器
rsync -avz /local/web/ user@server1:/var/www/
rsync -avz /local/web/ user@server2:/var/www/
rsync -avz /local/web/ user@server3:/var/www/

高级选项

排除文件 排除特定文件或目录
# 排除单个文件或目录
rsync -av --exclude='temp' /source/ /destination/
rsync -av --exclude='*.log' /source/ /destination/

# 排除多个文件
rsync -av --exclude='*.log' --exclude='*.tmp' /source/ /destination/

# 使用排除文件列表
rsync -av --exclude-from='/path/to/exclude-list.txt' /source/ /destination/

# 排除文件内容示例
echo "*.log" > exclude-list.txt
echo "*.tmp" >> exclude-list.txt
echo "temp/" >> exclude-list.txt
echo ".git/" >> exclude-list.txt
常用排除模式:
  • *.log - 所有.log文件
  • temp/ - temp目录(包括内容)
  • *.tmp - 所有临时文件
  • .git/ - Git版本控制目录
  • node_modules/ - Node.js模块目录
  • *.{jpg,png,gif} - 所有图片文件
权限管理 保持或修改文件权限
选项 说明 示例
--chmod 修改文件权限 --chmod=755
--chown 修改文件属主(需root) --chown=user:group
-A, --acls 保留ACL权限 -A
-X, --xattrs 保留扩展属性 -X
# 同步并设置权限为755
rsync -av --chmod=755 /source/ user@host:/destination/

# 同步并修改属主
sudo rsync -av --chown=www-data:www-data /source/ /var/www/

# 保留ACL和扩展属性
rsync -avAX /source/ /destination/

备份策略

增量备份和版本控制
#!/bin/bash
# 每日备份脚本示例
SOURCE="/home/user/documents"
BACKUP_DIR="/backup/daily"
DATE=$(date +%Y%m%d)

# 创建每日备份(硬链接到前一天,节省空间)
rsync -a --link-dest=${BACKUP_DIR}/latest/ \
      ${SOURCE}/ \
      ${BACKUP_DIR}/backup-${DATE}/

# 更新latest链接
rm -f ${BACKUP_DIR}/latest
ln -s backup-${DATE} ${BACKUP_DIR}/latest

# 删除7天前的备份
find ${BACKUP_DIR} -maxdepth 1 -type d -name 'backup-*' -mtime +7 -exec rm -rf {} \;
远程中转 服务器之间同步
# 通过本地中转同步两台远程服务器
rsync -avz user@server1:/source/ /tmp/cache/
rsync -avz /tmp/cache/ user@server2:/destination/

# 或者使用SSH隧道(效率更高)
rsync -avz -e ssh user@server1:/source/ user@server2:/destination/

# 使用rsync daemon模式(需要配置rsyncd.conf)
rsync -av data/ backup@backup-server::backup-module/

Rsync Daemon模式

Rsync服务端配置(/etc/rsyncd.conf)
# 全局配置
uid = nobody
gid = nobody
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# 模块配置
[backup]
    path = /data/backup
    comment = Backup Area
    read only = no
    list = yes
    auth users = backup_user
    secrets file = /etc/rsyncd.secrets

[web]
    path = /var/www/html
    comment = Web Files
    read only = yes
    list = yes

启动服务:rsync --daemon --config=/etc/rsyncd.conf

实用脚本示例

#!/bin/bash
# 网站备份脚本
SITE_DIR="/var/www/mywebsite"
BACKUP_DIR="/backup/website"
REMOTE_HOST="backup@backup-server"
REMOTE_DIR="/backup/"

# 1. 本地备份
rsync -av --delete ${SITE_DIR}/ ${BACKUP_DIR}/latest/

# 2. 压缩备份
tar -czf ${BACKUP_DIR}/website-$(date +%Y%m%d).tar.gz ${BACKUP_DIR}/latest/

# 3. 同步到远程
rsync -avz ${BACKUP_DIR}/ ${REMOTE_HOST}:${REMOTE_DIR}/

# 4. 发送通知
echo "Backup completed: $(date)" | mail -s "Backup Report" admin@example.com

故障排除

常见错误
# 权限不足
rsync: mkstemp failed: Permission denied

# 解决方案:
sudo rsync ...  # 使用sudo
或
rsync --no-perms ...  # 不保持权限
SSH连接问题
# SSH连接失败
ssh: connect to host xxx port 22: Connection refused

# 解决方案:
# 1. 检查SSH服务状态
# 2. 检查防火墙设置
# 3. 使用 -e "ssh -p PORT" 指定端口
性能优化
# 大文件传输慢
# 优化方案:
rsync -av --whole-file ...  # 禁用增量算法
rsync -av --no-whole-file ...  # 启用增量算法
rsync -av --compress ...  # 启用压缩
安全检查
# 确保传输前检查文件
rsync -av --dry-run source/ destination/
rsync -av --itemize-changes source/ destination/
rsync -av --checksum source/ destination/

工具对比

功能 rsync scp cp
增量同步 支持 不支持 不支持
权限保持 完整保持 部分保持 部分保持
远程同步 SSH或Daemon SSH 不支持
断点续传 支持 不支持 不支持
带宽控制 支持 不支持 不支持
适用场景 备份、同步、镜像 简单文件传输 本地文件复制
最佳实践
  • 同步前使用--dry-run参数测试命令
  • 使用--delete时要格外小心,确保有备份
  • 远程同步使用SSH密钥认证,避免密码输入
  • 大文件传输使用--partial支持断点续传
  • 定期使用--checksum进行完整性校验
  • 创建排除文件列表,避免同步不必要的文件