rsync
rsync
是一个强大的文件同步和备份工具,支持本地和远程文件同步,具有增量传输和断点续传功能。
基本语法
rsync [选项] 源路径 目标路径
rsync [选项] 源路径 用户@主机:目标路径
rsync [选项] 用户@主机:源路径 目标路径
常用选项
基本选项
-a
: 归档模式,等价于-rlptgoD-r
: 递归复制目录-l
: 复制符号链接-p
: 保留权限-t
: 保留时间戳-g
: 保留组-o
: 保留所有者-D
: 保留设备文件
传输选项
-v
: 显示详细信息-z
: 压缩传输-P
: 显示进度,等价于--partial --progress--progress
: 显示传输进度--partial
: 支持断点续传
控制选项
-n
或--dry-run
: 模拟运行,不实际执行--delete
: 删除目标目录中源目录没有的文件--exclude=PATTERN
: 排除匹配模式的文件--include=PATTERN
: 包含匹配模式的文件
基本用法
本地同步
# 同步目录
rsync -av /source/directory/ /destination/directory/
# 同步文件
rsync -av file1.txt file2.txt /destination/
# 显示进度
rsync -avP /source/ /destination/
# 模拟运行
rsync -avn /source/ /destination/
远程同步
# 推送到远程服务器
rsync -avz /local/data/ user@remote:/remote/data/
# 从远程服务器拉取
rsync -avz user@remote:/remote/data/ /local/data/
# 指定SSH端口
rsync -avz -e "ssh -p 2222" /local/data/ user@remote:/remote/data/
# 使用SSH密钥
rsync -avz -e "ssh -i ~/.ssh/id_rsa" /local/data/ user@remote:/remote/data/
高级功能
增量备份
# 基础备份
rsync -av /source/ /backup/full/
# 增量备份(硬链接)
rsync -av --link-dest=/backup/full/ /source/ /backup/incremental/
# 带时间戳的备份
DATE=$(date +%Y%m%d_%H%M%S)
rsync -av /source/ /backup/backup_$DATE/
排除和包含
# 排除特定文件类型
rsync -av --exclude='*.log' --exclude='*.tmp' /source/ /destination/
# 使用排除文件
rsync -av --exclude-from=exclude_list.txt /source/ /destination/
# 复杂的包含/排除规则
rsync -av \
--include='*.txt' \
--include='*/' \
--exclude='*' \
/source/ /destination/
删除策略
# 镜像同步(删除目标中多余的文件)
rsync -av --delete /source/ /destination/
# 删除前备份
rsync -av --delete --backup --backup-dir=/backup/deleted/ /source/ /destination/
# 在传输后删除
rsync -av --delete-after /source/ /destination/
实用脚本示例
自动备份脚本
#!/bin/bash
# 配置变量
SOURCE="/home/user/documents"
DESTINATION="/backup/documents"
LOG_FILE="/var/log/backup.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
# 执行备份
echo "[$DATE] 开始备份..." >> $LOG_FILE
rsync -av \
--delete \
--exclude='.cache/' \
--exclude='*.tmp' \
--log-file=$LOG_FILE \
$SOURCE/ $DESTINATION/
if [ $? -eq 0 ]; then
echo "[$DATE] 备份完成" >> $LOG_FILE
else
echo "[$DATE] 备份失败" >> $LOG_FILE
fi
网站同步脚本
#!/bin/bash
# 同步网站文件到多台服务器
SERVERS=("web1.example.com" "web2.example.com" "web3.example.com")
LOCAL_PATH="/var/www/html/"
REMOTE_PATH="/var/www/html/"
for server in "${SERVERS[@]}"; do
echo "同步到 $server..."
rsync -avz \
--delete \
--exclude='.git/' \
--exclude='logs/' \
$LOCAL_PATH root@$server:$REMOTE_PATH
done
性能优化
带宽限制
# 限制带宽为1000KB/s
rsync -av --bwlimit=1000 /source/ user@remote:/destination/
压缩等级
# 设置压缩等级(1-9)
rsync -av --compress-level=6 /source/ user@remote:/destination/
并发传输
# 使用多个SSH连接
rsync -av -e "ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p" \
/source/ user@remote:/destination/
监控和日志
详细日志
# 生成详细日志
rsync -av --log-file=/var/log/rsync.log --log-file-format="%t %f %b" \
/source/ /destination/
统计信息
# 显示传输统计
rsync -av --stats /source/ /destination/
# 只显示变化的文件
rsync -av --itemize-changes /source/ /destination/
常见问题和解决
权限问题
# 保持原有权限但忽略所有者
rsync -rlptgD --no-owner --no-group /source/ /destination/
# 使用超级用户权限
sudo rsync -av /source/ /destination/
网络问题
# 设置超时
rsync -av --timeout=30 /source/ user@remote:/destination/
# 重试机制
for i in {1..3}; do
rsync -av /source/ user@remote:/destination/ && break
sleep 5
done
相关工具
tar
- 归档工具scp
- 安全复制cp
- 本地复制rclone
- 云存储同步unison
- 双向同步工具
rsync是Linux系统中最重要的文件同步和备份工具,掌握其用法对系统管理员来说非常重要。