rsync是一个快速、多功能、安全的文件同步工具,它可以在本地或远程系统之间同步文件和目录,支持增量备份,只传输有变化的文件部分,大大提高了同步效率。
只传输有变化的文件部分,大大减少数据传输量
保留文件权限、时间戳、所有者等属性
支持本地到远程、远程到本地、远程到远程同步
sudo apt update
sudo apt install rsync
sudo yum install rsync
# 或
sudo dnf install rsync
# 已经内置
# 如需最新版本
brew install rsync
# 通过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/
# 本地同步到远程
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/
# 全局配置
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: 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时要格外小心,确保有备份--partial支持断点续传--checksum进行完整性校验